Home Home > GIT Browse > SLE12-SP3
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2019-01-11 15:12:56 +0100
committerHannes Reinecke <hare@suse.de>2019-01-11 15:13:20 +0100
commit34b6666cf59b7b68b7b794e5ffd4d68d4806c980 (patch)
treeb8f2cf793f5b8fad473d9924f76be1701b37031d
parent086a2ce1cfb67bb8870bbf97014fa73a08487112 (diff)
scsi: Create two versions of scsi_internal_device_unblock()
(bsc#1119877).
-rw-r--r--patches.fixes/scsi-Create-two-versions-of-scsi_internal_device_unb.patch132
-rw-r--r--series.conf1
2 files changed, 133 insertions, 0 deletions
diff --git a/patches.fixes/scsi-Create-two-versions-of-scsi_internal_device_unb.patch b/patches.fixes/scsi-Create-two-versions-of-scsi_internal_device_unb.patch
new file mode 100644
index 0000000000..cd0edb1a77
--- /dev/null
+++ b/patches.fixes/scsi-Create-two-versions-of-scsi_internal_device_unb.patch
@@ -0,0 +1,132 @@
+From: Bart Van Assche <bart.vanassche@sandisk.com>
+Date: Fri, 2 Jun 2017 14:21:54 -0700
+Subject: [PATCH] scsi: Create two versions of scsi_internal_device_unblock()
+Git-commit: 43f7571be077ee4673466cbcba115427d68440e1
+Patch-mainline: v4.13-rc1
+References: bsc#1119877
+
+This will make it easier to serialize SCSI device state changes through
+a mutex.
+
+Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Cc: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Acked-by: Hannes Reinecke <hare@suse.com>
+---
+ drivers/scsi/mpt3sas/mpt3sas_scsih.c | 4 ++--
+ drivers/scsi/scsi_lib.c | 46 +++++++++++++++++++++++++-----------
+ include/scsi/scsi_device.h | 4 ++--
+ 3 files changed, 36 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+index c63bc5ccce37..22998cbd538f 100644
+--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
++++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+@@ -2883,7 +2883,7 @@ _scsih_internal_device_unblock(struct scsi_device *sdev,
+ sdev_printk(KERN_WARNING, sdev, "device_unblock and setting to running, "
+ "handle(0x%04x)\n", sas_device_priv_data->sas_target->handle);
+ sas_device_priv_data->block = 0;
+- r = scsi_internal_device_unblock(sdev, SDEV_RUNNING);
++ r = scsi_internal_device_unblock_nowait(sdev, SDEV_RUNNING);
+ if (r == -EINVAL) {
+ /* The device has been set to SDEV_RUNNING by SD layer during
+ * device addition but the request queue is still stopped by
+@@ -2902,7 +2902,7 @@ _scsih_internal_device_unblock(struct scsi_device *sdev,
+ r, sas_device_priv_data->sas_target->handle);
+
+ sas_device_priv_data->block = 0;
+- r = scsi_internal_device_unblock(sdev, SDEV_RUNNING);
++ r = scsi_internal_device_unblock_nowait(sdev, SDEV_RUNNING);
+ if (r)
+ sdev_printk(KERN_WARNING, sdev, "retried device_unblock"
+ " failed with return(%d) for handle(0x%04x)\n",
+diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+index fc8f394eb854..f0eb55744513 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -3023,24 +3023,22 @@ static int scsi_internal_device_block(struct scsi_device *sdev)
+ }
+
+ /**
+- * scsi_internal_device_unblock - resume a device after a block request
++ * scsi_internal_device_unblock_nowait - resume a device after a block request
+ * @sdev: device to resume
+- * @new_state: state to set devices to after unblocking
++ * @new_state: state to set the device to after unblocking
+ *
+- * Called by scsi lld's or the midlayer to restart the device queue
+- * for the previously suspended scsi device. Called from interrupt or
+- * normal process context.
++ * Restart the device queue for a previously suspended SCSI device. Does not
++ * sleep.
+ *
+- * Returns zero if successful or error if not.
++ * Returns zero if successful or a negative error code upon failure.
+ *
+- * Notes:
+- * This routine transitions the device to the SDEV_RUNNING state
+- * or to one of the offline states (which must be a legal transition)
+- * allowing the midlayer to goose the queue for this device.
++ * Notes:
++ * This routine transitions the device to the SDEV_RUNNING state or to one of
++ * the offline states (which must be a legal transition) allowing the midlayer
++ * to goose the queue for this device.
+ */
+-int
+-scsi_internal_device_unblock(struct scsi_device *sdev,
+- enum scsi_device_state new_state)
++int scsi_internal_device_unblock_nowait(struct scsi_device *sdev,
++ enum scsi_device_state new_state)
+ {
+ struct request_queue *q = sdev->request_queue;
+ unsigned long flags;
+@@ -3072,7 +3070,27 @@ scsi_internal_device_unblock(struct scsi_device *sdev,
+
+ return 0;
+ }
+-EXPORT_SYMBOL_GPL(scsi_internal_device_unblock);
++EXPORT_SYMBOL_GPL(scsi_internal_device_unblock_nowait);
++
++/**
++ * scsi_internal_device_unblock - resume a device after a block request
++ * @sdev: device to resume
++ * @new_state: state to set the device to after unblocking
++ *
++ * Restart the device queue for a previously suspended SCSI device. May sleep.
++ *
++ * Returns zero if successful or a negative error code upon failure.
++ *
++ * Notes:
++ * This routine transitions the device to the SDEV_RUNNING state or to one of
++ * the offline states (which must be a legal transition) allowing the midlayer
++ * to goose the queue for this device.
++ */
++static int scsi_internal_device_unblock(struct scsi_device *sdev,
++ enum scsi_device_state new_state)
++{
++ return scsi_internal_device_unblock_nowait(sdev, new_state);
++}
+
+ static void
+ device_block(struct scsi_device *sdev, void *data)
+diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
+index 6ce6888f3c69..5f24dae2a8e1 100644
+--- a/include/scsi/scsi_device.h
++++ b/include/scsi/scsi_device.h
+@@ -473,8 +473,8 @@ static inline int scsi_device_created(struct scsi_device *sdev)
+ }
+
+ int scsi_internal_device_block_nowait(struct scsi_device *sdev);
+-int scsi_internal_device_unblock(struct scsi_device *sdev,
+- enum scsi_device_state new_state);
++int scsi_internal_device_unblock_nowait(struct scsi_device *sdev,
++ enum scsi_device_state new_state);
+
+ /* accessor functions for the SCSI parameters */
+ static inline int scsi_device_sync(struct scsi_device *sdev)
+--
+2.16.4
+
diff --git a/series.conf b/series.conf
index 24610bda00..a24c151dc6 100644
--- a/series.conf
+++ b/series.conf
@@ -21167,6 +21167,7 @@
patches.drivers/0018-scsi-qedf-Check-if-sense-buffer-has-been-allocated-d.patch
patches.drivers/scsi-qla2xxx-remove-writeq-readq-function-definition.patch
patches.fixes/scsi-Split-scsi_internal_device_block.patch
+ patches.fixes/scsi-Create-two-versions-of-scsi_internal_device_unb.patch
patches.drivers/scsi-qla2xxx-remove-redundant-null-check-on-tgt.patch
patches.drivers/scsi-qla2xxx-Fix-compile-warning.patch
patches.drivers/0019-scsi-qedf-Fix-a-return-value-in-case-of-error-in-qed.patch