diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index c459164ade46..5f0e8bca3d3f 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -295,7 +295,6 @@ struct sdebug_dev_info { enum blk_zoned_model zmodel; unsigned int zcap; unsigned int zsize; - unsigned int zsize_shift; unsigned int nr_zones; unsigned int nr_conv_zones; unsigned int nr_seq_zones; @@ -2689,7 +2688,7 @@ static inline bool sdebug_dev_is_zoned(struct sdebug_dev_info *devip) static struct sdeb_zone_state *zbc_zone(struct sdebug_dev_info *devip, unsigned long long lba) { - u32 zno = lba >> devip->zsize_shift; + u32 zno = div_u64(lba, devip->zsize); struct sdeb_zone_state *zsp; if (devip->zcap == devip->zsize || zno < devip->nr_conv_zones) @@ -4922,6 +4921,14 @@ static void sdebug_q_cmd_wq_complete(struct work_struct *work) static bool got_shared_uuid; static uuid_t shared_uuid; +static bool sdebug_is_zone_start(struct sdebug_dev_info *devip, u64 zstart) +{ + u32 remainder; + + div_u64_rem(zstart, devip->zsize, &remainder); + return remainder == 0; +} + static int sdebug_device_create_zones(struct sdebug_dev_info *devip) { struct sdeb_zone_state *zsp; @@ -4946,10 +4953,6 @@ static int sdebug_device_create_zones(struct sdebug_dev_info *devip) return -EINVAL; } } else { - if (!is_power_of_2(sdeb_zbc_zone_size_mb)) { - pr_err("Zone size is not a power of 2\n"); - return -EINVAL; - } devip->zsize = (sdeb_zbc_zone_size_mb * SZ_1M) >> ilog2(sdebug_sector_size); if (devip->zsize >= capacity) { @@ -4958,8 +4961,7 @@ static int sdebug_device_create_zones(struct sdebug_dev_info *devip) } } - devip->zsize_shift = ilog2(devip->zsize); - devip->nr_zones = (capacity + devip->zsize - 1) >> devip->zsize_shift; + devip->nr_zones = div_u64(capacity + devip->zsize - 1, devip->zsize); if (sdeb_zbc_zone_cap_mb == 0) { devip->zcap = devip->zsize; @@ -4972,14 +4974,14 @@ static int sdebug_device_create_zones(struct sdebug_dev_info *devip) } } - conv_capacity = (sector_t)sdeb_zbc_nr_conv << devip->zsize_shift; + conv_capacity = (sector_t)sdeb_zbc_nr_conv * devip->zsize; if (conv_capacity >= capacity) { pr_err("Number of conventional zones too large\n"); return -EINVAL; } devip->nr_conv_zones = sdeb_zbc_nr_conv; - devip->nr_seq_zones = ALIGN(capacity - conv_capacity, devip->zsize) >> - devip->zsize_shift; + devip->nr_seq_zones = div_u64(capacity - conv_capacity + + devip->zsize - 1, devip->zsize); devip->nr_zones = devip->nr_conv_zones + devip->nr_seq_zones; /* Add gap zones if zone capacity is smaller than the zone size */ @@ -5010,7 +5012,7 @@ static int sdebug_device_create_zones(struct sdebug_dev_info *devip) zsp->z_wp = (sector_t)-1; zsp->z_size = min_t(u64, devip->zsize, capacity - zstart); - } else if ((zstart & (devip->zsize - 1)) == 0) { + } else if (sdebug_is_zone_start(devip, zstart)) { if (devip->zmodel == BLK_ZONED_HM) zsp->z_type = ZBC_ZTYPE_SWR; else