On 24/05/23 23:36, Bart Van Assche wrote: > ufshcd_queuecommand() may be called two times in a row for a SCSI > command before it is completed. Hence make the following changes: > - In the functions that submit a command, do not check the old value of > lrbp->cmd nor clear lrbp->cmd in error paths. > - In ufshcd_release_scsi_cmd(), do not clear lrbp->cmd. > > See also scsi_send_eh_cmnd(). > > This patch prevents that the following appears if a command times out: > > WARNING: at drivers/ufs/core/ufshcd.c:2965 ufshcd_queuecommand+0x6f8/0x9a8 > Call trace: > ufshcd_queuecommand+0x6f8/0x9a8 > scsi_send_eh_cmnd+0x2c0/0x960 > scsi_eh_test_devices+0x100/0x314 > scsi_eh_ready_devs+0xd90/0x114c > scsi_error_handler+0x2b4/0xb70 > kthread+0x16c/0x1e0 > > Fixes: 5a0b0cb9bee7 ("[SCSI] ufs: Add support for sending NOP OUT UPIU") > Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx> Acked-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> > --- > drivers/ufs/core/ufshcd.c | 7 +------ > 1 file changed, 1 insertion(+), 6 deletions(-) > > diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c > index dc4b047db27e..3a7598120d23 100644 > --- a/drivers/ufs/core/ufshcd.c > +++ b/drivers/ufs/core/ufshcd.c > @@ -2931,7 +2931,6 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) > (hba->clk_gating.state != CLKS_ON)); > > lrbp = &hba->lrb[tag]; > - WARN_ON(lrbp->cmd); > lrbp->cmd = cmd; > lrbp->task_tag = tag; > lrbp->lun = ufshcd_scsi_to_upiu_lun(cmd->device->lun); > @@ -2947,7 +2946,6 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) > > err = ufshcd_map_sg(hba, lrbp); > if (err) { > - lrbp->cmd = NULL; > ufshcd_release(hba); > goto out; > } > @@ -3166,7 +3164,7 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba, > down_read(&hba->clk_scaling_lock); > > lrbp = &hba->lrb[tag]; > - WARN_ON(lrbp->cmd); > + lrbp->cmd = NULL; > err = ufshcd_compose_dev_cmd(hba, lrbp, cmd_type, tag); > if (unlikely(err)) > goto out; > @@ -5408,7 +5406,6 @@ static void ufshcd_release_scsi_cmd(struct ufs_hba *hba, > struct scsi_cmnd *cmd = lrbp->cmd; > > scsi_dma_unmap(cmd); > - lrbp->cmd = NULL; /* Mark the command as completed. */ > ufshcd_release(hba); > ufshcd_clk_scaling_update_busy(hba); > } > @@ -7023,7 +7020,6 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba, > down_read(&hba->clk_scaling_lock); > > lrbp = &hba->lrb[tag]; > - WARN_ON(lrbp->cmd); > lrbp->cmd = NULL; > lrbp->task_tag = tag; > lrbp->lun = 0; > @@ -7195,7 +7191,6 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r > down_read(&hba->clk_scaling_lock); > > lrbp = &hba->lrb[tag]; > - WARN_ON(lrbp->cmd); > lrbp->cmd = NULL; > lrbp->task_tag = tag; > lrbp->lun = UFS_UPIU_RPMB_WLUN;