]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
scsi: target: Check enforce_pr_isids during registration
authorMike Christie <michael.christie@oracle.com>
Thu, 2 Jul 2020 01:43:17 +0000 (20:43 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 8 Jul 2020 04:14:21 +0000 (00:14 -0400)
Move the check for enforce_pr_isids to the registration code where we can
fail at the time an initiator tries to register a path without an isid. In
its current place in __core_scsi3_locate_pr_reg, it is too late because it
can be registered and be reported in PR in commands and it is stuck in this
state because we cannot unregister it.

[mkp: applied by hand]

Link: https://lore.kernel.org/r/1593654203-12442-2-git-send-email-michael.christie@oracle.com
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Lee Duncan <lduncan@suse.com>
Signed-off-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_pr.c

index 91e41cc55704d07e23fbcf67bc4f5e5bcfedaca6..507f1d5c5d6fca457c1cf51cb32d7a540c1e17d3 100644 (file)
@@ -1176,15 +1176,6 @@ static struct t10_pr_registration *__core_scsi3_locate_pr_reg(
                 * ISID, then we have found a match.
                 */
                if (!pr_reg->isid_present_at_reg) {
-                       /*
-                        * Determine if this SCSI device server requires that
-                        * SCSI Intiatior TransportID w/ ISIDs is enforced
-                        * for fabric modules (iSCSI) requiring them.
-                        */
-                       if (tpg->se_tpg_tfo->sess_get_initiator_sid != NULL) {
-                               if (dev->dev_attrib.enforce_pr_isids)
-                                       continue;
-                       }
                        atomic_inc_mb(&pr_reg->pr_res_holders);
                        spin_unlock(&pr_tmpl->registration_lock);
                        return pr_reg;
@@ -1591,10 +1582,25 @@ core_scsi3_decode_spec_i_port(
                                continue;
                        dest_rtpi = tmp_lun->lun_rtpi;
 
+                       iport_ptr = NULL;
                        i_str = target_parse_pr_out_transport_id(tmp_tpg,
                                        ptr, &tid_len, &iport_ptr);
                        if (!i_str)
                                continue;
+                       /*
+                        * Determine if this SCSI device server requires that
+                        * SCSI Intiatior TransportID w/ ISIDs is enforced
+                        * for fabric modules (iSCSI) requiring them.
+                        */
+                       if (tpg->se_tpg_tfo->sess_get_initiator_sid &&
+                           dev->dev_attrib.enforce_pr_isids &&
+                           !iport_ptr) {
+                               pr_warn("SPC-PR: enforce_pr_isids is set but a isid has not been sent in the SPEC_I_PT data for %s.",
+                                       i_str);
+                               ret = TCM_INVALID_PARAMETER_LIST;
+                               spin_unlock(&dev->se_port_lock);
+                               goto out_unmap;
+                       }
 
                        atomic_inc_mb(&tmp_tpg->tpg_pr_ref_count);
                        spin_unlock(&dev->se_port_lock);