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

Commit 9864ca9d authored by Nicholas Bellinger's avatar Nicholas Bellinger
Browse files

iscsi-target: Move sendtargets parsing into iscsit_process_text_cmd



This patch moves ISCSI_OP_TEXT PDU buffer sanity checks to
iscsit_process_text_cmd() code, so that it can be shared
with iser-target code.

It adds IFC_SENDTARGETS_ALL + iscsi_cmd->text_in_ptr in order
to save text payload for ISCSI_OP_TEXT_RSP, and updates
iscsit_release_cmd() to assigned memory.

Cc: Or Gerlitz <ogerlitz@mellanox.com>
Cc: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent dbf738a1
Loading
Loading
Loading
Loading
+31 −20
Original line number Diff line number Diff line
@@ -1995,8 +1995,32 @@ int
iscsit_process_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
			struct iscsi_text *hdr)
{
	unsigned char *text_in = cmd->text_in_ptr, *text_ptr;
	int cmdsn_ret;

	if (!text_in) {
		pr_err("Unable to locate text_in buffer for sendtargets"
		       " discovery\n");
		goto reject;
	}
	if (strncmp("SendTargets", text_in, 11) != 0) {
		pr_err("Received Text Data that is not"
			" SendTargets, cannot continue.\n");
		goto reject;
	}
	text_ptr = strchr(text_in, '=');
	if (!text_ptr) {
		pr_err("No \"=\" separator found in Text Data,"
			"  cannot continue.\n");
		goto reject;
	}
	if (!strncmp("=All", text_ptr, 4)) {
		cmd->cmd_flags |= IFC_SENDTARGETS_ALL;
	} else {
		pr_err("Unable to locate valid SendTargets=%s value\n", text_ptr);
		goto reject;
	}

	spin_lock_bh(&conn->cmd_lock);
	list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list);
	spin_unlock_bh(&conn->cmd_lock);
@@ -2013,6 +2037,10 @@ iscsit_process_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
	}

	return iscsit_execute_cmd(cmd, 0);

reject:
	return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR,
					  0, 0, (unsigned char *)hdr, cmd);
}
EXPORT_SYMBOL(iscsit_process_text_cmd);

@@ -2031,7 +2059,6 @@ iscsit_handle_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,

	rx_size = payload_length;
	if (payload_length) {
		char *text_ptr;
		u32 checksum = 0, data_crc = 0;
		u32 padding = 0, pad_bytes = 0;
		int niov = 0, rx_got;
@@ -2043,6 +2070,7 @@ iscsit_handle_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
				" incoming text parameters\n");
			goto reject;
		}
		cmd->text_in_ptr = text_in;

		memset(iov, 0, 3 * sizeof(struct kvec));
		iov[niov].iov_base	= text_in;
@@ -2101,30 +2129,13 @@ iscsit_handle_text_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
		text_in[payload_length - 1] = '\0';
		pr_debug("Successfully read %d bytes of text"
				" data.\n", payload_length);

		if (strncmp("SendTargets", text_in, 11) != 0) {
			pr_err("Received Text Data that is not"
				" SendTargets, cannot continue.\n");
			goto reject;
		}
		text_ptr = strchr(text_in, '=');
		if (!text_ptr) {
			pr_err("No \"=\" separator found in Text Data,"
				"  cannot continue.\n");
			goto reject;
		}
		if (strncmp("=All", text_ptr, 4) != 0) {
			pr_err("Unable to locate All value for"
				" SendTargets key,  cannot continue.\n");
			goto reject;
		}
		kfree(text_in);
	}

	return iscsit_process_text_cmd(conn, cmd, hdr);

reject:
	kfree(text_in);
	kfree(cmd->text_in_ptr);
	cmd->text_in_ptr = NULL;
	return iscsit_add_reject_from_cmd(ISCSI_REASON_PROTOCOL_ERROR,
					  0, 0, buf, cmd);
}
+3 −0
Original line number Diff line number Diff line
@@ -133,6 +133,7 @@ enum cmd_flags_table {
	ICF_ATTACHED_TO_RQUEUE			= 0x00000040,
	ICF_OOO_CMDSN				= 0x00000080,
	ICF_REJECT_FAIL_CONN			= 0x00000100,
	IFC_SENDTARGETS_ALL			= 0x00000200,
};

/* struct iscsi_cmd->i_state */
@@ -427,6 +428,8 @@ struct iscsi_cmd {
	u32			tx_size;
	/* Buffer used for various purposes */
	void			*buf_ptr;
	/* Used by SendTargets=[iqn.,eui.] discovery */
	void			*text_in_ptr;
	/* See include/linux/dma-mapping.h */
	enum dma_data_direction	data_direction;
	/* iSCSI PDU Header + CRC */
+1 −0
Original line number Diff line number Diff line
@@ -681,6 +681,7 @@ void iscsit_release_cmd(struct iscsi_cmd *cmd)
	kfree(cmd->seq_list);
	kfree(cmd->tmr_req);
	kfree(cmd->iov_data);
	kfree(cmd->text_in_ptr);

	kmem_cache_free(lio_cmd_cache, cmd);
}