| From 70a7eb9aed3c28b6361ad464ecb02f2f68006b65 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 8 May 2020 09:22:27 +0300 |
| Subject: mmc: block: Fix request completion in the CQE timeout path |
| |
| From: Adrian Hunter <adrian.hunter@intel.com> |
| |
| [ Upstream commit c077dc5e0620508a29497dac63a2822324ece52a ] |
| |
| First, it should be noted that the CQE timeout (60 seconds) is substantial |
| so a CQE request that times out is really stuck, and the race between |
| timeout and completion is extremely unlikely. Nevertheless this patch |
| fixes an issue with it. |
| |
| Commit ad73d6feadbd7b ("mmc: complete requests from ->timeout") |
| preserved the existing functionality, to complete the request. |
| However that had only been necessary because the block layer |
| timeout handler had been marking the request to prevent it from being |
| completed normally. That restriction was removed at the same time, the |
| result being that a request that has gone will have been completed anyway. |
| That is, the completion was unnecessary. |
| |
| At the time, the unnecessary completion was harmless because the block |
| layer would ignore it, although that changed in kernel v5.0. |
| |
| Note for stable, this patch will not apply cleanly without patch "mmc: |
| core: Fix recursive locking issue in CQE recovery path" |
| |
| Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> |
| Fixes: ad73d6feadbd7b ("mmc: complete requests from ->timeout") |
| Cc: stable@vger.kernel.org |
| Link: https://lore.kernel.org/r/20200508062227.23144-1-adrian.hunter@intel.com |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mmc/core/queue.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c |
| index 4d1e468d39823..9c0ccb3744c28 100644 |
| --- a/drivers/mmc/core/queue.c |
| +++ b/drivers/mmc/core/queue.c |
| @@ -110,8 +110,7 @@ static enum blk_eh_timer_return mmc_cqe_timed_out(struct request *req) |
| mmc_cqe_recovery_notifier(mrq); |
| return BLK_EH_RESET_TIMER; |
| } |
| - /* No timeout (XXX: huh? comment doesn't make much sense) */ |
| - blk_mq_complete_request(req); |
| + /* The request has gone already */ |
| return BLK_EH_DONE; |
| default: |
| /* Timeout is handled by mmc core */ |
| -- |
| 2.20.1 |
| |