diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2020-10-02 14:34:52 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-10-02 14:34:52 -0700 | 
| commit | f016a5405234709938b38e965e02950e51084ac3 (patch) | |
| tree | b1e592fad0290d49f30e7607e880ae31ce52f217 /block | |
| parent | d4fce2e20ffed59eb5db7780fcbbb0a21decef74 (diff) | |
| parent | 632bfb6323799c087fcb4108dfe59518609667a7 (diff) | |
| download | linux-f016a5405234709938b38e965e02950e51084ac3.tar.bz2 | |
Merge tag 'block-5.9-2020-10-02' of git://git.kernel.dk/linux-block
Pull block fix from Jens Axboe:
 "Single fix for a ->commit_rqs failure case"
* tag 'block-5.9-2020-10-02' of git://git.kernel.dk/linux-block:
  blk-mq: call commit_rqs while list empty but error happen
Diffstat (limited to 'block')
| -rw-r--r-- | block/blk-mq.c | 18 | 
1 files changed, 9 insertions, 9 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c index b3d2785eefe9..cdced4aca2e8 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1412,6 +1412,11 @@ out:  	hctx->dispatched[queued_to_index(queued)]++; +	/* If we didn't flush the entire list, we could have told the driver +	 * there was more coming, but that turned out to be a lie. +	 */ +	if ((!list_empty(list) || errors) && q->mq_ops->commit_rqs && queued) +		q->mq_ops->commit_rqs(hctx);  	/*  	 * Any items that need requeuing? Stuff them into hctx->dispatch,  	 * that is where we will continue on next queue run. @@ -1425,14 +1430,6 @@ out:  		blk_mq_release_budgets(q, nr_budgets); -		/* -		 * If we didn't flush the entire list, we could have told -		 * the driver there was more coming, but that turned out to -		 * be a lie. -		 */ -		if (q->mq_ops->commit_rqs && queued) -			q->mq_ops->commit_rqs(hctx); -  		spin_lock(&hctx->lock);  		list_splice_tail_init(list, &hctx->dispatch);  		spin_unlock(&hctx->lock); @@ -2079,6 +2076,7 @@ void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,  		struct list_head *list)  {  	int queued = 0; +	int errors = 0;  	while (!list_empty(list)) {  		blk_status_t ret; @@ -2095,6 +2093,7 @@ void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,  				break;  			}  			blk_mq_end_request(rq, ret); +			errors++;  		} else  			queued++;  	} @@ -2104,7 +2103,8 @@ void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,  	 * the driver there was more coming, but that turned out to  	 * be a lie.  	 */ -	if (!list_empty(list) && hctx->queue->mq_ops->commit_rqs && queued) +	if ((!list_empty(list) || errors) && +	     hctx->queue->mq_ops->commit_rqs && queued)  		hctx->queue->mq_ops->commit_rqs(hctx);  }  |