[stgt] [PATCH 4/5] SBC: Support unmapping blocks using WRITE_SAME/WRITE_SAME16
Ronnie Sahlberg
ronniesahlberg at gmail.com
Sun Apr 22 09:24:28 CEST 2012
Add support for WRITE_SAME and WRITE_SAME16 to unmap blocks if the
UNMAP bit is set, and the LUN is set for thin-provisioning.
Log error if the ANCHOR bit is set since we not not yet support
resource-provisioned luns.
Update VPD page 0xb2 to indicate that both write same 10 and write same 16
can be used for unmapping blocks
Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
---
usr/bs_rdwr.c | 13 +++++++++++++
usr/sbc.c | 14 ++++++++++++++
usr/spc.c | 2 +-
3 files changed, 28 insertions(+), 1 deletions(-)
diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
index cd4518b..7d05359 100644
--- a/usr/bs_rdwr.c
+++ b/usr/bs_rdwr.c
@@ -114,6 +114,19 @@ 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) {
+ ret = unmap_file_region(fd, offset, tl);
+ if (ret != 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 (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