Disable asynchronous aborts for SATA devices

This commit is contained in:
Salvatore Bonaccorso 2018-01-10 13:22:41 +01:00
parent 9a41499923
commit d42878a1e5
4 changed files with 61 additions and 27 deletions

3
debian/changelog vendored
View File

@ -42,6 +42,9 @@ linux (4.14.13-1) UNRELEASED; urgency=medium
- [s390x] KVM: fix cmma migration for multiple memory slots
- [s390x] KVM: prevent buffer overrun on memory hotplug during migration
[ Salvatore Bonaccorso ]
* Disable asynchronous aborts for SATA devices
-- Salvatore Bonaccorso <carnil@debian.org> Wed, 10 Jan 2018 09:58:46 +0100
linux (4.14.12-2) unstable; urgency=medium

View File

@ -0,0 +1,57 @@
From: Hannes Reinecke <hare@suse.de>
Date: Wed, 10 Jan 2018 08:34:02 +0100
Subject: Disable asynchronous aborts for SATA devices
Origin: https://marc.info/?l=linux-scsi&m=151557324907914
Handling CD-ROM devices from libsas is decidedly odd, as libata
relies on SCSI EH to be started to figure out that no medium is
present.
So we cannot do asynchronous aborts for SATA devices.
Fixes: 909657615d9 ("scsi: libsas: allow async aborts")
Cc: <stable@vger.kernel.org> # 4.12+
Signed-off-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Tested-by: Yves-Alexis Perez <corsac@debian.org>
---
drivers/scsi/libsas/sas_scsi_host.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index 58476b728c57..c9406852c3e9 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -486,15 +486,28 @@ static int sas_queue_reset(struct domain_device *dev, int reset_type,
int sas_eh_abort_handler(struct scsi_cmnd *cmd)
{
- int res;
+ int res = TMF_RESP_FUNC_FAILED;
struct sas_task *task = TO_SAS_TASK(cmd);
struct Scsi_Host *host = cmd->device->host;
+ struct domain_device *dev = cmd_to_domain_dev(cmd);
struct sas_internal *i = to_sas_internal(host->transportt);
+ unsigned long flags;
if (!i->dft->lldd_abort_task)
return FAILED;
- res = i->dft->lldd_abort_task(task);
+ spin_lock_irqsave(host->host_lock, flags);
+ /* We cannot do async aborts for SATA devices */
+ if (dev_is_sata(dev) && !host->host_eh_scheduled) {
+ spin_unlock_irqrestore(host->host_lock, flags);
+ return FAILED;
+ }
+ spin_unlock_irqrestore(host->host_lock, flags);
+
+ if (task)
+ res = i->dft->lldd_abort_task(task);
+ else
+ SAS_DPRINTK("no task to abort\n");
if (res == TMF_RESP_FUNC_SUCC || res == TMF_RESP_FUNC_COMPLETE)
return SUCCESS;
--
2.11.0

View File

@ -1,26 +0,0 @@
From: Salvatore Bonaccorso <carnil@debian.org>
Date: Fri, 5 Jan 2018 13:36:38 +0100
Subject: Revert "scsi: libsas: allow async aborts"
Bug-Debian: https://bugs.debian.org/882414
---
drivers/scsi/libsas/sas_scsi_host.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index ea8ad06ff582..e81c8590d254 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -491,6 +491,9 @@ int sas_eh_abort_handler(struct scsi_cmnd *cmd)
struct Scsi_Host *host = cmd->device->host;
struct sas_internal *i = to_sas_internal(host->transportt);
+ if (current != host->ehandler)
+ return FAILED;
+
if (!i->dft->lldd_abort_task)
return FAILED;
--
2.11.0

View File

@ -82,7 +82,7 @@ bugfix/all/i40e-i40evf-organize-and-re-number-feature-flags.patch
bugfix/all/i40e-fix-flags-declaration.patch
bugfix/all/xen-time-do-not-decrease-steal-time-after-live-migra.patch
bugfix/all/e1000e-fix-e1000_check_for_copper_link_ich8lan-return-value.patch
debian/revert-scsi-libsas-allow-async-aborts.patch
bugfix/all/Disable-asynchronous-aborts-for-SATA-devices.patch
# Miscellaneous features