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

Commit 8b4b0dcb authored by Nicholas Bellinger's avatar Nicholas Bellinger
Browse files

target: Fix zero-length READ_CAPACITY_16 regression



This patch fixes a regression introduced in v3.8-rc1 code where a
zero-length READ_CAPACITY_16 was no longer returning GOOD status, but
instead returning TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE to generate
a CHECK_CONDITION status.

This regression was introduced with the following commit:

  commit de103c93
  Author: Christoph Hellwig <hch@lst.de>
  Date:   Tue Nov 6 12:24:09 2012 -0800

      target: pass sense_reason as a return value

and this patch has been tested with the following zero-length CDB:

  sg_raw /dev/sdd 9e 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  SCSI Status: Good

  Sense Information:
  sense buffer empty

Also, convert sbc_emulate_readcapacity() to follow the same method
of handling transport_kmap_data_sg() return values, but we never
expect a zero-length request here.

Cc: Christoph Hellwig <hch@lst.de>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Roland Dreier <roland@purestorage.com>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent cab9609b
Loading
Loading
Loading
Loading
+8 −10
Original line number Original line Diff line number Diff line
@@ -58,11 +58,10 @@ sbc_emulate_readcapacity(struct se_cmd *cmd)
	buf[7] = dev->dev_attrib.block_size & 0xff;
	buf[7] = dev->dev_attrib.block_size & 0xff;


	rbuf = transport_kmap_data_sg(cmd);
	rbuf = transport_kmap_data_sg(cmd);
	if (!rbuf)
	if (rbuf) {
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;

		memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
		memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
		transport_kunmap_data_sg(cmd);
		transport_kunmap_data_sg(cmd);
	}


	target_complete_cmd(cmd, GOOD);
	target_complete_cmd(cmd, GOOD);
	return 0;
	return 0;
@@ -97,11 +96,10 @@ sbc_emulate_readcapacity_16(struct se_cmd *cmd)
		buf[14] = 0x80;
		buf[14] = 0x80;


	rbuf = transport_kmap_data_sg(cmd);
	rbuf = transport_kmap_data_sg(cmd);
	if (!rbuf)
	if (rbuf) {
		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;

		memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
		memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
		transport_kunmap_data_sg(cmd);
		transport_kunmap_data_sg(cmd);
	}


	target_complete_cmd(cmd, GOOD);
	target_complete_cmd(cmd, GOOD);
	return 0;
	return 0;