All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 1/2] libata-scsi: reject WRITE SAME (16) with n_block that exceeds limit
@ 2016-07-06 16:55 tom.ty89
  0 siblings, 0 replies; only message in thread
From: tom.ty89 @ 2016-07-06 16:55 UTC (permalink / raw)
  To: tj, martin.petersen, sergei.shtylyov; +Cc: linux-ide, linux-scsi, Tom Yan

From: Tom Yan <tom.ty89@gmail.com>

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 CBD" in that case.

Signed-off-by: Tom Yan <tom.ty89@gmail.com>

diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index bfec66f..a1f061a 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -3305,7 +3305,11 @@ 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
+		goto invalid_fld;
 
 	if (ata_ncq_enabled(dev) && ata_fpdma_dsm_supported(dev)) {
 		/* Newer devices support queued TRIM commands */
-- 
2.9.0


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2016-07-06 16:55 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-06 16:55 [PATCH v4 1/2] libata-scsi: reject WRITE SAME (16) with n_block that exceeds limit tom.ty89

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.