linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: target-devel@vger.kernel.org, nab@linux-iscsi.org, hch@lst.de,
	roland@kernel.org
Subject: [PATCH 07/11] target: support zero allocation length in INQUIRY
Date: Fri,  7 Sep 2012 17:30:38 +0200	[thread overview]
Message-ID: <1347031842-2531-8-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1347031842-2531-1-git-send-email-pbonzini@redhat.com>

INQUIRY processing already uses an on-heap bounce buffer for loopback,
but not for other fabrics.  Switch this to a cheaper on-stack bounce
buffer, similar to the one used by MODE SENSE and REQUEST SENSE, and
use it unconditionally.  With this in place, zero allocation length is
handled simply by checking the return address of transport_kmap_data_sg.

Testcase: sg_raw /dev/sdb 12 00 83 00 00 00
    should fail with ILLEGAL REQUEST / INVALID FIELD IN CDB sense
    does not fail without the patch
    fails correctly with the series

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 drivers/target/target_core_spc.c |   31 ++++++-------------------------
 1 files changed, 6 insertions(+), 25 deletions(-)

diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c
index b905fb2..647e51b 100644
--- a/drivers/target/target_core_spc.c
+++ b/drivers/target/target_core_spc.c
@@ -600,30 +600,11 @@ static int spc_emulate_inquiry(struct se_cmd *cmd)
 {
 	struct se_device *dev = cmd->se_dev;
 	struct se_portal_group *tpg = cmd->se_lun->lun_sep->sep_tpg;
-	unsigned char *buf, *map_buf;
+	unsigned char *rbuf;
 	unsigned char *cdb = cmd->t_task_cdb;
+	unsigned char buf[SE_INQUIRY_BUF];
 	int p, ret;
 
-	map_buf = transport_kmap_data_sg(cmd);
-	/*
-	 * If SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC is not set, then we
-	 * know we actually allocated a full page.  Otherwise, if the
-	 * data buffer is too small, allocate a temporary buffer so we
-	 * don't have to worry about overruns in all our INQUIRY
-	 * emulation handling.
-	 */
-	if (cmd->data_length < SE_INQUIRY_BUF &&
-	    (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC)) {
-		buf = kzalloc(SE_INQUIRY_BUF, GFP_KERNEL);
-		if (!buf) {
-			transport_kunmap_data_sg(cmd);
-			cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
-			return -ENOMEM;
-		}
-	} else {
-		buf = map_buf;
-	}
-
 	if (dev == tpg->tpg_virt_lun0.lun_se_dev)
 		buf[0] = 0x3f; /* Not connected */
 	else
@@ -655,11 +636,11 @@ static int spc_emulate_inquiry(struct se_cmd *cmd)
 	ret = -EINVAL;
 
 out:
-	if (buf != map_buf) {
-		memcpy(map_buf, buf, cmd->data_length);
-		kfree(buf);
+	rbuf = transport_kmap_data_sg(cmd);
+	if (rbuf) {
+		memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
+		transport_kunmap_data_sg(cmd);
 	}
-	transport_kunmap_data_sg(cmd);
 
 	if (!ret)
 		target_complete_cmd(cmd, GOOD);
-- 
1.7.1



  parent reply	other threads:[~2012-09-07 15:31 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-07 15:30 [PATCH 00/11] lots of fixes for zero allocation length Paolo Bonzini
2012-09-07 15:30 ` [PATCH 01/11] target: go through normal processing for zero-length PSCSI commands Paolo Bonzini
2012-09-07 18:06   ` Nicholas A. Bellinger
2012-09-07 15:30 ` [PATCH 02/11] target: report too-small parameter lists everywhere Paolo Bonzini
2012-09-07 18:09   ` Nicholas A. Bellinger
2012-09-07 15:30 ` [PATCH 03/11] target: fail REPORT LUNS with less than 16 bytes of payload Paolo Bonzini
2012-09-07 18:09   ` Nicholas A. Bellinger
2012-09-07 15:30 ` [PATCH 04/11] target: support zero-size allocation lengths in transport_kmap_data_sg Paolo Bonzini
2012-09-07 18:12   ` Nicholas A. Bellinger
2012-09-07 15:30 ` [PATCH 05/11] target: support zero allocation length in REQUEST SENSE Paolo Bonzini
2012-09-07 18:17   ` Nicholas A. Bellinger
2012-09-07 15:30 ` [PATCH 06/11] target: go through normal processing for zero-length REQUEST_SENSE Paolo Bonzini
2012-09-07 18:23   ` Nicholas A. Bellinger
2012-09-07 18:33     ` Nicholas A. Bellinger
2012-09-07 20:34       ` Paolo Bonzini
2012-09-07 15:30 ` Paolo Bonzini [this message]
2012-09-07 15:30 ` [PATCH 08/11] target: fix truncation of mode data, support zero allocation length Paolo Bonzini
2012-09-07 15:30 ` [PATCH 09/11] target: support zero allocation length in SBC commands Paolo Bonzini
2012-09-07 15:30 ` [PATCH 10/11] target: do not submit a zero-bio I/O request Paolo Bonzini
2012-09-07 15:30 ` [PATCH 11/11] target: go through normal processing for all zero-length commands Paolo Bonzini
2012-09-07 19:01 ` [PATCH 00/11] lots of fixes for zero allocation length Nicholas A. Bellinger
2012-09-10  7:28 ` Christoph Hellwig
2012-09-10  7:48   ` Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1347031842-2531-8-git-send-email-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=hch@lst.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nab@linux-iscsi.org \
    --cc=roland@kernel.org \
    --cc=target-devel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).