target: Send UA when changing LUN inventory
authorHannes Reinecke <hare@suse.de>
Thu, 11 Jun 2015 08:01:29 +0000 (10:01 +0200)
committerNicholas Bellinger <nab@linux-iscsi.org>
Tue, 23 Jun 2015 07:43:02 +0000 (00:43 -0700)
When changind the LUN inventory via core_enable_device_list_for_node()
or core_disable_device_list_for_node() a REPORTED LUNS DATA HAS CHANGED
UA should be send.

(Convert to target_luns_data_has_changed helper usage - hch)

Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/target/target_core_device.c
drivers/target/target_core_ua.h

index b6df5b9a68909bac8ee2404e972604816b436fb5..52448483ed9b2d9272a1733423b4d146662e0012 100644 (file)
@@ -293,10 +293,22 @@ void target_pr_kref_release(struct kref *kref)
        complete(&deve->pr_comp);
 }
 
-/*      core_enable_device_list_for_node():
- *
- *
- */
+static void
+target_luns_data_has_changed(struct se_node_acl *nacl, struct se_dev_entry *new,
+                            bool skip_new)
+{
+       struct se_dev_entry *tmp;
+
+       rcu_read_lock();
+       hlist_for_each_entry_rcu(tmp, &nacl->lun_entry_hlist, link) {
+               if (skip_new && tmp == new)
+                       continue;
+               core_scsi3_ua_allocate(tmp, 0x3F,
+                                      ASCQ_3FH_REPORTED_LUNS_DATA_HAS_CHANGED);
+       }
+       rcu_read_unlock();
+}
+
 int core_enable_device_list_for_node(
        struct se_lun *lun,
        struct se_lun_acl *lun_acl,
@@ -360,6 +372,7 @@ int core_enable_device_list_for_node(
                kref_put(&orig->pr_kref, target_pr_kref_release);
                wait_for_completion(&orig->pr_comp);
 
+               target_luns_data_has_changed(nacl, new, true);
                kfree_rcu(orig, rcu_head);
                return 0;
        }
@@ -373,6 +386,7 @@ int core_enable_device_list_for_node(
        list_add_tail(&new->lun_link, &lun->lun_deve_list);
        spin_unlock(&lun->lun_deve_lock);
 
+       target_luns_data_has_changed(nacl, new, true);
        return 0;
 }
 
@@ -428,6 +442,7 @@ void core_disable_device_list_for_node(
        kfree_rcu(orig, rcu_head);
 
        core_scsi3_free_pr_reg_from_nacl(dev, nacl);
+       target_luns_data_has_changed(nacl, NULL, false);
 }
 
 /*      core_clear_lun_from_tpg():
index 59278d662e665fbc11f82c9d8177cc690aed937a..bd6e78ba153d68bd37b784ba7ebd52290932906c 100644 (file)
@@ -26,6 +26,7 @@
 #define ASCQ_2CH_PREVIOUS_RESERVATION_CONFLICT_STATUS          0x09
 
 #define ASCQ_3FH_INQUIRY_DATA_HAS_CHANGED                      0x03
+#define ASCQ_3FH_REPORTED_LUNS_DATA_HAS_CHANGED                        0x0E
 
 extern struct kmem_cache *se_ua_cache;