Skip to content

Commit fd78874

Browse files
keithbuschaxboe
authored andcommitted
null_blk: use zone status for max active/open
The block layer provides special status codes when requests go beyond the zone resource limits. Use these codes instead of the generic IOERR for requests that exceed the max active or open limits the null_blk device was configured with so that applications know how these special conditions should be handled. Signed-off-by: Keith Busch <kbusch@kernel.org> Reviewed-by: Niklas Cassel <niklas.cassel@wdc.com> Cc: Damien Le Moal <damien.lemoal@wdc.com> Cc: Niklas Cassel <niklas.cassel@wdc.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent cb3a92d commit fd78874

1 file changed

Lines changed: 43 additions & 26 deletions

File tree

drivers/block/null_blk_zoned.c

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -220,29 +220,34 @@ static void null_close_first_imp_zone(struct nullb_device *dev)
220220
}
221221
}
222222

223-
static bool null_can_set_active(struct nullb_device *dev)
223+
static blk_status_t null_check_active(struct nullb_device *dev)
224224
{
225225
if (!dev->zone_max_active)
226-
return true;
226+
return BLK_STS_OK;
227+
228+
if (dev->nr_zones_exp_open + dev->nr_zones_imp_open +
229+
dev->nr_zones_closed < dev->zone_max_active)
230+
return BLK_STS_OK;
227231

228-
return dev->nr_zones_exp_open + dev->nr_zones_imp_open +
229-
dev->nr_zones_closed < dev->zone_max_active;
232+
return BLK_STS_ZONE_ACTIVE_RESOURCE;
230233
}
231234

232-
static bool null_can_open(struct nullb_device *dev)
235+
static blk_status_t null_check_open(struct nullb_device *dev)
233236
{
234237
if (!dev->zone_max_open)
235-
return true;
238+
return BLK_STS_OK;
236239

237240
if (dev->nr_zones_exp_open + dev->nr_zones_imp_open < dev->zone_max_open)
238-
return true;
241+
return BLK_STS_OK;
239242

240-
if (dev->nr_zones_imp_open && null_can_set_active(dev)) {
241-
null_close_first_imp_zone(dev);
242-
return true;
243+
if (dev->nr_zones_imp_open) {
244+
if (null_check_active(dev) == BLK_STS_OK) {
245+
null_close_first_imp_zone(dev);
246+
return BLK_STS_OK;
247+
}
243248
}
244249

245-
return false;
250+
return BLK_STS_ZONE_OPEN_RESOURCE;
246251
}
247252

248253
/*
@@ -258,19 +263,22 @@ static bool null_can_open(struct nullb_device *dev)
258263
* it is not certain that closing an implicit open zone will allow a new zone
259264
* to be opened, since we might already be at the active limit capacity.
260265
*/
261-
static bool null_has_zone_resources(struct nullb_device *dev, struct blk_zone *zone)
266+
static blk_status_t null_check_zone_resources(struct nullb_device *dev, struct blk_zone *zone)
262267
{
268+
blk_status_t ret;
269+
263270
switch (zone->cond) {
264271
case BLK_ZONE_COND_EMPTY:
265-
if (!null_can_set_active(dev))
266-
return false;
272+
ret = null_check_active(dev);
273+
if (ret != BLK_STS_OK)
274+
return ret;
267275
fallthrough;
268276
case BLK_ZONE_COND_CLOSED:
269-
return null_can_open(dev);
277+
return null_check_open(dev);
270278
default:
271279
/* Should never be called for other states */
272280
WARN_ON(1);
273-
return false;
281+
return BLK_STS_IOERR;
274282
}
275283
}
276284

@@ -293,8 +301,9 @@ static blk_status_t null_zone_write(struct nullb_cmd *cmd, sector_t sector,
293301
return BLK_STS_IOERR;
294302
case BLK_ZONE_COND_EMPTY:
295303
case BLK_ZONE_COND_CLOSED:
296-
if (!null_has_zone_resources(dev, zone))
297-
return BLK_STS_IOERR;
304+
ret = null_check_zone_resources(dev, zone);
305+
if (ret != BLK_STS_OK)
306+
return ret;
298307
break;
299308
case BLK_ZONE_COND_IMP_OPEN:
300309
case BLK_ZONE_COND_EXP_OPEN:
@@ -349,6 +358,8 @@ static blk_status_t null_zone_write(struct nullb_cmd *cmd, sector_t sector,
349358

350359
static blk_status_t null_open_zone(struct nullb_device *dev, struct blk_zone *zone)
351360
{
361+
blk_status_t ret;
362+
352363
if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
353364
return BLK_STS_IOERR;
354365

@@ -357,15 +368,17 @@ static blk_status_t null_open_zone(struct nullb_device *dev, struct blk_zone *zo
357368
/* open operation on exp open is not an error */
358369
return BLK_STS_OK;
359370
case BLK_ZONE_COND_EMPTY:
360-
if (!null_has_zone_resources(dev, zone))
361-
return BLK_STS_IOERR;
371+
ret = null_check_zone_resources(dev, zone);
372+
if (ret != BLK_STS_OK)
373+
return ret;
362374
break;
363375
case BLK_ZONE_COND_IMP_OPEN:
364376
dev->nr_zones_imp_open--;
365377
break;
366378
case BLK_ZONE_COND_CLOSED:
367-
if (!null_has_zone_resources(dev, zone))
368-
return BLK_STS_IOERR;
379+
ret = null_check_zone_resources(dev, zone);
380+
if (ret != BLK_STS_OK)
381+
return ret;
369382
dev->nr_zones_closed--;
370383
break;
371384
case BLK_ZONE_COND_FULL:
@@ -381,6 +394,8 @@ static blk_status_t null_open_zone(struct nullb_device *dev, struct blk_zone *zo
381394

382395
static blk_status_t null_finish_zone(struct nullb_device *dev, struct blk_zone *zone)
383396
{
397+
blk_status_t ret;
398+
384399
if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
385400
return BLK_STS_IOERR;
386401

@@ -389,8 +404,9 @@ static blk_status_t null_finish_zone(struct nullb_device *dev, struct blk_zone *
389404
/* finish operation on full is not an error */
390405
return BLK_STS_OK;
391406
case BLK_ZONE_COND_EMPTY:
392-
if (!null_has_zone_resources(dev, zone))
393-
return BLK_STS_IOERR;
407+
ret = null_check_zone_resources(dev, zone);
408+
if (ret != BLK_STS_OK)
409+
return ret;
394410
break;
395411
case BLK_ZONE_COND_IMP_OPEN:
396412
dev->nr_zones_imp_open--;
@@ -399,8 +415,9 @@ static blk_status_t null_finish_zone(struct nullb_device *dev, struct blk_zone *
399415
dev->nr_zones_exp_open--;
400416
break;
401417
case BLK_ZONE_COND_CLOSED:
402-
if (!null_has_zone_resources(dev, zone))
403-
return BLK_STS_IOERR;
418+
ret = null_check_zone_resources(dev, zone);
419+
if (ret != BLK_STS_OK)
420+
return ret;
404421
dev->nr_zones_closed--;
405422
break;
406423
default:

0 commit comments

Comments
 (0)