Commit 5c79097a authored by Tom Yan's avatar Tom Yan Committed by Tejun Heo

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: default avatarTom Yan <tom.ty89@gmail.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent f086b748
...@@ -3310,7 +3310,13 @@ static unsigned int ata_scsi_write_same_xlat(struct ata_queued_cmd *qc) ...@@ -3310,7 +3310,13 @@ static unsigned int ata_scsi_write_same_xlat(struct ata_queued_cmd *qc)
goto invalid_param_len; goto invalid_param_len;
buf = page_address(sg_page(scsi_sglist(scmd))); 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)) { if (ata_ncq_enabled(dev) && ata_fpdma_dsm_supported(dev)) {
/* Newer devices support queued TRIM commands */ /* Newer devices support queued TRIM commands */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment