aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_lib.c
diff options
context:
space:
mode:
authorMartin K. Petersen <martin.petersen@oracle.com>2011-03-08 02:07:15 -0500
committerJames Bottomley <James.Bottomley@suse.de>2011-03-14 19:37:34 -0400
commitc98a0eb0e90d1caa8a92913cd45462102cbd5eaf (patch)
tree2a25be17b0d2806adb00f7c879e86811cc10071a /drivers/scsi/scsi_lib.c
parent72f7d322fd60ce1a0579136dec7b26b0801ded4b (diff)
[SCSI] sd: Logical Block Provisioning update
SBC3r26 contains many changes to the Logical Block Provisioning interfaces (formerly known as Thin Provisioning ditto). This patch implements support for both the old and new schemes using the same heuristic as before (whether the LBP VPD page is present). The new code also allows the provisioning mode (i.e. choice of command) to be overridden on a per-device basis via sysfs. Two additional modes are supported in this version: - WRITE SAME(10) with the UNMAP bit set - WRITE SAME(10) without the UNMAP bit set. This allows us to support devices that predate the TP/LBP enhancements in SBC3 and which work by way zero-detection Switching between modes has been consolidated in a helper function that also updates the block layer topology according to the limitations of the chosen command. I experimented with trying WRITE SAME(16) if UNMAP fails, WRITE SAME(10) if WRITE SAME(16) fails, etc. but found several devices that got cranky. So for now we'll disable discard if one of the commands fail. The user still has the option of selecting a different mode in sysfs. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r--drivers/scsi/scsi_lib.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index e531acfd98a2..3829bf058aef 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -867,6 +867,13 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
867 description = "Host Data Integrity Failure"; 867 description = "Host Data Integrity Failure";
868 action = ACTION_FAIL; 868 action = ACTION_FAIL;
869 error = -EILSEQ; 869 error = -EILSEQ;
870 /* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */
871 } else if ((sshdr.asc == 0x20 || sshdr.asc == 0x24) &&
872 (cmd->cmnd[0] == UNMAP ||
873 cmd->cmnd[0] == WRITE_SAME_16 ||
874 cmd->cmnd[0] == WRITE_SAME)) {
875 description = "Discard failure";
876 action = ACTION_FAIL;
870 } else 877 } else
871 action = ACTION_FAIL; 878 action = ACTION_FAIL;
872 break; 879 break;