[PATCH v3 5/7] scsi: ufs: core: Fix double release in ufshcd_eh_timed_out()
From: Stanley Jhu
Date: Tue Oct 20 2026 - 04:26:35 EST
In SDB mode, a command that times out during a power management
operation can be released twice:
1. The command times out while its normal completion is running.
2. The completion path clears BIT(rq->tag) in hba->outstanding_reqs and
releases the command. It has not called scsi_done() yet, so
SCMD_STATE_COMPLETE is still clear.
3. ufshcd_eh_timed_out() recovers the link, sees SCMD_STATE_COMPLETE
clear, clears BIT(rq->tag) in hba->outstanding_reqs without checking
whether it was still set, and releases the same command a second
time.
Return SCSI_EH_DONE when ufshcd_clear_outstanding_reqs() returns 0, as
another path has already claimed the command.
Fixes: 01d5e237b339 ("scsi: ufs: core: Handle PM commands timeout before SCSI EH")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Stanley Jhu <stanleyjhu@xxxxxxxxxx>
---
drivers/ufs/core/ufshcd.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 03efbd85bba9..111f5805f178 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -9653,7 +9653,8 @@ static enum scsi_timeout_action ufshcd_eh_timed_out(struct scsi_cmnd *scmd)
if (!hba->mcq_enabled) {
struct request *rq = scsi_cmd_to_rq(scmd);
- ufshcd_clear_outstanding_reqs(hba, BIT(rq->tag));
+ if (!ufshcd_clear_outstanding_reqs(hba, BIT(rq->tag)))
+ return SCSI_EH_DONE;
}
if (ufshcd_is_scsi_cmd(scmd)) {
--
2.56.0.212.g129ede20d9-goog