Linux-Block Archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework
@ 2023-06-14 10:36 mwilck
  2023-06-14 10:36 ` [PATCH v7 1/7] bsg: increase number of devices mwilck
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: mwilck @ 2023-06-14 10:36 UTC (permalink / raw
  To: Martin K. Petersen, Christoph Hellwig, Ming Lei, Bart Van Assche
  Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke,
	Martin Wilck

From: Martin Wilck <mwilck@suse.com>

This patch series addresses some issues we saw in a test setup
with a large number of SCSI LUNs. The first two patches simply
increase the number of available sg and bsg devices. 3-5 fix
a large delay we encountered between blocking a Fibre Channel
remote port and the dev_loss_tmo. 6 renames scsi_target_block()
to scsi_block_targets(), and makes additional changes to this API,
as suggested in the review of the v2 series. 7 improves a warning message.

Changes v6 -> v7
 - 6/7: fixed mistake I made inverting the argument order in v6
   (I apologize for overlooking this dumb mistake!!)

Changes v5 -> v6
 - 6/7: inverted order of arguments for scsi_block_targets (Christoph Hellwig), dropped "extern"
   (I took the liberty not to remove previous "Reviewed-by"'s because of this change)
 - 5/7: wrapped one over-long comment line
 - added tags

Changes v4 -> v5:
 - added 7/7 to improve the WARN_ON_ONCE in scsi_device_block() (Bart van Assche)
 - 6/7: added WARN_ON_ONCE in scsi_block_targets() (Bart van Assche)
 - 4/7: improved comment (Bart van Assche)
 - Added tags

Changes v3 -> v4:
 - skipped 4/8: keep state_mutex held while quiescing queue (Bart van Assche),
   added a comment in 4/6 to explain the rationale
 - renamed scsi_target_block() to scsi_block_targets() (Christoph Hellwig), and
   merged the previous patches 7/8 and 8/8 modifying this API into 6/6.
 - rebased to latest mkp/queue branch

Changes v2 -> v3:
 - Split previous 3/3 into 4 separate patches as suggested by
   Christoph Hellwig.
 - Added 7/8 and 8/8, as suggested by Christoph and Bart van Assche.
 - Added s-o-b and reviewed-by tags.

Changes v1 -> v2:
 - call blk_mq_wait_quiesce_done() from scsi_target_block() to
   cover the case where BLK_MQ_F_BLOCKING is set (Bart van Assche)

Hannes Reinecke (2):
  bsg: increase number of devices
  scsi: sg: increase number of devices

Martin Wilck (5):
  scsi: merge scsi_internal_device_block() and device_block()
  scsi: don't wait for quiesce in scsi_stop_queue()
  scsi: don't wait for quiesce in scsi_device_block()
  scsi: replace scsi_target_block() by scsi_block_targets()
  scsi: improve warning message in scsi_device_block()

 block/bsg.c                         |  2 +-
 drivers/scsi/scsi_lib.c             | 80 ++++++++++++++---------------
 drivers/scsi/scsi_transport_fc.c    |  2 +-
 drivers/scsi/scsi_transport_iscsi.c |  3 +-
 drivers/scsi/scsi_transport_srp.c   |  6 +--
 drivers/scsi/sg.c                   |  2 +-
 drivers/scsi/snic/snic_disc.c       |  2 +-
 include/scsi/scsi_device.h          |  2 +-
 8 files changed, 50 insertions(+), 49 deletions(-)

-- 
2.40.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v7 1/7] bsg: increase number of devices
  2023-06-14 10:36 [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
@ 2023-06-14 10:36 ` mwilck
  2023-06-14 10:36 ` [PATCH v7 2/7] scsi: sg: " mwilck
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: mwilck @ 2023-06-14 10:36 UTC (permalink / raw
  To: Martin K. Petersen, Christoph Hellwig, Ming Lei, Bart Van Assche
  Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke

From: Hannes Reinecke <hare@suse.de>

Larger setups may need to allocate more than 32k bsg devices, so
increase the number of devices to the full range of minor device
numbers.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Martin Wilck <mwilck@suse.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
---
 block/bsg.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/block/bsg.c b/block/bsg.c
index 7eca43f33d7f..c53f24243bf2 100644
--- a/block/bsg.c
+++ b/block/bsg.c
@@ -36,7 +36,7 @@ static inline struct bsg_device *to_bsg_device(struct inode *inode)
 }
 
 #define BSG_DEFAULT_CMDS	64
-#define BSG_MAX_DEVS		32768
+#define BSG_MAX_DEVS		(1 << MINORBITS)
 
 static DEFINE_IDA(bsg_minor_ida);
 static struct class *bsg_class;
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v7 2/7] scsi: sg: increase number of devices
  2023-06-14 10:36 [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
  2023-06-14 10:36 ` [PATCH v7 1/7] bsg: increase number of devices mwilck
