On Wed, Apr 15, 2020 at 06:05:06PM +0900, Johannes Thumshirn wrote: > @@ -1206,6 +1219,7 @@ bool blk_mq_dispatch_rq_list(struct request_queue *q, struct list_head *list, > bool no_tag = false; > int errors, queued; > blk_status_t ret = BLK_STS_OK; > + LIST_HEAD(zone_list); > > if (list_empty(list)) > return false; > @@ -1264,6 +1278,16 @@ bool blk_mq_dispatch_rq_list(struct request_queue *q, struct list_head *list, > if (ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE) { > blk_mq_handle_dev_resource(rq, list); > break; > + } else if (ret == BLK_STS_ZONE_RESOURCE) { > + /* > + * Move the request to zone_list and keep going through > + * the dispatch list to find more requests the drive can > + * accept. > + */ > + blk_mq_handle_zone_resource(rq, &zone_list); > + if (list_empty(list)) > + break; > + continue; > } Stupid question. At the end of this function I see: /* * If the host/device is unable to accept more work, inform the * caller of that. */ if (ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE) return false; Why is BLK_STS_ZONE_RESOURCE missing?