mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
ANDROID: scsi: scsi_debug: Support npo2 zone sizes
Remove the restriction that the zone size must be a power of two. Bug: 197782466 Bug: 269471019 Change-Id: I7bd9c8f19ec601b82e0e1c271c3e362ddaf9a0ed Signed-off-by: Bart Van Assche <bvanassche@google.com>
This commit is contained in:
committed by
Treehugger Robot
parent
3236bf4f10
commit
7dadc51d98
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user