scsi: sd: Consider max_xfer_blocks if opt_xfer_blocks is unusable
authorFam Zheng <famz@redhat.com>
Tue, 28 Mar 2017 04:41:26 +0000 (12:41 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 7 Apr 2017 21:05:15 +0000 (17:05 -0400)
If device reports a small max_xfer_blocks and a zero opt_xfer_blocks, we
end up using BLK_DEF_MAX_SECTORS, which is wrong and r/w of that size
may get error.

[mkp: tweaked to avoid setting rw_max twice and added typecast]

Cc: <stable@vger.kernel.org> # v4.4+
Fixes: ca369d51b3e ("block/sd: Fix device-imposed transfer length limits")
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/sd.c

index fb9b4d29af0b0394abac4169c53e292efc214725..906cd6bfa2a977aa57754ef1e289cc84774d8831 100644 (file)
@@ -2956,7 +2956,8 @@ static int sd_revalidate_disk(struct gendisk *disk)
                q->limits.io_opt = logical_to_bytes(sdp, sdkp->opt_xfer_blocks);
                rw_max = logical_to_sectors(sdp, sdkp->opt_xfer_blocks);
        } else
-               rw_max = BLK_DEF_MAX_SECTORS;
+               rw_max = min_not_zero(logical_to_sectors(sdp, dev_max),
+                                     (sector_t)BLK_DEF_MAX_SECTORS);
 
        /* Combine with controller limits */
        q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q));