OSDN Git Service

scsi: target/core: Rework the SPC-2 reservation handling code
authorBart Van Assche <bvanassche@acm.org>
Tue, 2 Apr 2019 19:58:06 +0000 (12:58 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 13 Apr 2019 00:20:05 +0000 (20:20 -0400)
Instead of tracking the initiator that established an SPC-2 reservation,
track the session through which the SPC-2 reservation has been
established. This patch does not change any functionality.

Cc: Mike Christie <mchristi@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_configfs.c
drivers/target/target_core_pr.c
drivers/target/target_core_pr.h
drivers/target/target_core_tmr.c
include/target/target_core_base.h
include/target/target_core_fabric.h

index 3fe7987..db2558f 100644 (file)
@@ -1624,11 +1624,12 @@ static ssize_t target_core_dev_pr_show_spc3_res(struct se_device *dev,
 static ssize_t target_core_dev_pr_show_spc2_res(struct se_device *dev,
                char *page)
 {
+       struct se_session *sess = dev->reservation_holder;
        struct se_node_acl *se_nacl;
        ssize_t len;
 
-       se_nacl = dev->dev_reserved_node_acl;
-       if (se_nacl) {
+       if (sess) {
+               se_nacl = sess->se_node_acl;
                len = sprintf(page,
                              "SPC-2 Reservation: %s Initiator: %s\n",
                              se_nacl->se_tpg->se_tpg_tfo->fabric_name,
index 1597a9e..0376769 100644 (file)
@@ -111,10 +111,10 @@ target_scsi2_reservation_check(struct se_cmd *cmd)
                break;
        }
 
-       if (!dev->dev_reserved_node_acl || !sess)
+       if (!dev->reservation_holder || !sess)
                return 0;
 
-       if (dev->dev_reserved_node_acl != sess->se_node_acl)
+       if (dev->reservation_holder->se_node_acl != sess->se_node_acl)
                return TCM_RESERVATION_CONFLICT;
 
        if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS_WITH_ISID) {
@@ -200,6 +200,16 @@ static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd)
        return 0;
 }
 
+void target_release_reservation(struct se_device *dev)
+{
+       dev->reservation_holder = NULL;
+       dev->dev_reservation_flags &= ~DRF_SPC2_RESERVATIONS;
+       if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS_WITH_ISID) {
+               dev->dev_res_bin_isid = 0;
+               dev->dev_reservation_flags &= ~DRF_SPC2_RESERVATIONS_WITH_ISID;
+       }
+}
+
 sense_reason_t
 target_scsi2_reservation_release(struct se_cmd *cmd)
 {
@@ -217,21 +227,16 @@ target_scsi2_reservation_release(struct se_cmd *cmd)
                return TCM_RESERVATION_CONFLICT;
 
        spin_lock(&dev->dev_reservation_lock);
-       if (!dev->dev_reserved_node_acl || !sess)
+       if (!dev->reservation_holder || !sess)
                goto out_unlock;
 
-       if (dev->dev_reserved_node_acl != sess->se_node_acl)
+       if (dev->reservation_holder->se_node_acl != sess->se_node_acl)
                goto out_unlock;
 
        if (dev->dev_res_bin_isid != sess->sess_bin_isid)
                goto out_unlock;
 
-       dev->dev_reserved_node_acl = NULL;
-       dev->dev_reservation_flags &= ~DRF_SPC2_RESERVATIONS;
-       if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS_WITH_ISID) {
-               dev->dev_res_bin_isid = 0;
-               dev->dev_reservation_flags &= ~DRF_SPC2_RESERVATIONS_WITH_ISID;
-       }
+       target_release_reservation(dev);
        tpg = sess->se_tpg;
        pr_debug("SCSI-2 Released reservation for %s LUN: %llu ->"
                " MAPPED LUN: %llu for %s\n",
@@ -275,13 +280,13 @@ target_scsi2_reservation_reserve(struct se_cmd *cmd)
 
        tpg = sess->se_tpg;
        spin_lock(&dev->dev_reservation_lock);
-       if (dev->dev_reserved_node_acl &&
-          (dev->dev_reserved_node_acl != sess->se_node_acl)) {
+       if (dev->reservation_holder &&
+           dev->reservation_holder->se_node_acl != sess->se_node_acl) {
                pr_err("SCSI-2 RESERVATION CONFLIFT for %s fabric\n",
                        tpg->se_tpg_tfo->fabric_name);
                pr_err("Original reserver LUN: %llu %s\n",
                        cmd->se_lun->unpacked_lun,
-                       dev->dev_reserved_node_acl->initiatorname);
+                       dev->reservation_holder->se_node_acl->initiatorname);
                pr_err("Current attempt - LUN: %llu -> MAPPED LUN: %llu"
                        " from %s \n", cmd->se_lun->unpacked_lun,
                        cmd->orig_fe_lun,
@@ -290,7 +295,7 @@ target_scsi2_reservation_reserve(struct se_cmd *cmd)
                goto out_unlock;
        }
 
-       dev->dev_reserved_node_acl = sess->se_node_acl;
+       dev->reservation_holder = sess;
        dev->dev_reservation_flags |= DRF_SPC2_RESERVATIONS;
        if (sess->sess_bin_isid != 0) {
                dev->dev_res_bin_isid = sess->sess_bin_isid;
index 198fad5..a31c93e 100644 (file)
@@ -58,6 +58,7 @@ extern struct kmem_cache *t10_pr_reg_cache;
 
 extern void core_pr_dump_initiator_port(struct t10_pr_registration *,
                        char *, u32);
+extern void target_release_reservation(struct se_device *dev);
 extern sense_reason_t target_scsi2_reservation_release(struct se_cmd *);
 extern sense_reason_t target_scsi2_reservation_reserve(struct se_cmd *);
 extern int core_scsi3_alloc_aptpl_registration(
index 3a1bb79..344df73 100644 (file)
@@ -390,7 +390,7 @@ int core_tmr_lun_reset(
        if (!preempt_and_abort_list &&
             (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)) {
                spin_lock(&dev->dev_reservation_lock);
-               dev->dev_reserved_node_acl = NULL;
+               dev->reservation_holder = NULL;
                dev->dev_reservation_flags &= ~DRF_SPC2_RESERVATIONS;
                spin_unlock(&dev->dev_reservation_lock);
                pr_debug("LUN_RESET: SCSI-2 Released reservation\n");
index 19a5bf4..7c9716f 100644 (file)
@@ -795,8 +795,8 @@ struct se_device {
        spinlock_t              se_tmr_lock;
        spinlock_t              qf_cmd_lock;
        struct semaphore        caw_sem;
-       /* Used for legacy SPC-2 reservationsa */
-       struct se_node_acl      *dev_reserved_node_acl;
+       /* Used for legacy SPC-2 reservations */
+       struct se_session       *reservation_holder;
        /* Used for ALUA Logical Unit Group membership */
        struct t10_alua_lu_gp_member *dev_alua_lu_gp_mem;
        /* Used for SPC-3 Persistent Reservations */
index 8ed9040..063f133 100644 (file)
@@ -142,6 +142,7 @@ void        transport_register_session(struct se_portal_group *,
                struct se_node_acl *, struct se_session *, void *);
 ssize_t        target_show_dynamic_sessions(struct se_portal_group *, char *);
 void   transport_free_session(struct se_session *);
+void   target_spc2_release(struct se_node_acl *nacl);
 void   target_put_nacl(struct se_node_acl *);
 void   transport_deregister_session_configfs(struct se_session *);
 void   transport_deregister_session(struct se_session *);