diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c index 6ab27f4f4878..da7e92e51b10 100644 --- a/drivers/scsi/sd_zbc.c +++ b/drivers/scsi/sd_zbc.c @@ -306,7 +306,7 @@ static blk_status_t sd_zbc_cmnd_checks(struct scsi_cmnd *cmd) if (sdkp->device->changed) return BLK_STS_IOERR; - if (sector & (sd_zbc_zone_sectors(sdkp) - 1)) + if (!bdev_is_zone_start(sdkp->disk->part0, sector)) /* Unaligned request */ return BLK_STS_IOERR; @@ -506,13 +506,6 @@ static int sd_zbc_check_capacity(struct scsi_disk *sdkp, unsigned char *buf, zone_blocks = sdkp->zone_starting_lba_gran; } - if (!is_power_of_2(zone_blocks)) { - sd_printk(KERN_ERR, sdkp, - "Zone size %llu is not a power of two.\n", - zone_blocks); - return -EINVAL; - } - *zblocks = zone_blocks; return 0; @@ -520,10 +513,13 @@ static int sd_zbc_check_capacity(struct scsi_disk *sdkp, unsigned char *buf, static void sd_zbc_print_zones(struct scsi_disk *sdkp) { + u64 remainder; + if (sdkp->device->type != TYPE_ZBC || !sdkp->capacity) return; - if (sdkp->capacity & (sdkp->zone_info.zone_blocks - 1)) + div64_u64_rem(sdkp->capacity, sdkp->zone_info.zone_blocks, &remainder); + if (remainder) sd_printk(KERN_NOTICE, sdkp, "%u zones of %u logical blocks + 1 runt zone\n", sdkp->zone_info.nr_zones - 1, @@ -622,7 +618,8 @@ int sd_zbc_read_zones(struct scsi_disk *sdkp, struct queue_limits *lim, if (ret != 0) goto err; - nr_zones = round_up(sdkp->capacity, zone_blocks) >> ilog2(zone_blocks); + nr_zones = div64_u64(sdkp->capacity + zone_blocks - 1, zone_blocks); + sdkp->early_zone_info.nr_zones = nr_zones; sdkp->early_zone_info.zone_blocks = zone_blocks;