summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Garry <john.garry@huawei.com>2022-02-17 23:42:29 +0800
committerMartin K. Petersen <martin.petersen@oracle.com>2022-02-19 15:59:34 -0500
commit9aacf6fe90592cc7f64d56505e42606b61b76f00 (patch)
tree54b6ed7e12fca77981b81b8674cc8fdf6571aa49
parentac2beb4e3bd75b0049068516b9d42201bda0ded3 (diff)
downloadlinux-stable-9aacf6fe90592cc7f64d56505e42606b61b76f00.tar.gz
linux-stable-9aacf6fe90592cc7f64d56505e42606b61b76f00.tar.bz2
linux-stable-9aacf6fe90592cc7f64d56505e42606b61b76f00.zip
scsi: libsas: Handle non-TMF codes in sas_scsi_find_task()
LLDD TMF callbacks may return linux or other error codes instead of TMF codes. This may cause problems in sas_scsi_find_task() -> .lldd_query_task(), as only TMF codes are handled there. As such, we may not return a task_disposition type from sas_scsi_find_task(). Function sas_eh_handle_sas_errors() only handles that type, and will only progress error handling for those recognised types. Return TASK_ABORT_FAILED upon exit on the assumption that the command may still be alive and error handling should be escalated. Link: https://lore.kernel.org/r/1645112566-115804-2-git-send-email-john.garry@huawei.com Tested-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> Signed-off-by: John Garry <john.garry@huawei.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/libsas/sas_scsi_host.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index bcb391b0c7ed..19cb954afd80 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -316,11 +316,13 @@ static enum task_disposition sas_scsi_find_task(struct sas_task *task)
pr_notice("%s: task 0x%p failed to abort\n",
__func__, task);
return TASK_ABORT_FAILED;
+ default:
+ pr_notice("%s: task 0x%p result code %d not handled\n",
+ __func__, task, res);
}
-
}
}
- return res;
+ return TASK_ABORT_FAILED;
}
static int sas_recover_lu(struct domain_device *dev, struct scsi_cmnd *cmd)