summaryrefslogtreecommitdiff
path: root/drivers/ata
diff options
context:
space:
mode:
authorTom Yan <tom.ty89@gmail.com>2016-07-12 23:31:22 +0300
committerTejun Heo <tj@kernel.org>2016-07-12 23:37:13 +0300
commit5c79097a28c2525740dd9e4470676ec9d25bee45 (patch)
tree438017e16c167c249e87bd4e068ee6e80392be64 /drivers/ata
parentf086b7489a4ced0067ed39766146b60ff1fe4b9d (diff)
downloadlinux-5c79097a28c2525740dd9e4470676ec9d25bee45.tar.xz
libata-scsi: reject WRITE SAME (16) with n_block that exceeds limit
Currently if a WRITE SAME (16) command is issued to the SATL with "number of blocks" that is larger than the "Maximum write same length" (which is the maximum number of blocks per TRIM command allowed in libata, currently 65535 * 512 / 8 blocks), the SATL will accept the command and translate it to a TRIM command with the upper limit. However, according to SBC (as of sbc4r11.pdf), the "device server" should terminate the command with "Invalid field in CDB" in that case. Signed-off-by: Tom Yan <tom.ty89@gmail.com> Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-scsi.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index f0593bc2f97d..b0ca32228d3f 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -3310,7 +3310,13 @@ static unsigned int ata_scsi_write_same_xlat(struct ata_queued_cmd *qc)
goto invalid_param_len;
buf = page_address(sg_page(scsi_sglist(scmd)));
- size = ata_set_lba_range_entries(buf, 512, block, n_block);
+
+ if (n_block <= 65535 * 512 / 8) {
+ size = ata_set_lba_range_entries(buf, 512, block, n_block);
+ } else {
+ fp = 2;
+ goto invalid_fld;
+ }
if (ata_ncq_enabled(dev) && ata_fpdma_dsm_supported(dev)) {
/* Newer devices support queued TRIM commands */