scsi: target: core: New key must be used for moved PR
authorDmitry Bogdanov <d.bogdanov@yadro.com>
Fri, 9 Sep 2022 09:04:25 +0000 (12:04 +0300)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 1 Oct 2022 09:03:57 +0000 (05:03 -0400)
According to SPC4 5.12.8:

  e) Retain the reservation key specified in the SERVICE ACTION RESERVATION
  KEY field and associated information;

But currently sa_res_key is only used for the not existing I_T nexus. Add a
changing of the key for the existing I_T nexus the PR moved to.

Link: https://lore.kernel.org/r/20220909090425.14479-5-d.bogdanov@yadro.com
Reviewed-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_pr.c

index 6a5f9504a4811a2893ea12c52681bc518ce21561..1493b1d01194fc920a3eba5d1fb53acdf6a3b17f 100644 (file)
@@ -3440,8 +3440,6 @@ after_iport_check:
         *       transport protocols where port names are not required;
         * d) Register the reservation key specified in the SERVICE ACTION
         *    RESERVATION KEY field;
-        * e) Retain the reservation key specified in the SERVICE ACTION
-        *    RESERVATION KEY field and associated information;
         *
         * Also, It is not an error for a REGISTER AND MOVE service action to
         * register an I_T nexus that is already registered with the same
@@ -3463,6 +3461,12 @@ after_iport_check:
                dest_pr_reg = __core_scsi3_locate_pr_reg(dev, dest_node_acl,
                                                iport_ptr);
                new_reg = 1;
+       } else {
+               /*
+                * e) Retain the reservation key specified in the SERVICE ACTION
+                *    RESERVATION KEY field and associated information;
+                */
+               dest_pr_reg->pr_res_key = sa_res_key;
        }
        /*
         * f) Release the persistent reservation for the persistent reservation