@ 2023-06-14 10:36 ` mwilck
  2023-06-14 10:36 ` [PATCH v7 3/7] scsi: merge scsi_internal_device_block() and device_block() mwilck
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: mwilck @ 2023-06-14 10:36 UTC (permalink / raw
  To: Martin K. Petersen, Christoph Hellwig, Ming Lei, Bart Van Assche
  Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke,
	Douglas Gilbert

From: Hannes Reinecke <hare@suse.de>

Larger setups may need to allocate more than 32k sg devices, so
increase the number of devices to the full range of minor device
numbers.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Martin Wilck <mwilck@suse.com>
Acked-by: Douglas Gilbert <dgilbert@interlog.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/sg.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 037f8c98a6d3..6c04cf941dac 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -71,7 +71,7 @@ static int sg_proc_init(void);
 
 #define SG_ALLOW_DIO_DEF 0
 
-#define SG_MAX_DEVS 32768
+#define SG_MAX_DEVS (1 << MINORBITS)
 
 /* SG_MAX_CDB_SIZE should be 260 (spc4r37 section 3.1.30) however the type
  * of sg_io_hdr::cmd_len can only represent 255. All SCSI commands greater
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v7 3/7] scsi: merge scsi_internal_device_block() and device_block()
  2023-06-14 10:36 [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
  2023-06-14 10:36 ` [PATCH v7 1/7] bsg: increase number of devices mwilck
  2023-06-14 10:36 ` [PATCH v7 2/7] scsi: sg: " mwilck
@ 2023-06-14 10:36 ` mwilck
  2023-06-14 10:36 ` [PATCH v7 4/7] scsi: don't wait for quiesce in scsi_stop_queue() mwilck
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: mwilck @ 2023-06-14 10:36 UTC (permalink / raw
  To: Martin K. Petersen, Christoph Hellwig, Ming Lei, Bart Van Assche
  Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke,
	Martin Wilck

From: Martin Wilck <mwilck@suse.com>

scsi_internal_device_block() is only called from device_block().
Merge the two functions, and call the result scsi_device_block(),
as the name device_block() is confusingly generic.

Signed-off-by: Martin Wilck <mwilck@suse.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/scsi_lib.c | 27 ++++++++-------------------
 1 file changed, 8 insertions(+), 19 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 496bdfc19c95..69fb7a9d8883 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2781,13 +2781,12 @@ int scsi_internal_device_block_nowait(struct scsi_device *sdev)
 EXPORT_SYMBOL_GPL(scsi_internal_device_block_nowait);
 
 /**
- * scsi_internal_device_block - try to transition to the SDEV_BLOCK state
+ * scsi_device_block - try to transition to the SDEV_BLOCK state
  * @sdev: device to block
+ * @data: dummy argument, ignored
  *
  * Pause SCSI command processing on the specified device and wait until all
- * ongoing scsi_request_fn() / scsi_queue_rq() calls have finished. May sleep.
- *
- * Returns zero if successful or a negative error code upon failure.
+ * ongoing scsi_queue_rq() calls have finished. May sleep.
  *
  * Note:
  * This routine transitions the device to the SDEV_BLOCK state (which must be
@@ -2795,7 +2794,7 @@ EXPORT_SYMBOL_GPL(scsi_internal_device_block_nowait);
  * is paused until the device leaves the SDEV_BLOCK state. See also
  * scsi_internal_device_unblock().
  */
-static int scsi_internal_device_block(struct scsi_device *sdev)
+static void scsi_device_block(struct scsi_device *sdev, void *data)
 {
 	int err;
 
@@ -2805,7 +2804,8 @@ static int scsi_internal_device_block(struct scsi_device *sdev)
 		scsi_stop_queue(sdev, false);
 	mutex_unlock(&sdev->state_mutex);
 
-	return err;
+	WARN_ONCE(err, "__scsi_internal_device_block_nowait(%s) failed: err = %d\n",
+		  dev_name(&sdev->sdev_gendev), err);
 }
 
 /**
@@ -2888,23 +2888,12 @@ static int scsi_internal_device_unblock(struct scsi_device *sdev,
 	return ret;
 }
 
-static void
-device_block(struct scsi_device *sdev, void *data)
-{
-	int ret;
-
-	ret = scsi_internal_device_block(sdev);
-
-	WARN_ONCE(ret, "scsi_internal_device_block(%s) failed: ret = %d\n",
-		  dev_name(&sdev->sdev_gendev), ret);
-}
-
 static int
 target_block(struct device *dev, void *data)
 {
 	if (scsi_is_target_device(dev))
 		starget_for_each_device(to_scsi_target(dev), NULL,
-					device_block);
+					scsi_device_block);
 	return 0;
 }
 
@@ -2913,7 +2902,7 @@ scsi_target_block(struct device *dev)
 {
 	if (scsi_is_target_device(dev))
 		starget_for_each_device(to_scsi_target(dev), NULL,
-					device_block);
+					scsi_device_block);
 	else
 		device_for_each_child(dev, NULL, target_block);
 }
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v7 4/7] scsi: don't wait for quiesce in scsi_stop_queue()
  2023-06-14 10:36 [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
                   ` (2 preceding siblings ...)
  2023-06-14 10:36 ` [PATCH v7 3/7] scsi: merge scsi_internal_device_block() and device_block() mwilck
@ 2023-06-14 10:36 ` mwilck
  2023-06-14 10:36 ` [PATCH v7 5/7] scsi: don't wait for quiesce in scsi_device_block() mwilck
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: mwilck @ 2023-06-14 10:36 UTC (permalink / raw
  To: Martin K. Petersen, Christoph Hellwig, Ming Lei, Bart Van Assche
  Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke,
	Martin Wilck

From: Martin Wilck <mwilck@suse.com>

scsi_stop_queue() has just two callers, one with and one without
"nowait". As blk_mq_quiesce_queue() comes down to
blk_mq_quiesce_queue_nowait() followed by blk_mq_wait_quiesce_done(),
we might as well open-code this in scsi_device_block().

Also, add a comment explaining why blk_mq_quiesce_queue_nowait() must
be called with the state_mutex held, see
https://lore.kernel.org/linux-scsi/3b8b13bf-a458-827a-b916-07d7eee8ae00@acm.org/.

Signed-off-by: Martin Wilck <mwilck@suse.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
 drivers/scsi/scsi_lib.c | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 69fb7a9d8883..3e12cc61569d 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2731,24 +2731,16 @@ void scsi_start_queue(struct scsi_device *sdev)
 		blk_mq_unquiesce_queue(sdev->request_queue);
 }
 
-static void scsi_stop_queue(struct scsi_device *sdev, bool nowait)
+static void scsi_stop_queue(struct scsi_device *sdev)
 {
 	/*
 	 * The atomic variable of ->queue_stopped covers that
 	 * blk_mq_quiesce_queue* is balanced with blk_mq_unquiesce_queue.
 	 *
-	 * However, we still need to wait until quiesce is done
-	 * in case that queue has been stopped.
+	 * The caller needs to wait until quiesce is done.
 	 */
-	if (!cmpxchg(&sdev->queue_stopped, 0, 1)) {
-		if (nowait)
-			blk_mq_quiesce_queue_nowait(sdev->request_queue);
-		else
-			blk_mq_quiesce_queue(sdev->request_queue);
-	} else {
-		if (!nowait)
-			blk_mq_wait_quiesce_done(sdev->request_queue->tag_set);
-	}
+	if (!cmpxchg(&sdev->queue_stopped, 0, 1))
+		blk_mq_quiesce_queue_nowait(sdev->request_queue);
 }
 
 /**
@@ -2775,7 +2767,7 @@ int scsi_internal_device_block_nowait(struct scsi_device *sdev)
 	 * request queue.
 	 */
 	if (!ret)
