Patch "scsi: ufs: Fix unbalanced scsi_block_reqs_cnt caused by ufshcd_hold()" has been added to the 4.19-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    scsi: ufs: Fix unbalanced scsi_block_reqs_cnt caused by ufshcd_hold()

to the 4.19-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     scsi-ufs-fix-unbalanced-scsi_block_reqs_cnt-caused-b.patch
and it can be found in the queue-4.19 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit c1c983ddaca745f98a2f3db1ffba060fa164c6d7
Author: Can Guo <cang@xxxxxxxxxxxxxx>
Date:   Mon Nov 2 22:24:39 2020 -0800

    scsi: ufs: Fix unbalanced scsi_block_reqs_cnt caused by ufshcd_hold()
    
    [ Upstream commit da3fecb0040324c08f1587e5bff1f15f36be1872 ]
    
    The scsi_block_reqs_cnt increased in ufshcd_hold() is supposed to be
    decreased back in ufshcd_ungate_work() in a paired way. However, if
    specific ufshcd_hold/release sequences are met, it is possible that
    scsi_block_reqs_cnt is increased twice but only one ungate work is
    queued. To make sure scsi_block_reqs_cnt is handled by ufshcd_hold() and
    ufshcd_ungate_work() in a paired way, increase it only if queue_work()
    returns true.
    
    Link: https://lore.kernel.org/r/1604384682-15837-2-git-send-email-cang@xxxxxxxxxxxxxx
    Reviewed-by: Hongwu Su <hongwus@xxxxxxxxxxxxxx>
    Reviewed-by: Stanley Chu <stanley.chu@xxxxxxxxxxxx>
    Reviewed-by: Bean Huo <beanhuo@xxxxxxxxxx>
    Signed-off-by: Can Guo <cang@xxxxxxxxxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index b2cbdd01ab10b..a63119c35fde8 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1592,12 +1592,12 @@ int ufshcd_hold(struct ufs_hba *hba, bool async)
 		 * work and to enable clocks.
 		 */
 	case CLKS_OFF:
-		ufshcd_scsi_block_requests(hba);
 		hba->clk_gating.state = REQ_CLKS_ON;
 		trace_ufshcd_clk_gating(dev_name(hba->dev),
 					hba->clk_gating.state);
-		queue_work(hba->clk_gating.clk_gating_workq,
-			   &hba->clk_gating.ungate_work);
+		if (queue_work(hba->clk_gating.clk_gating_workq,
+			       &hba->clk_gating.ungate_work))
+			ufshcd_scsi_block_requests(hba);
 		/*
 		 * fall through to check if we should wait for this
 		 * work to be done or not.



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux