Hi, I am unsure if this is the right back-port patch but it is applied and built
fine on both the 3.7.x and 3.4.x stable (looks like the 3.0.x needs something 
else).
The patch is under some HBA regression testing at the moment. Once it passed, 
I'll
post it formally here, but feel free to review it (below) now. The change here 
is
only in the first hunk due to target_alloc_device() is not present in the code 
base
here, so make change in core_dev_setup_virtual_lun0() directly.

Regards,
CAI Qian

diff --git a/drivers/target/target_core_device.c 
b/drivers/target/target_core_device.c
index 9abef9f..0943ff0 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -1624,6 +1624,7 @@ int core_dev_setup_virtual_lun0(void)
                ret = PTR_ERR(dev);
                goto out;
        }
+       dev->dev_link_magic = SE_DEV_LINK_MAGIC;
        se_dev->se_dev_ptr = dev;
        g_lun0_dev = dev;
 
diff --git a/drivers/target/target_core_fabric_configfs.c 
b/drivers/target/target_core_fabric_configfs.c
index bca737b..a55f91a 100644
--- a/drivers/target/target_core_fabric_configfs.c
+++ b/drivers/target/target_core_fabric_configfs.c
@@ -71,6 +71,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
         */
@@ -745,6 +751,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);
diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c
index a531fe2..4c34665 100644
--- a/drivers/target/target_core_tpg.c
+++ b/drivers/target/target_core_tpg.c
@@ -672,6 +672,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);
diff --git a/include/target/target_core_base.h 
b/include/target/target_core_base.h
index 5be8937..fca8bbe 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -734,6 +734,8 @@ struct se_subsystem_dev {
 };
 
 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 */
@@ -820,6 +822,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;

----- Original Message -----
> From: [email protected]
> To: [email protected], [email protected]
> Cc: [email protected]
> Sent: Tuesday, January 15, 2013 1:24:22 AM
> Subject: FAILED: patch "[PATCH] target: Add link_magic for fabric allow_link 
> destination" failed to apply to
> 3.7-stable tree
> 
> 
> The patch below does not apply to the 3.7-stable tree.
> If someone wants it applied there, or to any other stable or longterm
> tree, then please email the backport, including the original git
> commit
> id to <[email protected]>.
> 
> thanks,
> 
> greg k-h
> 
> ------------------ original commit in Linus's tree ------------------
> 
> From 0ff8754981261a80f4b77db2536dfea92c2d4539 Mon Sep 17 00:00:00
> 2001
> From: Nicholas Bellinger <[email protected]>
> Date: Tue, 4 Dec 2012 23:43:57 -0800
> Subject: [PATCH] target: Add link_magic for fabric allow_link
> destination
>  target_items
> 
> 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 <[email protected]>
> Cc: Sebastian Andrzej Siewior <[email protected]>
> Cc: [email protected]
> Signed-off-by: Nicholas Bellinger <[email protected]>
> 
> diff --git a/drivers/target/target_core_device.c
> b/drivers/target/target_core_device.c
> index 3f60439..e269510 100644
> --- a/drivers/target/target_core_device.c
> +++ b/drivers/target/target_core_device.c
> @@ -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;
>  
> diff --git a/drivers/target/target_core_fabric_configfs.c
> b/drivers/target/target_core_fabric_configfs.c
> index 9c67917..810263d 100644
> --- a/drivers/target/target_core_fabric_configfs.c
> +++ b/drivers/target/target_core_fabric_configfs.c
> @@ -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);
> diff --git a/drivers/target/target_core_tpg.c
> b/drivers/target/target_core_tpg.c
> index d84cc0a..0163309 100644
> --- a/drivers/target/target_core_tpg.c
> +++ b/drivers/target/target_core_tpg.c
> @@ -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);
> diff --git a/include/target/target_core_base.h
> b/include/target/target_core_base.h
> index 645d90a..1346ee0 100644
> --- a/include/target/target_core_base.h
> +++ b/include/target/target_core_base.h
> @@ -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;
> 
> --
> To unsubscribe from this list: send the line "unsubscribe stable" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to