Message ID | 1609157080-26283-1-git-send-email-cang@codeaurora.org |
---|---|
State | New |
Headers | show |
Series | scsi: ufs: Correct the lun used in eh_device_reset_handler() callback | expand |
> Users can initiate resets to specific SCSI device/target/host through > IOCTL. When this happens, the SCSI cmd passed to eh_device/target/host > _reset_handler() callbacks is initialized with a request whose tag is -1. > So, in this case, it is not right for eh_device_reset_handler() callback > to count on the lun get from hba->lrb[-1]. Fix it by getting lun from the > SCSI device associated with the SCSI cmd. > > Signed-off-by: Can Guo <cang@codeaurora.org> Reviewed-by: Avri Altman <avri.altman@wdc.com> Btw, am surprised to see that you guys are still using sg_reset instead of ufs-utils? Thanks, Avri
On 2020-12-30 15:20, Avri Altman wrote: >> Users can initiate resets to specific SCSI device/target/host through >> IOCTL. When this happens, the SCSI cmd passed to eh_device/target/host >> _reset_handler() callbacks is initialized with a request whose tag is >> -1. >> So, in this case, it is not right for eh_device_reset_handler() >> callback >> to count on the lun get from hba->lrb[-1]. Fix it by getting lun from >> the >> SCSI device associated with the SCSI cmd. >> >> Signed-off-by: Can Guo <cang@codeaurora.org> > Reviewed-by: Avri Altman <avri.altman@wdc.com> > > Btw, am surprised to see that you guys are still using sg_reset > instead of ufs-utils? Hi Avri, We are not using any user layer tools at all. But I am confronted with many customers and tons of test teams inside and outside. I see all kinds of corner cases everyday, so not surprised at all. Thanks, Can Guo > > Thanks, > Avri
On Mon, 2020-12-28 at 04:04 -0800, Can Guo wrote: > Users can initiate resets to specific SCSI device/target/host through > IOCTL. When this happens, the SCSI cmd passed to eh_device/target/host > _reset_handler() callbacks is initialized with a request whose tag is -1. > So, in this case, it is not right for eh_device_reset_handler() callback > to count on the lun get from hba->lrb[-1]. Fix it by getting lun from the > SCSI device associated with the SCSI cmd. > > Signed-off-by: Can Guo <cang@codeaurora.org> Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
On Mon, 28 Dec 2020 04:04:36 -0800, Can Guo wrote: > Users can initiate resets to specific SCSI device/target/host through > IOCTL. When this happens, the SCSI cmd passed to eh_device/target/host > _reset_handler() callbacks is initialized with a request whose tag is -1. > So, in this case, it is not right for eh_device_reset_handler() callback > to count on the lun get from hba->lrb[-1]. Fix it by getting lun from the > SCSI device associated with the SCSI cmd. Applied to 5.11/scsi-fixes, thanks! [1/1] scsi: ufs: Correct the lun used in eh_device_reset_handler() callback https://git.kernel.org/mkp/scsi/c/35fc4cd34426 -- Martin K. Petersen Oracle Linux Engineering
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 98093a5..d577cda 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -6604,19 +6604,16 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd) { struct Scsi_Host *host; struct ufs_hba *hba; - unsigned int tag; u32 pos; int err; - u8 resp = 0xF; - struct ufshcd_lrb *lrbp; + u8 resp = 0xF, lun; unsigned long flags; host = cmd->device->host; hba = shost_priv(host); - tag = cmd->request->tag; - lrbp = &hba->lrb[tag]; - err = ufshcd_issue_tm_cmd(hba, lrbp->lun, 0, UFS_LOGICAL_RESET, &resp); + lun = ufshcd_scsi_to_upiu_lun(cmd->device->lun); + err = ufshcd_issue_tm_cmd(hba, lun, 0, UFS_LOGICAL_RESET, &resp); if (err || resp != UPIU_TASK_MANAGEMENT_FUNC_COMPL) { if (!err) err = resp; @@ -6625,7 +6622,7 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd) /* clear the commands that were pending for corresponding LUN */ for_each_set_bit(pos, &hba->outstanding_reqs, hba->nutrs) { - if (hba->lrb[pos].lun == lrbp->lun) { + if (hba->lrb[pos].lun == lun) { err = ufshcd_clear_cmd(hba, pos); if (err) break;
Users can initiate resets to specific SCSI device/target/host through IOCTL. When this happens, the SCSI cmd passed to eh_device/target/host _reset_handler() callbacks is initialized with a request whose tag is -1. So, in this case, it is not right for eh_device_reset_handler() callback to count on the lun get from hba->lrb[-1]. Fix it by getting lun from the SCSI device associated with the SCSI cmd. Signed-off-by: Can Guo <cang@codeaurora.org>