OSDN Git Service

scsi: sd: sd_zbc: Use logical blocks as unit when querying zones
authorDamien Le Moal <damien.lemoal@opensource.wdc.com>
Thu, 21 Apr 2022 18:30:17 +0000 (11:30 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 26 Apr 2022 03:23:04 +0000 (23:23 -0400)
When querying zones, track the position in logical blocks instead of in
sectors. This change slightly simplifies sd_zbc_report_zones().

Link: https://lore.kernel.org/r/20220421183023.3462291-4-bvanassche@acm.org
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Acked-by: Douglas Gilbert <dgilbert@interlog.com>
Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
[ bvanassche: extracted this change from a larger patch ]
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/sd_zbc.c

index 9ef5ad3..e76bcbf 100644 (file)
@@ -224,7 +224,7 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,
                        unsigned int nr_zones, report_zones_cb cb, void *data)
 {
        struct scsi_disk *sdkp = scsi_disk(disk);
-       sector_t capacity = logical_to_sectors(sdkp->device, sdkp->capacity);
+       sector_t lba = sectors_to_logical(sdkp->device, sector);
        unsigned int nr, i;
        unsigned char *buf;
        size_t offset, buflen = 0;
@@ -235,7 +235,7 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,
                /* Not a zoned device */
                return -EOPNOTSUPP;
 
-       if (!capacity)
+       if (!sdkp->capacity)
                /* Device gone or invalid */
                return -ENODEV;
 
@@ -243,9 +243,8 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,
        if (!buf)
                return -ENOMEM;
 
-       while (zone_idx < nr_zones && sector < capacity) {
-               ret = sd_zbc_do_report_zones(sdkp, buf, buflen,
-                               sectors_to_logical(sdkp->device, sector), true);
+       while (zone_idx < nr_zones && lba < sdkp->capacity) {
+               ret = sd_zbc_do_report_zones(sdkp, buf, buflen, lba, true);
                if (ret)
                        goto out;
 
@@ -263,7 +262,7 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,
                        zone_idx++;
                }
 
-               sector += sd_zbc_zone_sectors(sdkp) * i;
+               lba += sdkp->zone_blocks * i;
        }
 
        ret = zone_idx;