sd_zbc: Force use of READ16/WRITE16
authorDamien Le Moal <damien.lemoal@wdc.com>
Fri, 11 Nov 2016 05:53:26 +0000 (14:53 +0900)
committerJens Axboe <axboe@fb.com>
Mon, 14 Nov 2016 20:16:42 +0000 (13:16 -0700)
Normally, sd_read_capacity sets sdp->use_16_for_rw to 1 based on the
disk capacity so that READ16/WRITE16 are used for large drives.
However, for a zoned disk with RC_BASIS set to 0, the capacity reported
through READ_CAPACITY may be very small, leading to use_16_for_rw not being
set and READ10/WRITE10 commands being used, even after the actual zoned disk
capacity is corrected in sd_zbc_read_zones. This causes LBA offset overflow for
accesses beyond 2TB.

As the ZBC standard makes it mandatory for ZBC drives to support
the READ16/WRITE16 commands anyway, make sure that use_16_for_rw is set.

Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
eviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/scsi/sd_zbc.c

index 394ab490919c6b892f7696a75b8144dd7fd63e1e..92620c8ea8ad93722c466652a4b82cd43013d8a8 100644 (file)
@@ -612,6 +612,10 @@ int sd_zbc_read_zones(struct scsi_disk *sdkp,
        if (ret)
                goto err;
 
+       /* READ16/WRITE16 is mandatory for ZBC disks */
+       sdkp->device->use_16_for_rw = 1;
+       sdkp->device->use_10_for_rw = 0;
+
        return 0;
 
 err: