]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
target: Add link_magic for fabric allow_link destination target_items
authorNicholas Bellinger <nab@linux-iscsi.org>
Wed, 5 Dec 2012 07:43:57 +0000 (23:43 -0800)
committerNicholas Bellinger <nab@linux-iscsi.org>
Wed, 5 Dec 2012 08:11:36 +0000 (00:11 -0800)
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: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: stable@vger.kernel.org
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/target/target_core_device.c
drivers/target/target_core_fabric_configfs.c
drivers/target/target_core_tpg.c
include/target/target_core_base.h

index 3f604393d89c376cb7754071946bd00dd95c0936..e2695101bb9911f1d02ba03217a3b0f059fbf0ac 100644 (file)
@@ -1352,6 +1352,7 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)
        if (!dev)
                return NULL;
 
+       dev->dev_link_magic = SE_DEV_LINK_MAGIC;
        dev->se_hba = hba;
        dev->transport = hba->transport;
 
index 9c6791734ee8d704a07bf4ba9f86de3912573a83..810263dfa4a1d9d272e16a492c5fb44365967a6c 100644 (file)
@@ -70,6 +70,12 @@ static int target_fabric_mappedlun_link(
        struct se_portal_group *se_tpg;
        struct config_item *nacl_ci, *tpg_ci, *tpg_ci_s, *wwn_ci, *wwn_ci_s;
        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
         */
@@ -742,6 +748,12 @@ static int target_fabric_port_link(
        struct target_fabric_configfs *tf;
        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;
        se_tpg = container_of(to_config_group(tpg_ci),
                                struct se_portal_group, tpg_group);
index d84cc0a8739ed2a55691d78f8e57f8237f443975..0163309e2aba811d0a1e6e241f616aef6568d7f6 100644 (file)
@@ -669,6 +669,7 @@ int core_tpg_register(
        for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) {
                lun = se_tpg->tpg_lun_list[i];
                lun->unpacked_lun = i;
+               lun->lun_link_magic = SE_LUN_LINK_MAGIC;
                lun->lun_status = TRANSPORT_LUN_STATUS_FREE;
                atomic_set(&lun->lun_acl_count, 0);
                init_completion(&lun->lun_shutdown_comp);
index 645d90ac6097785bfa46e086fa99d9ac4f1b5c13..1346ee04db5ef178456274c4a3734b973f0c4d7c 100644 (file)
@@ -624,6 +624,8 @@ struct se_dev_stat_grps {
 };
 
 struct se_device {
+#define SE_DEV_LINK_MAGIC                      0xfeeddeef
+       u32                     dev_link_magic;
        /* RELATIVE TARGET PORT IDENTIFER Counter */
        u16                     dev_rpti_counter;
        /* Used for SAM Task Attribute ordering */
@@ -722,6 +724,8 @@ struct se_port_stat_grps {
 };
 
 struct se_lun {
+#define SE_LUN_LINK_MAGIC                      0xffff7771
+       u32                     lun_link_magic;
        /* See transport_lun_status_table */
        enum transport_lun_status_table lun_status;
        u32                     lun_access;