[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>
Showing
- drivers/ata/libata-scsi.c 1 addition, 0 deletionsdrivers/ata/libata-scsi.c
- drivers/firewire/sbp2.c 1 addition, 0 deletionsdrivers/firewire/sbp2.c
- drivers/scsi/scsi_lib.c 17 additions, 5 deletionsdrivers/scsi/scsi_lib.c
- drivers/scsi/sd.c 161 additions, 11 deletionsdrivers/scsi/sd.c
- drivers/scsi/sd.h 7 additions, 0 deletionsdrivers/scsi/sd.h
- drivers/usb/storage/scsiglue.c 3 additions, 0 deletionsdrivers/usb/storage/scsiglue.c
- include/scsi/scsi_device.h 1 addition, 0 deletionsinclude/scsi/scsi_device.h
Please register or sign in to comment