[PATCH v3 1/3] block: introduce zone_write_granularity limit
Damien Le Moal
Damien.LeMoal at wdc.com
Fri Jan 22 03:56:58 EST 2021
On 2021/01/22 17:42, Christoph Hellwig wrote:
>> @@ -864,18 +891,20 @@ void blk_queue_set_zoned(struct gendisk *disk, enum blk_zoned_model model)
>> * partitions and zoned block device support is enabled, else
>> * we do nothing special as far as the block layer is concerned.
>> */
>> - if (!IS_ENABLED(CONFIG_BLK_DEV_ZONED) ||
>> - disk_has_partitions(disk))
>> - model = BLK_ZONED_NONE;
>> - break;
>> + if (IS_ENABLED(CONFIG_BLK_DEV_ZONED) &&
>> + !disk_has_partitions(disk))
>> + break;
>> + model = BLK_ZONED_NONE;
>> + fallthrough;
>> case BLK_ZONED_NONE:
>> default:
>> if (WARN_ON_ONCE(model != BLK_ZONED_NONE))
>> model = BLK_ZONED_NONE;
>> + q->limits.zone_write_granularity = 0;
>> break;
>> }
>>
>> - disk->queue->limits.zoned = model;
>> + q->limits.zoned = model;
>> }
>
> This looks a little strange. If we special case zoned vs not zoned
> here anyway, why not set the zone_write_granularity to the logical
> block size here by default.
The convention is zone_write_granularity == 0 for the BLK_ZONED_NONE case. Hence
the reset here if we force the zoned model to none for HA drives. This way, this
does not create a special case for HA drives used as regular disks.
Of note is that there is something a little weird in the sd_zbc.c code that
needs fixing: blk_queue_set_zoned() is called before sd_zbc_read_zones() is
executed and that function will check the zones of an HA drive and set the queue
nr_zones and max zone append sectors, even if blk_queue_set_zoned() set the
zoned model to none due to partitions. That makes the BLK_ZONED_NONE case of HA
drives a little weird since zone information is visible and correct but the
model says "none". As long as users separate zoned vs not-zoned cases by looking
at the zoned model, this does not create any problem, but that is not pretty.
Will send a separate patch to clean that up and have something consistent with
regular disks for this special HA case. The above blk_queue_set_zoned() function
can be used to cleanup the zones information for an HA drive that is used as a
regular disk (nr_zones, zone append sectors and zone bitmaps).
--
Damien Le Moal
Western Digital Research
More information about the Linux-nvme
mailing list