Commit 40fd8845 authored by David Disseldorp's avatar David Disseldorp Committed by Martin K. Petersen
Browse files

scsi: target: core: Drop unnecessary se_cmd ASC/ASCQ members

These members are only used for ALUA sense detail propagation, which can
just as easily be done via sense_reason_t.

Link: https://lore.kernel.org/r/20210728115353.2396-4-ddiss@suse.de


Reviewed-by: default avatarMike Christie <michael.christie@oracle.com>
Signed-off-by: default avatarDavid Disseldorp <ddiss@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 35410f86
Loading
Loading
Loading
Loading
+30 −56
Original line number Diff line number Diff line
@@ -428,22 +428,6 @@ target_emulate_set_target_port_groups(struct se_cmd *cmd)
	return rc;
}

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->fabric_name, alua_ascq);

	cmd->scsi_asc = 0x04;
	cmd->scsi_ascq = alua_ascq;
}

static inline void core_alua_state_nonoptimized(
	struct se_cmd *cmd,
	unsigned char *cdb,
@@ -458,7 +442,7 @@ static inline void core_alua_state_nonoptimized(
	cmd->alua_nonop_delay = nonop_delay_msecs;
}

static inline int core_alua_state_lba_dependent(
static inline sense_reason_t core_alua_state_lba_dependent(
	struct se_cmd *cmd,
	u16 tg_pt_gp_id)
{
@@ -506,8 +490,7 @@ static inline int core_alua_state_lba_dependent(
		}
		if (!cur_map) {
			spin_unlock(&dev->t10_alua.lba_map_lock);
			set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
			return 1;
			return TCM_ALUA_TG_PT_UNAVAILABLE;
		}
		list_for_each_entry(map_mem, &cur_map->lba_map_mem_list,
				    lba_map_mem_list) {
@@ -516,12 +499,10 @@ static inline int core_alua_state_lba_dependent(
			switch(map_mem->lba_map_mem_alua_state) {
			case ALUA_ACCESS_STATE_STANDBY:
				spin_unlock(&dev->t10_alua.lba_map_lock);
				set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
				return 1;
				return TCM_ALUA_TG_PT_STANDBY;
			case ALUA_ACCESS_STATE_UNAVAILABLE:
				spin_unlock(&dev->t10_alua.lba_map_lock);
				set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
				return 1;
				return TCM_ALUA_TG_PT_UNAVAILABLE;
			default:
				break;
			}
@@ -531,7 +512,7 @@ static inline int core_alua_state_lba_dependent(
	return 0;
}

static inline int core_alua_state_standby(
static inline sense_reason_t core_alua_state_standby(
	struct se_cmd *cmd,
	unsigned char *cdb)
{
@@ -555,24 +536,21 @@ static inline int core_alua_state_standby(
		case SAI_READ_CAPACITY_16:
			return 0;
		default:
			set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
			return 1;
			return TCM_ALUA_TG_PT_STANDBY;
		}
	case MAINTENANCE_IN:
		switch (cdb[1] & 0x1f) {
		case MI_REPORT_TARGET_PGS:
			return 0;
		default:
			set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
			return 1;
			return TCM_ALUA_TG_PT_STANDBY;
		}
	case MAINTENANCE_OUT:
		switch (cdb[1]) {
		case MO_SET_TARGET_PGS:
			return 0;
		default:
			set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
			return 1;
			return TCM_ALUA_TG_PT_STANDBY;
		}
	case REQUEST_SENSE:
	case PERSISTENT_RESERVE_IN:
@@ -581,14 +559,13 @@ static inline int core_alua_state_standby(
	case WRITE_BUFFER:
		return 0;
	default:
		set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
		return 1;
		return TCM_ALUA_TG_PT_STANDBY;
	}

	return 0;
}

static inline int core_alua_state_unavailable(
static inline sense_reason_t core_alua_state_unavailable(
	struct se_cmd *cmd,
	unsigned char *cdb)
{
@@ -605,30 +582,27 @@ static inline int core_alua_state_unavailable(
		case MI_REPORT_TARGET_PGS:
			return 0;
		default:
			set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
			return 1;
			return TCM_ALUA_TG_PT_UNAVAILABLE;
		}
	case MAINTENANCE_OUT:
		switch (cdb[1]) {
		case MO_SET_TARGET_PGS:
			return 0;
		default:
			set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
			return 1;
			return TCM_ALUA_TG_PT_UNAVAILABLE;
		}
	case REQUEST_SENSE:
	case READ_BUFFER:
	case WRITE_BUFFER:
		return 0;
	default:
		set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
		return 1;
		return TCM_ALUA_TG_PT_UNAVAILABLE;
	}

	return 0;
}

static inline int core_alua_state_transition(
static inline sense_reason_t core_alua_state_transition(
	struct se_cmd *cmd,
	unsigned char *cdb)
{
@@ -645,16 +619,14 @@ static inline int core_alua_state_transition(
		case MI_REPORT_TARGET_PGS:
			return 0;
		default:
			set_ascq(cmd, ASCQ_04H_ALUA_STATE_TRANSITION);
			return 1;
			return TCM_ALUA_STATE_TRANSITION;
		}
	case REQUEST_SENSE:
	case READ_BUFFER:
	case WRITE_BUFFER:
		return 0;
	default:
		set_ascq(cmd, ASCQ_04H_ALUA_STATE_TRANSITION);
		return 1;
		return TCM_ALUA_STATE_TRANSITION;
	}

	return 0;
@@ -674,6 +646,7 @@ target_alua_state_check(struct se_cmd *cmd)
	struct t10_alua_tg_pt_gp *tg_pt_gp;
	int out_alua_state, nonop_delay_msecs;
	u16 tg_pt_gp_id;
	sense_reason_t rc = TCM_NO_SENSE;

	if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)
		return 0;
@@ -687,8 +660,7 @@ target_alua_state_check(struct se_cmd *cmd)
	if (atomic_read(&lun->lun_tg_pt_secondary_offline)) {
		pr_debug("ALUA: Got secondary offline status for local"
				" target port\n");
		set_ascq(cmd, ASCQ_04H_ALUA_OFFLINE);
		return TCM_CHECK_CONDITION_NOT_READY;
		return TCM_ALUA_OFFLINE;
	}

	if (!lun->lun_tg_pt_gp)
@@ -715,20 +687,16 @@ target_alua_state_check(struct se_cmd *cmd)
		core_alua_state_nonoptimized(cmd, cdb, nonop_delay_msecs);
		break;
	case ALUA_ACCESS_STATE_STANDBY:
		if (core_alua_state_standby(cmd, cdb))
			return TCM_CHECK_CONDITION_NOT_READY;
		rc = core_alua_state_standby(cmd, cdb);
		break;
	case ALUA_ACCESS_STATE_UNAVAILABLE:
		if (core_alua_state_unavailable(cmd, cdb))
			return TCM_CHECK_CONDITION_NOT_READY;
		rc = core_alua_state_unavailable(cmd, cdb);
		break;
	case ALUA_ACCESS_STATE_TRANSITION:
		if (core_alua_state_transition(cmd, cdb))
			return TCM_CHECK_CONDITION_NOT_READY;
		rc = core_alua_state_transition(cmd, cdb);
		break;
	case ALUA_ACCESS_STATE_LBA_DEPENDENT:
		if (core_alua_state_lba_dependent(cmd, tg_pt_gp_id))
			return TCM_CHECK_CONDITION_NOT_READY;
		rc = core_alua_state_lba_dependent(cmd, tg_pt_gp_id);
		break;
	/*
	 * OFFLINE is a secondary ALUA target port group access state, that is
@@ -738,10 +706,16 @@ target_alua_state_check(struct se_cmd *cmd)
	default:
		pr_err("Unknown ALUA access state: 0x%02x\n",
				out_alua_state);
		return TCM_INVALID_CDB_FIELD;
		rc = TCM_INVALID_CDB_FIELD;
	}

	return 0;
	if (rc && rc != TCM_INVALID_CDB_FIELD) {
		pr_debug("[%s]: ALUA TG Port not available, "
			"SenseKey: NOT_READY, ASC/rc: 0x04/%d\n",
			cmd->se_tfo->fabric_name, rc);
	}

	return rc;
}

/*
+25 −8
Original line number Diff line number Diff line
@@ -2003,7 +2003,6 @@ void transport_generic_request_failure(struct se_cmd *cmd,
	case TCM_ADDRESS_OUT_OF_RANGE:
	case TCM_CHECK_CONDITION_ABORT_CMD:
	case TCM_CHECK_CONDITION_UNIT_ATTENTION:
	case TCM_CHECK_CONDITION_NOT_READY:
	case TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED:
	case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED:
	case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED:
@@ -2013,6 +2012,10 @@ void transport_generic_request_failure(struct se_cmd *cmd,
	case TCM_TOO_MANY_SEGMENT_DESCS:
	case TCM_UNSUPPORTED_SEGMENT_DESC_TYPE_CODE:
	case TCM_INVALID_FIELD_IN_COMMAND_IU:
	case TCM_ALUA_TG_PT_STANDBY:
	case TCM_ALUA_TG_PT_UNAVAILABLE:
	case TCM_ALUA_STATE_TRANSITION:
	case TCM_ALUA_OFFLINE:
		break;
	case TCM_OUT_OF_RESOURCES:
		cmd->scsi_status = SAM_STAT_TASK_SET_FULL;
@@ -3277,9 +3280,6 @@ static const struct sense_detail sense_detail_table[] = {
	[TCM_CHECK_CONDITION_UNIT_ATTENTION] = {
		.key = UNIT_ATTENTION,
	},
	[TCM_CHECK_CONDITION_NOT_READY] = {
		.key = NOT_READY,
	},
	[TCM_MISCOMPARE_VERIFY] = {
		.key = MISCOMPARE,
		.asc = 0x1d, /* MISCOMPARE DURING VERIFY OPERATION */
@@ -3340,6 +3340,26 @@ static const struct sense_detail sense_detail_table[] = {
		.asc = 0x0e,
		.ascq = 0x03, /* INVALID FIELD IN COMMAND INFORMATION UNIT */
	},
	[TCM_ALUA_TG_PT_STANDBY] = {
		.key = NOT_READY,
		.asc = 0x04,
		.ascq = ASCQ_04H_ALUA_TG_PT_STANDBY,
	},
	[TCM_ALUA_TG_PT_UNAVAILABLE] = {
		.key = NOT_READY,
		.asc = 0x04,
		.ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE,
	},
	[TCM_ALUA_STATE_TRANSITION] = {
		.key = NOT_READY,
		.asc = 0x04,
		.ascq = ASCQ_04H_ALUA_STATE_TRANSITION,
	},
	[TCM_ALUA_OFFLINE] = {
		.key = NOT_READY,
		.asc = 0x04,
		.ascq = ASCQ_04H_ALUA_OFFLINE,
	},
};

/**
@@ -3374,11 +3394,8 @@ static void translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason)
			cmd->scsi_status = SAM_STAT_BUSY;
			return;
		}
	} else if (sd->asc == 0) {
		WARN_ON_ONCE(cmd->scsi_asc == 0);
		asc = cmd->scsi_asc;
		ascq = cmd->scsi_ascq;
	} else {
		WARN_ON_ONCE(sd->asc == 0);
		asc = sd->asc;
		ascq = sd->ascq;
	}
+5 −3
Original line number Diff line number Diff line
@@ -171,7 +171,7 @@ enum tcm_sense_reason_table {
	TCM_WRITE_PROTECTED			= R(0x0c),
	TCM_CHECK_CONDITION_ABORT_CMD		= R(0x0d),
	TCM_CHECK_CONDITION_UNIT_ATTENTION	= R(0x0e),
	TCM_CHECK_CONDITION_NOT_READY		= R(0x0f),

	TCM_RESERVATION_CONFLICT		= R(0x10),
	TCM_ADDRESS_OUT_OF_RANGE		= R(0x11),
	TCM_OUT_OF_RESOURCES			= R(0x12),
@@ -188,6 +188,10 @@ enum tcm_sense_reason_table {
	TCM_INSUFFICIENT_REGISTRATION_RESOURCES	= R(0x1d),
	TCM_LUN_BUSY				= R(0x1e),
	TCM_INVALID_FIELD_IN_COMMAND_IU         = R(0x1f),
	TCM_ALUA_TG_PT_STANDBY			= R(0x20),
	TCM_ALUA_TG_PT_UNAVAILABLE		= R(0x21),
	TCM_ALUA_STATE_TRANSITION		= R(0x22),
	TCM_ALUA_OFFLINE			= R(0x23),
#undef R
};

@@ -455,8 +459,6 @@ enum target_core_dif_check {
struct se_cmd {
	/* SAM response code being sent to initiator */
	u8			scsi_status;
	u8			scsi_asc;
	u8			scsi_ascq;
	u16			scsi_sense_length;
	unsigned		unknown_data_length:1;
	bool			state_active:1;