-		scsi_stop_queue(sdev, true);
+		scsi_stop_queue(sdev);
 	return ret;
 }
 EXPORT_SYMBOL_GPL(scsi_internal_device_block_nowait);
@@ -2800,9 +2792,17 @@ static void scsi_device_block(struct scsi_device *sdev, void *data)
 
 	mutex_lock(&sdev->state_mutex);
 	err = __scsi_internal_device_block_nowait(sdev);
-	if (err == 0)
-		scsi_stop_queue(sdev, false);
-	mutex_unlock(&sdev->state_mutex);
+	if (err == 0) {
+		/*
+		 * scsi_stop_queue() must be called with the state_mutex
+		 * held. Otherwise a simultaneous scsi_start_queue() call
+		 * might unquiesce the queue before we quiesce it.
+		 */
+		scsi_stop_queue(sdev);
+		mutex_unlock(&sdev->state_mutex);
+		blk_mq_wait_quiesce_done(sdev->request_queue->tag_set);
+	} else
+		mutex_unlock(&sdev->state_mutex);
 
 	WARN_ONCE(err, "__scsi_internal_device_block_nowait(%s) failed: err = %d\n",
 		  dev_name(&sdev->sdev_gendev), err);
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v7 5/7] scsi: don't wait for quiesce in scsi_device_block()
  2023-06-14 10:36 [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
                   ` (3 preceding siblings ...)
  2023-06-14 10:36 ` [PATCH v7 4/7] scsi: don't wait for quiesce in scsi_stop_queue() mwilck
@ 2023-06-14 10:36 ` mwilck
  2023-06-14 10:36 ` [PATCH v7 6/7] scsi: replace scsi_target_block() by scsi_block_targets() mwilck
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: mwilck @ 2023-06-14 10:36 UTC (permalink / raw
  To: Martin K. Petersen, Christoph Hellwig, Ming Lei, Bart Van Assche
  Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke,
	Martin Wilck

From: Martin Wilck <mwilck@suse.com>

scsi_device_block() is only called from scsi_target_block(), which
calls it repeatedly for every child device. For targets with many devices,
waiting for every queue to quiesce may cause a substantial delay
(we measured more than 100s delay for blocking a FC rport with 2048 LUNs).

Just call blk_mq_wait_quiesce_done() once from scsi_target_block() after
stopping all queues.

Signed-off-by: Martin Wilck <mwilck@suse.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/scsi_lib.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 3e12cc61569d..f20e65dd996e 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2777,8 +2777,9 @@ EXPORT_SYMBOL_GPL(scsi_internal_device_block_nowait);
  * @sdev: device to block
  * @data: dummy argument, ignored
  *
- * Pause SCSI command processing on the specified device and wait until all
- * ongoing scsi_queue_rq() calls have finished. May sleep.
+ * Pause SCSI command processing on the specified device. Callers must wait
+ * until all ongoing scsi_queue_rq() calls have finished after this function
+ * returns.
  *
  * Note:
  * This routine transitions the device to the SDEV_BLOCK state (which must be
@@ -2792,17 +2793,15 @@ static void scsi_device_block(struct scsi_device *sdev, void *data)
 
 	mutex_lock(&sdev->state_mutex);
 	err = __scsi_internal_device_block_nowait(sdev);
-	if (err == 0) {
+	if (err == 0)
 		/*
 		 * scsi_stop_queue() must be called with the state_mutex
 		 * held. Otherwise a simultaneous scsi_start_queue() call
 		 * might unquiesce the queue before we quiesce it.
 		 */
 		scsi_stop_queue(sdev);
-		mutex_unlock(&sdev->state_mutex);
-		blk_mq_wait_quiesce_done(sdev->request_queue->tag_set);
-	} else
-		mutex_unlock(&sdev->state_mutex);
+
+	mutex_unlock(&sdev->state_mutex);
 
 	WARN_ONCE(err, "__scsi_internal_device_block_nowait(%s) failed: err = %d\n",
 		  dev_name(&sdev->sdev_gendev), err);
@@ -2900,11 +2899,15 @@ target_block(struct device *dev, void *data)
 void
 scsi_target_block(struct device *dev)
 {
+	struct Scsi_Host *shost = dev_to_shost(dev);
+
 	if (scsi_is_target_device(dev))
 		starget_for_each_device(to_scsi_target(dev), NULL,
 					scsi_device_block);
 	else
 		device_for_each_child(dev, NULL, target_block);
+
+	blk_mq_wait_quiesce_done(&shost->tag_set);
 }
 EXPORT_SYMBOL_GPL(scsi_target_block);
 
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v7 6/7] scsi: replace scsi_target_block() by scsi_block_targets()
  2023-06-14 10:36 [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
                   ` (4 preceding siblings ...)
  2023-06-14 10:36 ` [PATCH v7 5/7] scsi: don't wait for quiesce in scsi_device_block() mwilck
@ 2023-06-14 10:36 ` mwilck
  2023-06-14 10:36 ` [PATCH v7 7/7] scsi: improve warning message in scsi_device_block() mwilck
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: mwilck @ 2023-06-14 10:36 UTC (permalink / raw
  To: Martin K. Petersen, Christoph Hellwig, Ming Lei, Bart Van Assche
  Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke,
	Martin Wilck, Karan Tilak Kumar, Sesidhar Baddela

From: Martin Wilck <mwilck@suse.com>

All callers (fc_remote_port_delete(), __iscsi_block_session(),
__srp_start_tl_fail_timers(), srp_reconnect_rport(), snic_tgt_del()) pass
parent devices of scsi_target devices to scsi_target_block().

Rename the function to scsi_block_targets(), and simplify it by assuming
that it is always passed a parent device. Also, have callers pass the
Scsi_Host pointer to scsi_block_targets(), as every caller has this pointer
readily available.

Suggested-by: Christoph Hellwig <hch@lst.de>
Suggested-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin Wilck <mwilck@suse.com>
Cc: Karan Tilak Kumar <kartilak@cisco.com>
Cc: Sesidhar Baddela <sebaddel@cisco.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
---
 drivers/scsi/scsi_lib.c             | 26 ++++++++++++++++----------
 drivers/scsi/scsi_transport_fc.c    |  2 +-
 drivers/scsi/scsi_transport_iscsi.c |  3 ++-
 drivers/scsi/scsi_transport_srp.c   |  6 +++---
 drivers/scsi/snic/snic_disc.c       |  2 +-
 include/scsi/scsi_device.h          |  2 +-
 6 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index f20e65dd996e..599c9ec550e0 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2896,20 +2896,26 @@ target_block(struct device *dev, void *data)
 	return 0;
 }
 
+/**
+ * scsi_block_targets - transition all SCSI child devices to SDEV_BLOCK state
+ * @dev: a parent device of one or more scsi_target devices
+ * @shost: the Scsi_Host to which this device belongs
+ *
+ * Iterate over all children of @dev, which should be scsi_target devices,
+ * and switch all subordinate scsi devices to SDEV_BLOCK state. Wait for
+ * ongoing scsi_queue_rq() calls to finish. May sleep.
+ *
+ * Note:
+ * @dev must not itself be a scsi_target device.
+ */
 void
-scsi_target_block(struct device *dev)
+scsi_block_targets(struct Scsi_Host *shost, struct device *dev)
 {
-	struct Scsi_Host *shost = dev_to_shost(dev);
-
-	if (scsi_is_target_device(dev))
-		starget_for_each_device(to_scsi_target(dev), NULL,
-					scsi_device_block);
-	else
-		device_for_each_child(dev, NULL, target_block);
-
+	WARN_ON_ONCE(scsi_is_target_device(dev));
+	device_for_each_child(dev, NULL, target_block);
 	blk_mq_wait_quiesce_done(&shost->tag_set);
 }
-EXPORT_SYMBOL_GPL(scsi_target_block);
+EXPORT_SYMBOL_GPL(scsi_block_targets);
 
 static void
 device_unblock(struct scsi_device *sdev, void *data)
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index 64ff2629eaf9..b04075f19445 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -3451,7 +3451,7 @@ fc_remote_port_delete(struct fc_rport  *rport)
 
 	spin_unlock_irqrestore(shost->host_lock, flags);
 
-	scsi_target_block(&rport->dev);
+	scsi_block_targets(shost, &rport->dev);
 
 	/* see if we need to kill io faster than waiting for device loss */
 	if ((rport->fast_io_fail_tmo != -1) &&
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index b9b97300e3b3..e527ece12453 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -1943,13 +1943,14 @@ static void __iscsi_block_session(struct work_struct *work)
 	struct iscsi_cls_session *session =
 			container_of(work, struct iscsi_cls_session,
 				     block_work);
+	struct Scsi_Host *shost = iscsi_session_to_shost(session);
 	unsigned long flags;
 
 	ISCSI_DBG_TRANS_SESSION(session, "Blocking session\n");
 	spin_lock_irqsave(&session->lock, flags);
 	session->state = ISCSI_SESSION_FAILED;
 	spin_unlock_irqrestore(&session->lock, flags);
-	scsi_target_block(&session->dev);
+	scsi_block_targets(shost, &session->dev);
 	ISCSI_DBG_TRANS_SESSION(session, "Completed SCSI target blocking\n");
 	if (session->recovery_tmo >= 0)
 		queue_delayed_work(session->workq,
diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c
index 87d0fb8dc503..64f6b22e8cc0 100644
--- a/drivers/scsi/scsi_transport_srp.c
+++ b/drivers/scsi/scsi_transport_srp.c
@@ -396,7 +396,7 @@ static void srp_reconnect_work(struct work_struct *work)
 }
 
 /*
- * scsi_target_block() must have been called before this function is
+ * scsi_block_targets() must have been called before this function is
  * called to guarantee that no .queuecommand() calls are in progress.
  */
 static void __rport_fail_io_fast(struct srp_rport *rport)
@@ -480,7 +480,7 @@ static void __srp_start_tl_fail_timers(struct srp_rport *rport)
 	    srp_rport_set_state(rport, SRP_RPORT_BLOCKED) == 0) {
 		pr_debug("%s new state: %d\n", dev_name(&shost->shost_gendev),
 			 rport->state);
-		scsi_target_block(&shost->shost_gendev);
+		scsi_block_targets(shost, &shost->shost_gendev);
 		if (fast_io_fail_tmo >= 0)
 			queue_delayed_work(system_long_wq,
 					   &rport->fast_io_fail_work,
@@ -548,7 +548,7 @@ int srp_reconnect_rport(struct srp_rport *rport)
 		 * later is ok though, scsi_internal_device_unblock_nowait()
 		 * treats SDEV_TRANSPORT_OFFLINE like SDEV_BLOCK.
 		 */
-		scsi_target_block(&shost->shost_gendev);
+		scsi_block_targets(shost, &shost->shost_gendev);
 	res = rport->state != SRP_RPORT_LOST ? i->f->reconnect(rport) : -ENODEV;
 	pr_debug("%s (state %d): transport.reconnect() returned %d\n",
 		 dev_name(&shost->shost_gendev), rport->state, res);
diff --git a/drivers/scsi/snic/snic_disc.c b/drivers/scsi/snic/snic_disc.c
index 8fbf3c1b1311..3e2e5783924d 100644
--- a/drivers/scsi/snic/snic_disc.c
+++ b/drivers/scsi/snic/snic_disc.c
@@ -214,7 +214,7 @@ snic_tgt_del(struct work_struct *work)
 		scsi_flush_work(shost);
 
 	/* Block IOs on child devices, stops new IOs */
-	scsi_target_block(&tgt->dev);
+	scsi_block_targets(shost, &tgt->dev);
 
 	/* Cleanup IOs */
 	snic_tgt_scsi_abort_io(tgt);
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index b2cdb078b7bd..75b2235b99e2 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -456,7 +456,7 @@ extern void scsi_scan_target(struct device *parent, unsigned int channel,
 			     unsigned int id, u64 lun,
 			     enum scsi_scan_mode rescan);
 extern void scsi_target_reap(struct scsi_target *);
-extern void scsi_target_block(struct device *);
+void scsi_block_targets(struct Scsi_Host *shost, struct device *dev);
 extern void scsi_target_unblock(struct device *, enum scsi_device_state);
 extern void scsi_remove_target(struct device *);
 extern const char *scsi_device_state_name(enum scsi_device_state);
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v7 7/7] scsi: improve warning message in scsi_device_block()
  2023-06-14 10:36 [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
                   ` (5 preceding siblings ...)
  2023-06-14 10:36 ` [PATCH v7 6/7] scsi: replace scsi_target_block() by scsi_block_targets() mwilck
@ 2023-06-14 10:36 ` mwilck
  2023-06-16 16:23 ` [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework Martin K. Petersen
  2023-06-22  1:26 ` Martin K. Petersen
  8 siblings, 0 replies; 10+ messages in thread
From: mwilck @ 2023-06-14 10:36 UTC (permalink / raw
  To: Martin K. Petersen, Christoph Hellwig, Ming Lei, Bart Van Assche
  Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke,
	Martin Wilck

From: Martin Wilck <mwilck@suse.com>

If __scsi_internal_device_block() returns an error, it is always -EINVAL
because of an invalid state transition. For debugging purposes, it makes
more sense to print the device state.

Signed-off-by: Martin Wilck <mwilck@suse.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/scsi_lib.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 599c9ec550e0..b7f78e53184a 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2790,9 +2790,11 @@ EXPORT_SYMBOL_GPL(scsi_internal_device_block_nowait);
 static void scsi_device_block(struct scsi_device *sdev, void *data)
 {
 	int err;
+	enum scsi_device_state state;
 
 	mutex_lock(&sdev->state_mutex);
 	err = __scsi_internal_device_block_nowait(sdev);
+	state = sdev->sdev_state;
 	if (err == 0)
 		/*
 		 * scsi_stop_queue() must be called with the state_mutex
@@ -2803,8 +2805,8 @@ static void scsi_device_block(struct scsi_device *sdev, void *data)
 
 	mutex_unlock(&sdev->state_mutex);
 
-	WARN_ONCE(err, "__scsi_internal_device_block_nowait(%s) failed: err = %d\n",
-		  dev_name(&sdev->sdev_gendev), err);
+	WARN_ONCE(err, "%s: failed to block %s in state %d\n",
+		  __func__, dev_name(&sdev->sdev_gendev), state);
 }
 
 /**
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework
  2023-06-14 10:36 [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
                   ` (6 preceding siblings ...)
  2023-06-14 10:36 ` [PATCH v7 7/7] scsi: improve warning message in scsi_device_block() mwilck
@ 2023-06-16 16:23 ` Martin K. Petersen
  2023-06-22  1:26 ` Martin K. Petersen
  8 siblings, 0 replies; 10+ messages in thread
From: Martin K. Petersen @ 2023-06-16 16:23 UTC (permalink / raw
  To: mwilck
  Cc: Martin K. Petersen, Christoph Hellwig, Ming Lei, Bart Van Assche,
	James Bottomley, linux-scsi, linux-block, Hannes Reinecke


Martin,

> This patch series addresses some issues we saw in a test setup with a
> large number of SCSI LUNs. The first two patches simply increase the
> number of available sg and bsg devices. 3-5 fix a large delay we
> encountered between blocking a Fibre Channel remote port and the
> dev_loss_tmo. 6 renames scsi_target_block() to scsi_block_targets(),
> and makes additional changes to this API, as suggested in the review
> of the v2 series. 7 improves a warning message.

Applied to 6.5/scsi-staging, thanks!

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework
  2023-06-14 10:36 [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
                   ` (7 preceding siblings ...)
  2023-06-16 16:23 ` [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework Martin K. Petersen
@ 2023-06-22  1:26 ` Martin K. Petersen
  8 siblings, 0 replies; 10+ messages in thread
From: Martin K. Petersen @ 2023-06-22  1:26 UTC (permalink / raw
  To: Christoph Hellwig, Ming Lei, Bart Van Assche, mwilck
  Cc: Martin K . Petersen, James Bottomley, linux-scsi, linux-block,
	Hannes Reinecke

On Wed, 14 Jun 2023 12:36:09 +0200, mwilck@suse.com wrote:

> This patch series addresses some issues we saw in a test setup
> with a large number of SCSI LUNs. The first two patches simply
> increase the number of available sg and bsg devices. 3-5 fix
> a large delay we encountered between blocking a Fibre Channel
> remote port and the dev_loss_tmo. 6 renames scsi_target_block()
> to scsi_block_targets(), and makes additional changes to this API,
> as suggested in the review of the v2 series. 7 improves a warning message.
> 
> [...]

Applied to 6.5/scsi-queue, thanks!

[1/7] bsg: increase number of devices
      https://git.kernel.org/mkp/scsi/c/9077fb2ab78c
[2/7] scsi: sg: increase number of devices
      https://git.kernel.org/mkp/scsi/c/37c918e03ef7
[3/7] scsi: merge scsi_internal_device_block() and device_block()
      https://git.kernel.org/mkp/scsi/c/c5e46f7ad43b
[4/7] scsi: don't wait for quiesce in scsi_stop_queue()
      https://git.kernel.org/mkp/scsi/c/d7035b73a73a
[5/7] scsi: don't wait for quiesce in scsi_device_block()
      https://git.kernel.org/mkp/scsi/c/e20fff8a1f49
[6/7] scsi: replace scsi_target_block() by scsi_block_targets()
      https://git.kernel.org/mkp/scsi/c/31950192d939
[7/7] scsi: improve warning message in scsi_device_block()
      https://git.kernel.org/mkp/scsi/c/6d7160c7da6f

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2023-06-22  1:26 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-14 10:36 [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
2023-06-14 10:36 ` [PATCH v7 1/7] bsg: increase number of devices mwilck
2023-06-14 10:36 ` [PATCH v7 2/7] scsi: sg: " mwilck
2023-06-14 10:36 ` [PATCH v7 3/7] scsi: merge scsi_internal_device_block() and device_block() mwilck
2023-06-14 10:36 ` [PATCH v7 4/7] scsi: don't wait for quiesce in scsi_stop_queue() mwilck
2023-06-14 10:36 ` [PATCH v7 5/7] scsi: don't wait for quiesce in scsi_device_block() mwilck
2023-06-14 10:36 ` [PATCH v7 6/7] scsi: replace scsi_target_block() by scsi_block_targets() mwilck
2023-06-14 10:36 ` [PATCH v7 7/7] scsi: improve warning message in scsi_device_block() mwilck
2023-06-16 16:23 ` [PATCH v7 0/7] scsi: fixes for targets with many LUNs, and scsi_target_block rework Martin K. Petersen
2023-06-22  1:26 ` Martin K. Petersen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).