Commit 1e3ab99d authored by Paul Bolle's avatar Paul Bolle Committed by Nicholas Bellinger

target: silence GCC warning in target_alua_state_check

Building target_core_alua.o triggers a GCC warning:
    drivers/target/target_core_alua.c: In function ‘target_alua_state_check’:
    drivers/target/target_core_alua.c:773:18: warning: ‘alua_ascq’ may be used uninitialized in this function [-Wmaybe-uninitialized]
       cmd->scsi_ascq = alua_ascq;
                      ^

This is a false positive. A little trial and error shows it is
apparently caused by core_alua_state_lba_dependent(). It must be hard
for GCC to track the branches of a switch statement, inside a
list_for_each_entry loop, inside a while loop.

But if we add a small (inline) helper function we can reorganize the
code a bit. That also allows to drop alua_ascq which, obviously, gets
rid of this warning.
Signed-off-by: default avatarPaul Bolle <pebolle@tiscali.nl>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 5aad2145
...@@ -455,11 +455,26 @@ target_emulate_set_target_port_groups(struct se_cmd *cmd) ...@@ -455,11 +455,26 @@ target_emulate_set_target_port_groups(struct se_cmd *cmd)
return rc; return rc;
} }
static inline int core_alua_state_nonoptimized( static inline void set_ascq(struct se_cmd *cmd, u8 alua_ascq)
{
/*
* Set SCSI additional sense code (ASC) to 'LUN Not Accessible';
* The ALUA additional sense code qualifier (ASCQ) is determined
* by the ALUA primary or secondary access state..
*/
pr_debug("[%s]: ALUA TG Port not available, "
"SenseKey: NOT_READY, ASC/ASCQ: "
"0x04/0x%02x\n",
cmd->se_tfo->get_fabric_name(), alua_ascq);
cmd->scsi_asc = 0x04;
cmd->scsi_ascq = alua_ascq;
}
static inline void core_alua_state_nonoptimized(
struct se_cmd *cmd, struct se_cmd *cmd,
unsigned char *cdb, unsigned char *cdb,
int nonop_delay_msecs, int nonop_delay_msecs)
u8 *alua_ascq)
{ {
/* /*
* Set SCF_ALUA_NON_OPTIMIZED here, this value will be checked * Set SCF_ALUA_NON_OPTIMIZED here, this value will be checked
...@@ -468,13 +483,11 @@ static inline int core_alua_state_nonoptimized( ...@@ -468,13 +483,11 @@ static inline int core_alua_state_nonoptimized(
*/ */
cmd->se_cmd_flags |= SCF_ALUA_NON_OPTIMIZED; cmd->se_cmd_flags |= SCF_ALUA_NON_OPTIMIZED;
cmd->alua_nonop_delay = nonop_delay_msecs; cmd->alua_nonop_delay = nonop_delay_msecs;
return 0;
} }
static inline int core_alua_state_lba_dependent( static inline int core_alua_state_lba_dependent(
struct se_cmd *cmd, struct se_cmd *cmd,
struct t10_alua_tg_pt_gp *tg_pt_gp, struct t10_alua_tg_pt_gp *tg_pt_gp)
u8 *alua_ascq)
{ {
struct se_device *dev = cmd->se_dev; struct se_device *dev = cmd->se_dev;
u64 segment_size, segment_mult, sectors, lba; u64 segment_size, segment_mult, sectors, lba;
...@@ -520,7 +533,7 @@ static inline int core_alua_state_lba_dependent( ...@@ -520,7 +533,7 @@ static inline int core_alua_state_lba_dependent(
} }
if (!cur_map) { if (!cur_map) {
spin_unlock(&dev->t10_alua.lba_map_lock); spin_unlock(&dev->t10_alua.lba_map_lock);
*alua_ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE; set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
return 1; return 1;
} }
list_for_each_entry(map_mem, &cur_map->lba_map_mem_list, list_for_each_entry(map_mem, &cur_map->lba_map_mem_list,
...@@ -531,11 +544,11 @@ static inline int core_alua_state_lba_dependent( ...@@ -531,11 +544,11 @@ static inline int core_alua_state_lba_dependent(
switch(map_mem->lba_map_mem_alua_state) { switch(map_mem->lba_map_mem_alua_state) {
case ALUA_ACCESS_STATE_STANDBY: case ALUA_ACCESS_STATE_STANDBY:
spin_unlock(&dev->t10_alua.lba_map_lock); spin_unlock(&dev->t10_alua.lba_map_lock);
*alua_ascq = ASCQ_04H_ALUA_TG_PT_STANDBY; set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
return 1; return 1;
case ALUA_ACCESS_STATE_UNAVAILABLE: case ALUA_ACCESS_STATE_UNAVAILABLE:
spin_unlock(&dev->t10_alua.lba_map_lock); spin_unlock(&dev->t10_alua.lba_map_lock);
*alua_ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE; set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
return 1; return 1;
default: default:
break; break;
...@@ -548,8 +561,7 @@ static inline int core_alua_state_lba_dependent( ...@@ -548,8 +561,7 @@ static inline int core_alua_state_lba_dependent(
static inline int core_alua_state_standby( static inline int core_alua_state_standby(
struct se_cmd *cmd, struct se_cmd *cmd,
unsigned char *cdb, unsigned char *cdb)
u8 *alua_ascq)
{ {
/* /*
* Allowed CDBs for ALUA_ACCESS_STATE_STANDBY as defined by * Allowed CDBs for ALUA_ACCESS_STATE_STANDBY as defined by
...@@ -570,7 +582,7 @@ static inline int core_alua_state_standby( ...@@ -570,7 +582,7 @@ static inline int core_alua_state_standby(
case MI_REPORT_TARGET_PGS: case MI_REPORT_TARGET_PGS:
return 0; return 0;
default: default:
*alua_ascq = ASCQ_04H_ALUA_TG_PT_STANDBY; set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
return 1; return 1;
} }
case MAINTENANCE_OUT: case MAINTENANCE_OUT:
...@@ -578,7 +590,7 @@ static inline int core_alua_state_standby( ...@@ -578,7 +590,7 @@ static inline int core_alua_state_standby(
case MO_SET_TARGET_PGS: case MO_SET_TARGET_PGS:
return 0; return 0;
default: default:
*alua_ascq = ASCQ_04H_ALUA_TG_PT_STANDBY; set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
return 1; return 1;
} }
case REQUEST_SENSE: case REQUEST_SENSE:
...@@ -588,7 +600,7 @@ static inline int core_alua_state_standby( ...@@ -588,7 +600,7 @@ static inline int core_alua_state_standby(
case WRITE_BUFFER: case WRITE_BUFFER:
return 0; return 0;
default: default:
*alua_ascq = ASCQ_04H_ALUA_TG_PT_STANDBY; set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
return 1; return 1;
} }
...@@ -597,8 +609,7 @@ static inline int core_alua_state_standby( ...@@ -597,8 +609,7 @@ static inline int core_alua_state_standby(
static inline int core_alua_state_unavailable( static inline int core_alua_state_unavailable(
struct se_cmd *cmd, struct se_cmd *cmd,
unsigned char *cdb, unsigned char *cdb)
u8 *alua_ascq)
{ {
/* /*
* Allowed CDBs for ALUA_ACCESS_STATE_UNAVAILABLE as defined by * Allowed CDBs for ALUA_ACCESS_STATE_UNAVAILABLE as defined by
...@@ -613,7 +624,7 @@ static inline int core_alua_state_unavailable( ...@@ -613,7 +624,7 @@ static inline int core_alua_state_unavailable(
case MI_REPORT_TARGET_PGS: case MI_REPORT_TARGET_PGS:
return 0; return 0;
default: default:
*alua_ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE; set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
return 1; return 1;
} }
case MAINTENANCE_OUT: case MAINTENANCE_OUT:
...@@ -621,7 +632,7 @@ static inline int core_alua_state_unavailable( ...@@ -621,7 +632,7 @@ static inline int core_alua_state_unavailable(
case MO_SET_TARGET_PGS: case MO_SET_TARGET_PGS:
return 0; return 0;
default: default:
*alua_ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE; set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
return 1; return 1;
} }
case REQUEST_SENSE: case REQUEST_SENSE:
...@@ -629,7 +640,7 @@ static inline int core_alua_state_unavailable( ...@@ -629,7 +640,7 @@ static inline int core_alua_state_unavailable(
case WRITE_BUFFER: case WRITE_BUFFER:
return 0; return 0;
default: default:
*alua_ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE; set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
return 1; return 1;
} }
...@@ -638,8 +649,7 @@ static inline int core_alua_state_unavailable( ...@@ -638,8 +649,7 @@ static inline int core_alua_state_unavailable(
static inline int core_alua_state_transition( static inline int core_alua_state_transition(
struct se_cmd *cmd, struct se_cmd *cmd,
unsigned char *cdb, unsigned char *cdb)
u8 *alua_ascq)
{ {
/* /*
* Allowed CDBs for ALUA_ACCESS_STATE_TRANSITION as defined by * Allowed CDBs for ALUA_ACCESS_STATE_TRANSITION as defined by
...@@ -654,7 +664,7 @@ static inline int core_alua_state_transition( ...@@ -654,7 +664,7 @@ static inline int core_alua_state_transition(
case MI_REPORT_TARGET_PGS: case MI_REPORT_TARGET_PGS:
return 0; return 0;
default: default:
*alua_ascq = ASCQ_04H_ALUA_STATE_TRANSITION; set_ascq(cmd, ASCQ_04H_ALUA_STATE_TRANSITION);
return 1; return 1;
} }
case REQUEST_SENSE: case REQUEST_SENSE:
...@@ -662,7 +672,7 @@ static inline int core_alua_state_transition( ...@@ -662,7 +672,7 @@ static inline int core_alua_state_transition(
case WRITE_BUFFER: case WRITE_BUFFER:
return 0; return 0;
default: default:
*alua_ascq = ASCQ_04H_ALUA_STATE_TRANSITION; set_ascq(cmd, ASCQ_04H_ALUA_STATE_TRANSITION);
return 1; return 1;
} }
...@@ -684,8 +694,6 @@ target_alua_state_check(struct se_cmd *cmd) ...@@ -684,8 +694,6 @@ target_alua_state_check(struct se_cmd *cmd)
struct t10_alua_tg_pt_gp *tg_pt_gp; struct t10_alua_tg_pt_gp *tg_pt_gp;
struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem;
int out_alua_state, nonop_delay_msecs; int out_alua_state, nonop_delay_msecs;
u8 alua_ascq;
int ret;
if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE) if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)
return 0; return 0;
...@@ -701,9 +709,8 @@ target_alua_state_check(struct se_cmd *cmd) ...@@ -701,9 +709,8 @@ target_alua_state_check(struct se_cmd *cmd)
if (atomic_read(&port->sep_tg_pt_secondary_offline)) { if (atomic_read(&port->sep_tg_pt_secondary_offline)) {
pr_debug("ALUA: Got secondary offline status for local" pr_debug("ALUA: Got secondary offline status for local"
" target port\n"); " target port\n");
alua_ascq = ASCQ_04H_ALUA_OFFLINE; set_ascq(cmd, ASCQ_04H_ALUA_OFFLINE);
ret = 1; return TCM_CHECK_CONDITION_NOT_READY;
goto out;
} }
/* /*
* Second, obtain the struct t10_alua_tg_pt_gp_member pointer to the * Second, obtain the struct t10_alua_tg_pt_gp_member pointer to the
...@@ -731,20 +738,23 @@ target_alua_state_check(struct se_cmd *cmd) ...@@ -731,20 +738,23 @@ target_alua_state_check(struct se_cmd *cmd)
switch (out_alua_state) { switch (out_alua_state) {
case ALUA_ACCESS_STATE_ACTIVE_NON_OPTIMIZED: case ALUA_ACCESS_STATE_ACTIVE_NON_OPTIMIZED:
ret = core_alua_state_nonoptimized(cmd, cdb, core_alua_state_nonoptimized(cmd, cdb, nonop_delay_msecs);
nonop_delay_msecs, &alua_ascq);
break; break;
case ALUA_ACCESS_STATE_STANDBY: case ALUA_ACCESS_STATE_STANDBY:
ret = core_alua_state_standby(cmd, cdb, &alua_ascq); if (core_alua_state_standby(cmd, cdb))
return TCM_CHECK_CONDITION_NOT_READY;
break; break;
case ALUA_ACCESS_STATE_UNAVAILABLE: case ALUA_ACCESS_STATE_UNAVAILABLE:
ret = core_alua_state_unavailable(cmd, cdb, &alua_ascq); if (core_alua_state_unavailable(cmd, cdb))
return TCM_CHECK_CONDITION_NOT_READY;
break; break;
case ALUA_ACCESS_STATE_TRANSITION: case ALUA_ACCESS_STATE_TRANSITION:
ret = core_alua_state_transition(cmd, cdb, &alua_ascq); if (core_alua_state_transition(cmd, cdb))
return TCM_CHECK_CONDITION_NOT_READY;
break; break;
case ALUA_ACCESS_STATE_LBA_DEPENDENT: case ALUA_ACCESS_STATE_LBA_DEPENDENT:
ret = core_alua_state_lba_dependent(cmd, tg_pt_gp, &alua_ascq); if (core_alua_state_lba_dependent(cmd, tg_pt_gp))
return TCM_CHECK_CONDITION_NOT_READY;
break; break;
/* /*
* OFFLINE is a secondary ALUA target port group access state, that is * OFFLINE is a secondary ALUA target port group access state, that is
...@@ -757,23 +767,6 @@ target_alua_state_check(struct se_cmd *cmd) ...@@ -757,23 +767,6 @@ target_alua_state_check(struct se_cmd *cmd)
return TCM_INVALID_CDB_FIELD; return TCM_INVALID_CDB_FIELD;
} }
out:
if (ret > 0) {
/*
* Set SCSI additional sense code (ASC) to 'LUN Not Accessible';
* The ALUA additional sense code qualifier (ASCQ) is determined
* by the ALUA primary or secondary access state..
*/
pr_debug("[%s]: ALUA TG Port not available, "
"SenseKey: NOT_READY, ASC/ASCQ: "
"0x04/0x%02x\n",
cmd->se_tfo->get_fabric_name(), alua_ascq);
cmd->scsi_asc = 0x04;
cmd->scsi_ascq = alua_ascq;
return TCM_CHECK_CONDITION_NOT_READY;
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment