[stgt] [PATCH 3/3] WRITE_SAME: Add support for thin provisioning and unmapping blocks to WRITE_SAME10/16

Ronnie Sahlberg ronniesahlberg at gmail.com
Wed Apr 18 11:30:42 CEST 2012


Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
---
 usr/bs_rdwr.c |   21 +++++++++++++++++++++
 usr/sbc.c     |   14 ++++++++++++++
 usr/spc.c     |    2 +-
 3 files changed, 36 insertions(+), 1 deletions(-)

diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
index 09524a4..cdaab15 100644
--- a/usr/bs_rdwr.c
+++ b/usr/bs_rdwr.c
@@ -112,6 +112,27 @@ static void bs_rdwr_request(struct scsi_cmd *cmd)
 		break;
 	case WRITE_SAME:
 	case WRITE_SAME_16:
+		/* WRITE_SAME used to punch hole in file */
+		if (cmd->scb[1] & 0x08) {
+			uint64_t offset;
+			uint64_t len;
+
+			offset = cmd->offset;
+			offset = offset << cmd->dev->blk_shift;
+
+			len = cmd->tl;
+			len = len << cmd->dev->blk_shift;
+
+			if (unmap_file_region(fd, offset, len) != 0) {
+				eprintf("Failed to punch hole for WRITE_SAME"
+					" command\n");
+				result = SAM_STAT_CHECK_CONDITION;
+				key = HARDWARE_ERROR;
+				asc = ASC_INTERNAL_TGT_FAILURE;
+				break;
+			}
+			break;
+		}
 		while (cmd->tl > 0) {
 			blocksize = 1 << cmd->dev->blk_shift;
 			tmpbuf = scsi_get_out_buffer(cmd);
diff --git a/usr/sbc.c b/usr/sbc.c
index de0a13b..2cfcd11 100644
--- a/usr/sbc.c
+++ b/usr/sbc.c
@@ -230,6 +230,20 @@ static int sbc_rw(int host_no, struct scsi_cmd *cmd)
 		break;
 	case WRITE_SAME:
 	case WRITE_SAME_16:
+		/* We dont support resource-provisioning so
+		 * ANCHOR bit == 1 is an error.
+		 */
+		if (cmd->scb[1] & 0x10) {
+			key = ILLEGAL_REQUEST;
+			asc = ASC_INVALID_FIELD_IN_CDB;
+			goto sense;
+		}
+		/* We only support unmap for thin provisioned LUNS */
+		if (cmd->scb[1] & 0x08 && !lu->attrs.thinprovisioning) {
+			key = ILLEGAL_REQUEST;
+			asc = ASC_INVALID_FIELD_IN_CDB;
+			goto sense;
+		}
 		/* We only support protection information type 0 */
 		if (cmd->scb[1] & 0xe0) {
 			key = ILLEGAL_REQUEST;
diff --git a/usr/spc.c b/usr/spc.c
index b0a305f..eb435ae 100644
--- a/usr/spc.c
+++ b/usr/spc.c
@@ -146,7 +146,7 @@ static void update_vpd_b2(struct scsi_lu *lu, void *id)
 
 	if (lu->attrs.thinprovisioning) {
 		data[0] = 0;		/* threshold exponent */
-		data[1] = 0x84;		/* LBPU LBPRZ */
+		data[1] = 0xe4;		/* LBPU LBPWS(10) LBPRZ */
 		data[2] = 0x02;		/* provisioning type */
 		data[3] = 0;
 	} else {
-- 
1.7.3.1

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list