[SCSI] sd: Implement support for WRITE SAME
Implement support for WRITE SAME(10) and WRITE SAME(16) in the SCSI disk driver. - We set the default maximum to 0xFFFF because there are several devices out there that only support two-byte block counts even with WRITE SAME(16). We only enable transfers bigger than 0xFFFF if the device explicitly reports MAXIMUM WRITE SAME LENGTH in the BLOCK LIMITS VPD. - max_write_same_blocks can be overriden per-device basis in sysfs. - The UNMAP discovery heuristics remain unchanged but the discard limits are tweaked to match the "real" WRITE SAME commands. - In the error handling logic we now distinguish between WRITE SAME with and without UNMAP set. The discovery process heuristics are: - If the device reports a SCSI level of SPC-3 or greater we'll issue READ SUPPORTED OPERATION CODES to find out whether WRITE SAME(16) is supported. If that's the case we will use it. - If the device supports the block limits VPD and reports a MAXIMUM WRITE SAME LENGTH bigger than 0xFFFF we will use WRITE SAME(16). - Otherwise we will use WRITE SAME(10) unless the target LBA is beyond 0xFFFFFFFF or the block count exceeds 0xFFFF. - no_write_same is set for ATA, FireWire and USB. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Mike Snitzer <snitzer@redhat.com> Reviewed-by: Jeff Garzik <jgarzik@redhat.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
committed by
James Bottomley
parent
26e85fcd15
commit
5db44863b6
@@ -14,6 +14,7 @@
|
||||
#define SD_TIMEOUT (30 * HZ)
|
||||
#define SD_MOD_TIMEOUT (75 * HZ)
|
||||
#define SD_FLUSH_TIMEOUT (60 * HZ)
|
||||
#define SD_WRITE_SAME_TIMEOUT (120 * HZ)
|
||||
|
||||
/*
|
||||
* Number of allowed retries
|
||||
@@ -38,6 +39,11 @@ enum {
|
||||
SD_MEMPOOL_SIZE = 2, /* CDB pool size */
|
||||
};
|
||||
|
||||
enum {
|
||||
SD_MAX_WS10_BLOCKS = 0xffff,
|
||||
SD_MAX_WS16_BLOCKS = 0x7fffff,
|
||||
};
|
||||
|
||||
enum {
|
||||
SD_LBP_FULL = 0, /* Full logical block provisioning */
|
||||
SD_LBP_UNMAP, /* Use UNMAP command */
|
||||
@@ -77,6 +83,7 @@ struct scsi_disk {
|
||||
unsigned lbpws : 1;
|
||||
unsigned lbpws10 : 1;
|
||||
unsigned lbpvpd : 1;
|
||||
unsigned ws16 : 1;
|
||||
};
|
||||
#define to_scsi_disk(obj) container_of(obj,struct scsi_disk,dev)
|
||||
|
||||
|
Reference in New Issue
Block a user