scsi: target: Pass struct target_opcode_descriptor to enabled
authorMike Christie <michael.christie@oracle.com>
Fri, 7 Apr 2023 20:05:49 +0000 (15:05 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 12 Apr 2023 01:55:36 +0000 (21:55 -0400)
The iblock pr_ops support does not support commands that require port or
I_T Nexus info. This adds a struct target_opcode_descriptor as an argument
to the enabled callout so we can still have the common tcm_is_pr_enabled
and tcm_is_scsi2_reservations_enabled functions and also determine if the
command is supported based on the command and service action and device
settings.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
Link: https://lore.kernel.org/r/20230407200551.12660-17-michael.christie@oracle.com
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_spc.c
include/target/target_core_base.h

index 00d34616df5dfbd1f08efe43d522bd4c883fd506..caf8d1325007015eb0895c67e324216825032b43 100644 (file)
@@ -1429,7 +1429,8 @@ static struct target_opcode_descriptor tcm_opcode_write_verify16 = {
        .update_usage_bits = set_dpofua_usage_bits,
 };
 
-static bool tcm_is_ws_enabled(struct se_cmd *cmd)
+static bool tcm_is_ws_enabled(struct target_opcode_descriptor *descr,
+                             struct se_cmd *cmd)
 {
        struct exec_cmd_ops *ops = cmd->protocol_data;
        struct se_device *dev = cmd->se_dev;
@@ -1456,7 +1457,8 @@ static struct target_opcode_descriptor tcm_opcode_write_same32 = {
        .update_usage_bits = set_dpofua_usage_bits32,
 };
 
-static bool tcm_is_caw_enabled(struct se_cmd *cmd)
+static bool tcm_is_caw_enabled(struct target_opcode_descriptor *descr,
+                              struct se_cmd *cmd)
 {
        struct se_device *dev = cmd->se_dev;
 
@@ -1496,7 +1498,8 @@ static struct target_opcode_descriptor tcm_opcode_read_capacity16 = {
                       0xff, 0xff, 0x00, SCSI_CONTROL_MASK},
 };
 
-static bool tcm_is_rep_ref_enabled(struct se_cmd *cmd)
+static bool tcm_is_rep_ref_enabled(struct target_opcode_descriptor *descr,
+                                  struct se_cmd *cmd)
 {
        struct se_device *dev = cmd->se_dev;
 
@@ -1507,7 +1510,6 @@ static bool tcm_is_rep_ref_enabled(struct se_cmd *cmd)
        }
        spin_unlock(&dev->t10_alua.lba_map_lock);
        return true;
-
 }
 
 static struct target_opcode_descriptor tcm_opcode_read_report_refferals = {
@@ -1542,7 +1544,8 @@ static struct target_opcode_descriptor tcm_opcode_sync_cache16 = {
                       0xff, 0xff, SCSI_GROUP_NUMBER_MASK, SCSI_CONTROL_MASK},
 };
 
-static bool tcm_is_unmap_enabled(struct se_cmd *cmd)
+static bool tcm_is_unmap_enabled(struct target_opcode_descriptor *descr,
+                                struct se_cmd *cmd)
 {
        struct exec_cmd_ops *ops = cmd->protocol_data;
        struct se_device *dev = cmd->se_dev;
@@ -1664,7 +1667,8 @@ static struct target_opcode_descriptor tcm_opcode_pri_read_resrv = {
                       0xff, SCSI_CONTROL_MASK},
 };
 
-static bool tcm_is_pr_enabled(struct se_cmd *cmd)
+static bool tcm_is_pr_enabled(struct target_opcode_descriptor *descr,
+                             struct se_cmd *cmd)
 {
        struct se_device *dev = cmd->se_dev;
 
@@ -1793,7 +1797,9 @@ static struct target_opcode_descriptor tcm_opcode_pro_register_move = {
        .enabled = tcm_is_pr_enabled,
 };
 
-static bool tcm_is_scsi2_reservations_enabled(struct se_cmd *cmd)
+static bool
+tcm_is_scsi2_reservations_enabled(struct target_opcode_descriptor *descr,
+                                 struct se_cmd *cmd)
 {
        struct se_device *dev = cmd->se_dev;
 
@@ -1854,7 +1860,8 @@ static struct target_opcode_descriptor tcm_opcode_inquiry = {
                       0xff, SCSI_CONTROL_MASK},
 };
 
-static bool tcm_is_3pc_enabled(struct se_cmd *cmd)
+static bool tcm_is_3pc_enabled(struct target_opcode_descriptor *descr,
+                              struct se_cmd *cmd)
 {
        struct se_device *dev = cmd->se_dev;
 
@@ -1915,8 +1922,8 @@ static struct target_opcode_descriptor tcm_opcode_report_target_pgs = {
                       0xff, 0xff, 0x00, SCSI_CONTROL_MASK},
 };
 
-
-static bool spc_rsoc_enabled(struct se_cmd *cmd)
+static bool spc_rsoc_enabled(struct target_opcode_descriptor *descr,
+                            struct se_cmd *cmd)
 {
        struct se_device *dev = cmd->se_dev;
 
@@ -1936,7 +1943,8 @@ static struct target_opcode_descriptor tcm_opcode_report_supp_opcodes = {
        .enabled = spc_rsoc_enabled,
 };
 
-static bool tcm_is_set_tpg_enabled(struct se_cmd *cmd)
+static bool tcm_is_set_tpg_enabled(struct target_opcode_descriptor *descr,
+                                  struct se_cmd *cmd)
 {
        struct t10_alua_tg_pt_gp *l_tg_pt_gp;
        struct se_lun *l_lun = cmd->se_lun;
@@ -2123,7 +2131,7 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode)
                        if (descr->serv_action_valid)
                                return TCM_INVALID_CDB_FIELD;
 
-                       if (!descr->enabled || descr->enabled(cmd))
+                       if (!descr->enabled || descr->enabled(descr, cmd))
                                *opcode = descr;
                        break;
                case 0x2:
@@ -2137,7 +2145,8 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode)
                         */
                        if (descr->serv_action_valid &&
                            descr->service_action == requested_sa) {
-                               if (!descr->enabled || descr->enabled(cmd))
+                               if (!descr->enabled || descr->enabled(descr,
+                                                                     cmd))
                                        *opcode = descr;
                        } else if (!descr->serv_action_valid)
                                return TCM_INVALID_CDB_FIELD;
@@ -2150,7 +2159,8 @@ spc_rsoc_get_descr(struct se_cmd *cmd, struct target_opcode_descriptor **opcode)
                         * be returned in the one_command parameter data format.
                         */
                        if (descr->service_action == requested_sa)
-                               if (!descr->enabled || descr->enabled(cmd))
+                               if (!descr->enabled || descr->enabled(descr,
+                                                                     cmd))
                                        *opcode = descr;
                        break;
                }
@@ -2207,7 +2217,7 @@ spc_emulate_report_supp_op_codes(struct se_cmd *cmd)
 
                for (i = 0; i < ARRAY_SIZE(tcm_supported_opcodes); i++) {
                        descr = tcm_supported_opcodes[i];
-                       if (descr->enabled && !descr->enabled(cmd))
+                       if (descr->enabled && !descr->enabled(descr, cmd))
                                continue;
 
                        response_length += spc_rsoc_encode_command_descriptor(
index 12c9ba16217ef84818d207fdb94bce89f22ceb9b..04646b3dbf755a3eb5f216cf45793862d3020b91 100644 (file)
@@ -878,7 +878,8 @@ struct target_opcode_descriptor {
        u8                      specific_timeout;
        u16                     nominal_timeout;
        u16                     recommended_timeout;
-       bool                    (*enabled)(struct se_cmd *cmd);
+       bool                    (*enabled)(struct target_opcode_descriptor *descr,
+                                          struct se_cmd *cmd);
        void                    (*update_usage_bits)(u8 *usage_bits,
                                                     struct se_device *dev);
        u8                      usage_bits[];