Commit fdf9d862 authored by Nicholas Bellinger's avatar Nicholas Bellinger Committed by Greg Kroah-Hartman

target: Add link_magic for fabric allow_link destination target_items

commit 0ff87549 upstream.

This patch adds [dev,lun]_link_magic value assignment + checks within generic
target_fabric_port_link() and target_fabric_mappedlun_link() code to ensure
destination config_item *target_item sent from configfs_symlink() ->
config_item_operations->allow_link() is the underlying se_device->dev_group
and se_lun->lun_group that we expect to symlink.
Reported-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: default avatarCAI Qian <caiqian@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ce6696bc
...@@ -1624,6 +1624,7 @@ int core_dev_setup_virtual_lun0(void) ...@@ -1624,6 +1624,7 @@ int core_dev_setup_virtual_lun0(void)
ret = PTR_ERR(dev); ret = PTR_ERR(dev);
goto out; goto out;
} }
dev->dev_link_magic = SE_DEV_LINK_MAGIC;
se_dev->se_dev_ptr = dev; se_dev->se_dev_ptr = dev;
g_lun0_dev = dev; g_lun0_dev = dev;
......
...@@ -71,6 +71,12 @@ static int target_fabric_mappedlun_link( ...@@ -71,6 +71,12 @@ static int target_fabric_mappedlun_link(
struct se_portal_group *se_tpg; struct se_portal_group *se_tpg;
struct config_item *nacl_ci, *tpg_ci, *tpg_ci_s, *wwn_ci, *wwn_ci_s; struct config_item *nacl_ci, *tpg_ci, *tpg_ci_s, *wwn_ci, *wwn_ci_s;
int ret = 0, lun_access; int ret = 0, lun_access;
if (lun->lun_link_magic != SE_LUN_LINK_MAGIC) {
pr_err("Bad lun->lun_link_magic, not a valid lun_ci pointer:"
" %p to struct lun: %p\n", lun_ci, lun);
return -EFAULT;
}
/* /*
* Ensure that the source port exists * Ensure that the source port exists
*/ */
...@@ -745,6 +751,12 @@ static int target_fabric_port_link( ...@@ -745,6 +751,12 @@ static int target_fabric_port_link(
struct target_fabric_configfs *tf; struct target_fabric_configfs *tf;
int ret; int ret;
if (dev->dev_link_magic != SE_DEV_LINK_MAGIC) {
pr_err("Bad dev->dev_link_magic, not a valid se_dev_ci pointer:"
" %p to struct se_device: %p\n", se_dev_ci, dev);
return -EFAULT;
}
tpg_ci = &lun_ci->ci_parent->ci_group->cg_item; tpg_ci = &lun_ci->ci_parent->ci_group->cg_item;
se_tpg = container_of(to_config_group(tpg_ci), se_tpg = container_of(to_config_group(tpg_ci),
struct se_portal_group, tpg_group); struct se_portal_group, tpg_group);
......
...@@ -672,6 +672,7 @@ int core_tpg_register( ...@@ -672,6 +672,7 @@ int core_tpg_register(
for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) { for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) {
lun = se_tpg->tpg_lun_list[i]; lun = se_tpg->tpg_lun_list[i];
lun->unpacked_lun = i; lun->unpacked_lun = i;
lun->lun_link_magic = SE_LUN_LINK_MAGIC;
lun->lun_status = TRANSPORT_LUN_STATUS_FREE; lun->lun_status = TRANSPORT_LUN_STATUS_FREE;
atomic_set(&lun->lun_acl_count, 0); atomic_set(&lun->lun_acl_count, 0);
init_completion(&lun->lun_shutdown_comp); init_completion(&lun->lun_shutdown_comp);
......
...@@ -1071,6 +1071,7 @@ struct se_device *transport_add_device_to_core_hba( ...@@ -1071,6 +1071,7 @@ struct se_device *transport_add_device_to_core_hba(
dev->se_hba = hba; dev->se_hba = hba;
dev->se_sub_dev = se_dev; dev->se_sub_dev = se_dev;
dev->transport = transport; dev->transport = transport;
dev->dev_link_magic = SE_DEV_LINK_MAGIC;
INIT_LIST_HEAD(&dev->dev_list); INIT_LIST_HEAD(&dev->dev_list);
INIT_LIST_HEAD(&dev->dev_sep_list); INIT_LIST_HEAD(&dev->dev_sep_list);
INIT_LIST_HEAD(&dev->dev_tmr_list); INIT_LIST_HEAD(&dev->dev_tmr_list);
......
...@@ -734,6 +734,8 @@ struct se_subsystem_dev { ...@@ -734,6 +734,8 @@ struct se_subsystem_dev {
}; };
struct se_device { struct se_device {
#define SE_DEV_LINK_MAGIC 0xfeeddeef
u32 dev_link_magic;
/* RELATIVE TARGET PORT IDENTIFER Counter */ /* RELATIVE TARGET PORT IDENTIFER Counter */
u16 dev_rpti_counter; u16 dev_rpti_counter;
/* Used for SAM Task Attribute ordering */ /* Used for SAM Task Attribute ordering */
...@@ -820,6 +822,8 @@ struct se_port_stat_grps { ...@@ -820,6 +822,8 @@ struct se_port_stat_grps {
}; };
struct se_lun { struct se_lun {
#define SE_LUN_LINK_MAGIC 0xffff7771
u32 lun_link_magic;
/* See transport_lun_status_table */ /* See transport_lun_status_table */
enum transport_lun_status_table lun_status; enum transport_lun_status_table lun_status;
u32 lun_access; u32 lun_access;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment