[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