Skip to content

Commit

Permalink
scsi: target: use an enum to track emulate_ua_intlck_ctrl
Browse files Browse the repository at this point in the history
The emulate_ua_intlck_ctrl device attribute accepts values of 0, 1 or 2 via
ConfigFS, which map to unit attention interlocks control codes in the MODE
SENSE control Mode Page.  Use an enum to track these values so that it's
clear that, unlike the remaining emulate_X attributes,
emulate_ua_intlck_ctrl isn't boolean.

Link: https://marc.info/?l=target-devel&m=158227825428798
Suggested-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: David Disseldorp <ddiss@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
ddiss authored and martinkpetersen committed Feb 21, 2020
1 parent 87310c9 commit 1bf630f
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 11 deletions.
4 changes: 3 additions & 1 deletion drivers/target/target_core_configfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -684,7 +684,9 @@ static ssize_t emulate_ua_intlck_ctrl_store(struct config_item *item,
if (ret < 0)
return ret;

if (val != 0 && val != 1 && val != 2) {
if (val != TARGET_UA_INTLCK_CTRL_CLEAR
&& val != TARGET_UA_INTLCK_CTRL_NO_CLEAR
&& val != TARGET_UA_INTLCK_CTRL_ESTABLISH_UA) {
pr_err("Illegal value %d\n", val);
return -EINVAL;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/target/target_core_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,7 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)
dev->dev_attrib.emulate_fua_write = 1;
dev->dev_attrib.emulate_fua_read = 1;
dev->dev_attrib.emulate_write_cache = DA_EMULATE_WRITE_CACHE;
dev->dev_attrib.emulate_ua_intlck_ctrl = DA_EMULATE_UA_INTLLCK_CTRL;
dev->dev_attrib.emulate_ua_intlck_ctrl = TARGET_UA_INTLCK_CTRL_CLEAR;
dev->dev_attrib.emulate_tas = DA_EMULATE_TAS;
dev->dev_attrib.emulate_tpu = DA_EMULATE_TPU;
dev->dev_attrib.emulate_tpws = DA_EMULATE_TPWS;
Expand Down
13 changes: 11 additions & 2 deletions drivers/target/target_core_spc.c
Original file line number Diff line number Diff line change
Expand Up @@ -847,8 +847,17 @@ static int spc_modesense_control(struct se_cmd *cmd, u8 pc, u8 *p)
* for a BUSY, TASK SET FULL, or RESERVATION CONFLICT status regardless
* to the number of commands completed with one of those status codes.
*/
p[4] = (dev->dev_attrib.emulate_ua_intlck_ctrl == 2) ? 0x30 :
(dev->dev_attrib.emulate_ua_intlck_ctrl == 1) ? 0x20 : 0x00;
switch (dev->dev_attrib.emulate_ua_intlck_ctrl) {
case TARGET_UA_INTLCK_CTRL_ESTABLISH_UA:
p[4] = 0x30;
break;
case TARGET_UA_INTLCK_CTRL_NO_CLEAR:
p[4] = 0x20;
break;
default: /* TARGET_UA_INTLCK_CTRL_CLEAR */
p[4] = 0x00;
break;
}
/*
* From spc4r17, section 7.4.6 Control mode Page
*
Expand Down
3 changes: 2 additions & 1 deletion drivers/target/target_core_transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -1879,7 +1879,8 @@ void transport_generic_request_failure(struct se_cmd *cmd,
* See spc4r17, section 7.4.6 Control Mode Page, Table 349
*/
if (cmd->se_sess &&
cmd->se_dev->dev_attrib.emulate_ua_intlck_ctrl == 2) {
cmd->se_dev->dev_attrib.emulate_ua_intlck_ctrl
== TARGET_UA_INTLCK_CTRL_ESTABLISH_UA) {
target_ua_allocate_lun(cmd->se_sess->se_node_acl,
cmd->orig_fe_lun, 0x2C,
ASCQ_2CH_PREVIOUS_RESERVATION_CONFLICT_STATUS);
Expand Down
8 changes: 5 additions & 3 deletions drivers/target/target_core_ua.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,8 @@ bool core_scsi3_ua_for_check_condition(struct se_cmd *cmd, u8 *key, u8 *asc,
struct se_node_acl *nacl;
struct se_ua *ua = NULL, *ua_p;
int head = 1;
bool dev_ua_intlck_clear = (dev->dev_attrib.emulate_ua_intlck_ctrl
== TARGET_UA_INTLCK_CTRL_CLEAR);

if (WARN_ON_ONCE(!sess))
return false;
Expand Down Expand Up @@ -229,7 +231,7 @@ bool core_scsi3_ua_for_check_condition(struct se_cmd *cmd, u8 *key, u8 *asc,
* highest priority UNIT_ATTENTION and ASC/ASCQ without
* clearing it.
*/
if (dev->dev_attrib.emulate_ua_intlck_ctrl != 0) {
if (!dev_ua_intlck_clear) {
*asc = ua->ua_asc;
*ascq = ua->ua_ascq;
break;
Expand All @@ -254,8 +256,8 @@ bool core_scsi3_ua_for_check_condition(struct se_cmd *cmd, u8 *key, u8 *asc,
" INTLCK_CTRL: %d, mapped LUN: %llu, got CDB: 0x%02x"
" reported ASC: 0x%02x, ASCQ: 0x%02x\n",
nacl->se_tpg->se_tpg_tfo->fabric_name,
(dev->dev_attrib.emulate_ua_intlck_ctrl != 0) ? "Reporting" :
"Releasing", dev->dev_attrib.emulate_ua_intlck_ctrl,
dev_ua_intlck_clear ? "Releasing" : "Reporting",
dev->dev_attrib.emulate_ua_intlck_ctrl,
cmd->orig_fe_lun, cmd->t_task_cdb[0], *asc, *ascq);

return head == 0;
Expand Down
11 changes: 8 additions & 3 deletions include/target/target_core_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,6 @@
#define DA_EMULATE_MODEL_ALIAS 0
/* Emulation for WriteCache and SYNCHRONIZE_CACHE */
#define DA_EMULATE_WRITE_CACHE 0
/* Emulation for UNIT ATTENTION Interlock Control */
#define DA_EMULATE_UA_INTLLCK_CTRL 0
/* Emulation for TASK_ABORTED status (TAS) by default */
#define DA_EMULATE_TAS 1
/* Emulation for Thin Provisioning UNMAP using block/blk-lib.c:blkdev_issue_discard() */
Expand Down Expand Up @@ -433,6 +431,13 @@ enum target_prot_type {
TARGET_DIF_TYPE3_PROT,
};

/* Emulation for UNIT ATTENTION Interlock Control */
enum target_ua_intlck_ctrl {
TARGET_UA_INTLCK_CTRL_CLEAR = 0,
TARGET_UA_INTLCK_CTRL_NO_CLEAR = 1,
TARGET_UA_INTLCK_CTRL_ESTABLISH_UA = 2,
};

enum target_core_dif_check {
TARGET_DIF_CHECK_GUARD = 0x1 << 0,
TARGET_DIF_CHECK_APPTAG = 0x1 << 1,
Expand Down Expand Up @@ -668,7 +673,7 @@ struct se_dev_attrib {
bool emulate_fua_write;
bool emulate_fua_read; /* deprecated */
bool emulate_write_cache;
int emulate_ua_intlck_ctrl;
enum target_ua_intlck_ctrl emulate_ua_intlck_ctrl;
bool emulate_tas;
bool emulate_tpu;
bool emulate_tpws;
Expand Down

0 comments on commit 1bf630f

Please sign in to comment.