null_blk: Simplify null_zone_write()

In null_zone_write, we do not need to first check if the target zone
condition is FULL, READONLY or OFFLINE: for theses conditions, the check
of the command sector against the zone write pointer will always result
in the command failing. Remove these checks.

We still however need to check that the target zone write pointer is not
invalid for zone append operations. To do so, add the macro
NULL_ZONE_INVALID_WP and use it in null_set_zone_cond() when changing a
zone to READONLY or OFFLINE condition.

Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Link: https://lore.kernel.org/r/20240411085502.728558-4-dlemoal@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Damien Le Moal 2024-04-11 17:55:02 +09:00 committed by Jens Axboe
parent 3bdde0701e
commit e994ff5b55

View File

@ -9,6 +9,8 @@
#undef pr_fmt
#define pr_fmt(fmt) "null_blk: " fmt
#define NULL_ZONE_INVALID_WP ((sector_t)-1)
static inline sector_t mb_to_sects(unsigned long mb)
{
return ((sector_t)mb * SZ_1M) >> SECTOR_SHIFT;
@ -341,9 +343,6 @@ static blk_status_t null_zone_write(struct nullb_cmd *cmd, sector_t sector,
trace_nullb_zone_op(cmd, zno, zone->cond);
if (WARN_ON_ONCE(append && !dev->zone_append_max_sectors))
return BLK_STS_IOERR;
if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL) {
if (append)
return BLK_STS_IOERR;
@ -352,29 +351,26 @@ static blk_status_t null_zone_write(struct nullb_cmd *cmd, sector_t sector,
null_lock_zone(dev, zone);
if (zone->cond == BLK_ZONE_COND_FULL ||
zone->cond == BLK_ZONE_COND_READONLY ||
zone->cond == BLK_ZONE_COND_OFFLINE) {
/* Cannot write to the zone */
ret = BLK_STS_IOERR;
goto unlock_zone;
}
/*
* Regular writes must be at the write pointer position.
* Zone append writes are automatically issued at the write
* pointer and the position returned using the request or BIO
* sector.
* Regular writes must be at the write pointer position. Zone append
* writes are automatically issued at the write pointer and the position
* returned using the request sector. Note that we do not check the zone
* condition because for FULL, READONLY and OFFLINE zones, the sector
* check against the zone write pointer will always result in failing
* the command.
*/
if (append) {
if (WARN_ON_ONCE(!dev->zone_append_max_sectors) ||
zone->wp == NULL_ZONE_INVALID_WP) {
ret = BLK_STS_IOERR;
goto unlock_zone;
}
sector = zone->wp;
blk_mq_rq_from_pdu(cmd)->__sector = sector;
} else if (sector != zone->wp) {
ret = BLK_STS_IOERR;
goto unlock_zone;
}
if (zone->wp + nr_sectors > zone->start + zone->capacity) {
if (sector != zone->wp ||
zone->wp + nr_sectors > zone->start + zone->capacity) {
ret = BLK_STS_IOERR;
goto unlock_zone;
}
@ -743,7 +739,7 @@ static void null_set_zone_cond(struct nullb_device *dev,
zone->cond != BLK_ZONE_COND_OFFLINE)
null_finish_zone(dev, zone);
zone->cond = cond;
zone->wp = (sector_t)-1;
zone->wp = NULL_ZONE_INVALID_WP;
}
null_unlock_zone(dev, zone);