scsi: ufs: Correct the LUN used in eh_device_reset_handler() callback
[ Upstream commit 35fc4cd34426c242ab015ef280853b7bff101f48 ] 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. 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. Link: https://lore.kernel.org/r/1609157080-26283-1-git-send-email-cang@codeaurora.org Reviewed-by: Avri Altman <avri.altman@wdc.com> Reviewed-by: Stanley Chu <stanley.chu@mediatek.com> Signed-off-by: Can Guo <cang@codeaurora.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
b477f43710
commit
97853a7eae
|
@ -5980,19 +5980,16 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
|
||||||
{
|
{
|
||||||
struct Scsi_Host *host;
|
struct Scsi_Host *host;
|
||||||
struct ufs_hba *hba;
|
struct ufs_hba *hba;
|
||||||
unsigned int tag;
|
|
||||||
u32 pos;
|
u32 pos;
|
||||||
int err;
|
int err;
|
||||||
u8 resp = 0xF;
|
u8 resp = 0xF, lun;
|
||||||
struct ufshcd_lrb *lrbp;
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
host = cmd->device->host;
|
host = cmd->device->host;
|
||||||
hba = shost_priv(host);
|
hba = shost_priv(host);
|
||||||
tag = cmd->request->tag;
|
|
||||||
|
|
||||||
lrbp = &hba->lrb[tag];
|
lun = ufshcd_scsi_to_upiu_lun(cmd->device->lun);
|
||||||
err = ufshcd_issue_tm_cmd(hba, lrbp->lun, 0, UFS_LOGICAL_RESET, &resp);
|
err = ufshcd_issue_tm_cmd(hba, lun, 0, UFS_LOGICAL_RESET, &resp);
|
||||||
if (err || resp != UPIU_TASK_MANAGEMENT_FUNC_COMPL) {
|
if (err || resp != UPIU_TASK_MANAGEMENT_FUNC_COMPL) {
|
||||||
if (!err)
|
if (!err)
|
||||||
err = resp;
|
err = resp;
|
||||||
|
@ -6001,7 +5998,7 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
|
||||||
|
|
||||||
/* clear the commands that were pending for corresponding LUN */
|
/* clear the commands that were pending for corresponding LUN */
|
||||||
for_each_set_bit(pos, &hba->outstanding_reqs, hba->nutrs) {
|
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);
|
err = ufshcd_clear_cmd(hba, pos);
|
||||||
if (err)
|
if (err)
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue