@@ -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
350359static 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
382395static 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