Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54a5e73f authored by Laurence Oberman's avatar Laurence Oberman Committed by Nicholas Bellinger
Browse files

tcm_qla2xxx Add SCSI command jammer/discard capability



This patch introduces support for TCM_QLA2XXX_DEBUG and
associated tcm_qla2xxx_tpg->tpg_attrib.jam_host checking
used to test dropped packets to FC host environments.

Tested by: Laurence Oberman <loberman@redhat.com>
Signed-off-by: default avatarLaurence Oberman <loberman@redhat.com>
Acked-by: default avatarHimanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 2b16509c
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
tcm_qla2xxx jam_host attribute
------------------------------
There is now a new module endpoint atribute called jam_host
attribute: jam_host: boolean=0/1
This attribute and accompanying code is only included if the
Kconfig parameter TCM_QLA2XXX_DEBUG is set to Y
By default this jammer code and functionality is disabled

Use this attribute to control the discarding of SCSI commands to a
selected host.
This may be useful for testing error handling and simulating slow drain
and other fabric issues.

Setting a boolean of 1 for the jam_host attribute for a particular host
 will discard the commands for that host.
Reset back to 0 to stop the jamming.

Enable host 4 to be jammed
echo 1 > /sys/kernel/config/target/qla2xxx/21:00:00:24:ff:27:8f:ae/tpgt_1/attrib/jam_host

Disable jamming on host 4
echo 0 > /sys/kernel/config/target/qla2xxx/21:00:00:24:ff:27:8f:ae/tpgt_1/attrib/jam_host
+9 −0
Original line number Diff line number Diff line
@@ -36,3 +36,12 @@ config TCM_QLA2XXX
	default n
	---help---
	Say Y here to enable the TCM_QLA2XXX fabric module for QLogic 24xx+ series target mode HBAs

if TCM_QLA2XXX
config TCM_QLA2XXX_DEBUG
	bool "TCM_QLA2XXX fabric module DEBUG mode for QLogic 24xx+ series target mode HBAs"
	default n
	---help---
	Say Y here to enable the TCM_QLA2XXX fabric module DEBUG for QLogic 24xx+ series target mode HBAs
	This will include code to enable the SCSI command jammer
endif
+20 −0
Original line number Diff line number Diff line
@@ -442,6 +442,10 @@ static int tcm_qla2xxx_handle_cmd(scsi_qla_host_t *vha, struct qla_tgt_cmd *cmd,
	struct se_cmd *se_cmd = &cmd->se_cmd;
	struct se_session *se_sess;
	struct qla_tgt_sess *sess;
#ifdef CONFIG_TCM_QLA2XXX_DEBUG
	struct se_portal_group *se_tpg;
	struct tcm_qla2xxx_tpg *tpg;
#endif
	int flags = TARGET_SCF_ACK_KREF;

	if (bidi)
@@ -462,6 +466,15 @@ static int tcm_qla2xxx_handle_cmd(scsi_qla_host_t *vha, struct qla_tgt_cmd *cmd,
		return -EINVAL;
	}

#ifdef CONFIG_TCM_QLA2XXX_DEBUG
	se_tpg = se_sess->se_tpg;
	tpg = container_of(se_tpg, struct tcm_qla2xxx_tpg, se_tpg);
	if (unlikely(tpg->tpg_attrib.jam_host)) {
		/* return, and dont run target_submit_cmd,discarding command */
		return 0;
	}
#endif

	cmd->vha->tgt_counters.qla_core_sbt_cmd++;
	return target_submit_cmd(se_cmd, se_sess, cdb, &cmd->sense_buffer[0],
				cmd->unpacked_lun, data_length, fcp_task_attr,
@@ -812,6 +825,9 @@ DEF_QLA_TPG_ATTRIB(cache_dynamic_acls);
DEF_QLA_TPG_ATTRIB(demo_mode_write_protect);
DEF_QLA_TPG_ATTRIB(prod_mode_write_protect);
DEF_QLA_TPG_ATTRIB(demo_mode_login_only);
#ifdef CONFIG_TCM_QLA2XXX_DEBUG
DEF_QLA_TPG_ATTRIB(jam_host);
#endif

static struct configfs_attribute *tcm_qla2xxx_tpg_attrib_attrs[] = {
	&tcm_qla2xxx_tpg_attrib_attr_generate_node_acls,
@@ -819,6 +835,9 @@ static struct configfs_attribute *tcm_qla2xxx_tpg_attrib_attrs[] = {
	&tcm_qla2xxx_tpg_attrib_attr_demo_mode_write_protect,
	&tcm_qla2xxx_tpg_attrib_attr_prod_mode_write_protect,
	&tcm_qla2xxx_tpg_attrib_attr_demo_mode_login_only,
#ifdef CONFIG_TCM_QLA2XXX_DEBUG
	&tcm_qla2xxx_tpg_attrib_attr_jam_host,
#endif
	NULL,
};

@@ -991,6 +1010,7 @@ static struct se_portal_group *tcm_qla2xxx_make_tpg(
	tpg->tpg_attrib.demo_mode_write_protect = 1;
	tpg->tpg_attrib.cache_dynamic_acls = 1;
	tpg->tpg_attrib.demo_mode_login_only = 1;
	tpg->tpg_attrib.jam_host = 0;

	ret = core_tpg_register(wwn, &tpg->se_tpg, SCSI_PROTOCOL_FCP);
	if (ret < 0) {
+1 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ struct tcm_qla2xxx_tpg_attrib {
	int prod_mode_write_protect;
	int demo_mode_login_only;
	int fabric_prot_type;
	int jam_host;
};

struct tcm_qla2xxx_tpg {