The pr_ops don't support SCSI-2 RESERVE/RELEASE so fail them during
parsing.

Signed-off-by: Mike Christie <michael.chris...@oracle.com>
---
 drivers/target/target_core_spc.c | 25 +++++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c
index 7cca3b15472b..fb5febc437a0 100644
--- a/drivers/target/target_core_spc.c
+++ b/drivers/target/target_core_spc.c
@@ -1320,12 +1320,25 @@ spc_parse_cdb(struct se_cmd *cmd, unsigned int *size)
        struct se_device *dev = cmd->se_dev;
        unsigned char *cdb = cmd->t_task_cdb;
 
-       if (!dev->dev_attrib.emulate_pr &&
-           ((cdb[0] == PERSISTENT_RESERVE_IN) ||
-            (cdb[0] == PERSISTENT_RESERVE_OUT) ||
-            (cdb[0] == RELEASE || cdb[0] == RELEASE_10) ||
-            (cdb[0] == RESERVE || cdb[0] == RESERVE_10))) {
-               return TCM_UNSUPPORTED_SCSI_OPCODE;
+       switch (cdb[0]) {
+       case RESERVE:
+       case RESERVE_10:
+       case RELEASE:
+       case RELEASE_10:
+               if (!dev->dev_attrib.emulate_pr)
+                       return TCM_UNSUPPORTED_SCSI_OPCODE;
+               /*
+                * The block layer pr_ops don't support the old RESERVE/RELEASE
+                * commands.
+                */
+               if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
+                       return TCM_UNSUPPORTED_SCSI_OPCODE;
+               break;
+       case PERSISTENT_RESERVE_IN:
+       case PERSISTENT_RESERVE_OUT:
+               if (!dev->dev_attrib.emulate_pr)
+                       return TCM_UNSUPPORTED_SCSI_OPCODE;
+               break;
        }
 
        switch (cdb[0]) {
-- 
2.25.1

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to