diff mbox series

scsi: ufs: Correct the lun used in eh_device_reset_handler() callback

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

Commit Message

Can Guo Dec. 28, 2020, 12:04 p.m. UTC
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>

Comments

Avri Altman Dec. 30, 2020, 7:20 a.m. UTC | #1
> 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
Can Guo Dec. 30, 2020, 7:49 a.m. UTC | #2
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
Stanley Chu Dec. 30, 2020, 8:33 a.m. UTC | #3
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>
Martin K. Petersen Jan. 8, 2021, 4:19 a.m. UTC | #4
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 mbox series

Patch

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;