mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
scsi: target: Pass struct target_opcode_descriptor to enabled
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>
This commit is contained in:
parent
53062ace0b
commit
d9b3275bdd
@ -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(
|
||||
|
@ -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[];
|
||||
|
Loading…
Reference in New Issue
Block a user