* [PATCH v4 1/6] bsg: increase number of devices
2023-06-12 15:03 [PATCH v4 0/6] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
@ 2023-06-12 15:03 ` mwilck
2023-06-12 15:03 ` [PATCH v4 2/6] scsi: sg: " mwilck
` (4 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: mwilck @ 2023-06-12 15:03 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] 12+ messages in thread* [PATCH v4 2/6] scsi: sg: increase number of devices
2023-06-12 15:03 [PATCH v4 0/6] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
2023-06-12 15:03 ` [PATCH v4 1/6] bsg: increase number of devices mwilck
@ 2023-06-12 15:03 ` mwilck
2023-06-12 15:03 ` [PATCH v4 3/6] scsi: merge scsi_internal_device_block() and device_block() mwilck
` (3 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: mwilck @ 2023-06-12 15:03 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] 12+ messages in thread* [PATCH v4 3/6] scsi: merge scsi_internal_device_block() and device_block()
2023-06-12 15:03 [PATCH v4 0/6] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
2023-06-12 15:03 ` [PATCH v4 1/6] bsg: increase number of devices mwilck
2023-06-12 15:03 ` [PATCH v4 2/6] scsi: sg: " mwilck
@ 2023-06-12 15:03 ` mwilck
2023-06-12 15:35 ` Bart Van Assche
2023-06-12 15:03 ` [PATCH v4 4/6] scsi: don't wait for quiesce in scsi_stop_queue() mwilck
` (2 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: mwilck @ 2023-06-12 15:03 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>
---
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] 12+ messages in thread* Re: [PATCH v4 3/6] scsi: merge scsi_internal_device_block() and device_block()
2023-06-12 15:03 ` [PATCH v4 3/6] scsi: merge scsi_internal_device_block() and device_block() mwilck
@ 2023-06-12 15:35 ` Bart Van Assche
2023-06-12 16:06 ` Martin Wilck
0 siblings, 1 reply; 12+ messages in thread
From: Bart Van Assche @ 2023-06-12 15:35 UTC (permalink / raw)
To: mwilck, Martin K. Petersen, Christoph Hellwig, Ming Lei
Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke
On 6/12/23 08:03, mwilck@suse.com wrote:
> -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);
> }
Hmm ... shouldn't the WARN_ONCE() statement refer to scsi_device_block()
instead of __scsi_internal_device_block_nowait()?
Thanks,
Bart.
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v4 3/6] scsi: merge scsi_internal_device_block() and device_block()
2023-06-12 15:35 ` Bart Van Assche
@ 2023-06-12 16:06 ` Martin Wilck
0 siblings, 0 replies; 12+ messages in thread
From: Martin Wilck @ 2023-06-12 16:06 UTC (permalink / raw)
To: Bart Van Assche, Martin K. Petersen, Christoph Hellwig, Ming Lei
Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke
On Mon, 2023-06-12 at 08:35 -0700, Bart Van Assche wrote:
> On 6/12/23 08:03, mwilck@suse.com wrote:
> > -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);
> > }
>
> Hmm ... shouldn't the WARN_ONCE() statement refer to
> scsi_device_block()
> instead of __scsi_internal_device_block_nowait()?
The message references the function that failed, and prints the return
value of that function. It used to be scsi_internal_device_block()
before my patch, and it's __scsi_internal_device_block_nowait() now.
But I agree that the message is ugly. I'll to come up with something
better.
Thanks,
Martin
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 4/6] scsi: don't wait for quiesce in scsi_stop_queue()
2023-06-12 15:03 [PATCH v4 0/6] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
` (2 preceding siblings ...)
2023-06-12 15:03 ` [PATCH v4 3/6] scsi: merge scsi_internal_device_block() and device_block() mwilck
@ 2023-06-12 15:03 ` mwilck
2023-06-12 15:40 ` Bart Van Assche
2023-06-12 15:03 ` [PATCH v4 5/6] scsi: don't wait for quiesce in scsi_device_block() mwilck
2023-06-12 15:03 ` [PATCH v4 6/6] scsi: replace scsi_target_block() by scsi_block_targets() mwilck
5 siblings, 1 reply; 12+ messages in thread
From: mwilck @ 2023-06-12 15:03 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>
---
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..b4cc1501dc36 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.
+ * After return, we still need 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] 12+ messages in thread* Re: [PATCH v4 4/6] scsi: don't wait for quiesce in scsi_stop_queue()
2023-06-12 15:03 ` [PATCH v4 4/6] scsi: don't wait for quiesce in scsi_stop_queue() mwilck
@ 2023-06-12 15:40 ` Bart Van Assche
0 siblings, 0 replies; 12+ messages in thread
From: Bart Van Assche @ 2023-06-12 15:40 UTC (permalink / raw)
To: mwilck, Martin K. Petersen, Christoph Hellwig, Ming Lei
Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke
On 6/12/23 08:03, mwilck@suse.com wrote:
> - * However, we still need to wait until quiesce is done
> - * in case that queue has been stopped.
> + * After return, we still need to wait until quiesce is done.
The above comment would be more clear if "After return, we still need"
would be changed into "The caller needs".
> @@ -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);
Has it been considered to modify the above code such that there is a
single mutex_unlock() call instead of two? I wouldn't mind if
blk_mq_wait_quiesce_done() would be called if err != 0 since performance
is not that important if this function fails.
Thanks,
Bart.
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 5/6] scsi: don't wait for quiesce in scsi_device_block()
2023-06-12 15:03 [PATCH v4 0/6] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
` (3 preceding siblings ...)
2023-06-12 15:03 ` [PATCH v4 4/6] scsi: don't wait for quiesce in scsi_stop_queue() mwilck
@ 2023-06-12 15:03 ` mwilck
2023-06-12 15:03 ` [PATCH v4 6/6] scsi: replace scsi_target_block() by scsi_block_targets() mwilck
5 siblings, 0 replies; 12+ messages in thread
From: mwilck @ 2023-06-12 15:03 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>
---
drivers/scsi/scsi_lib.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index b4cc1501dc36..183f29705af7 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2777,8 +2777,8 @@ 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 +2792,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 +2898,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] 12+ messages in thread* [PATCH v4 6/6] scsi: replace scsi_target_block() by scsi_block_targets()
2023-06-12 15:03 [PATCH v4 0/6] scsi: fixes for targets with many LUNs, and scsi_target_block rework mwilck
` (4 preceding siblings ...)
2023-06-12 15:03 ` [PATCH v4 5/6] scsi: don't wait for quiesce in scsi_device_block() mwilck
@ 2023-06-12 15:03 ` mwilck
2023-06-12 15:49 ` Bart Van Assche
5 siblings, 1 reply; 12+ messages in thread
From: mwilck @ 2023-06-12 15:03 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>
---
drivers/scsi/scsi_lib.c | 25 +++++++++++++++----------
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, 23 insertions(+), 17 deletions(-)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 183f29705af7..8305e8160791 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2895,20 +2895,25 @@ 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 device *dev, struct Scsi_Host *shost)
{
- 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);
-
+ 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..7fd90b51a7e6 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(&rport->dev, shost);
/* 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..0a64ea20f71c 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(&session->dev, shost);
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..787b1a487e51 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_gendev, shost);
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_gendev, shost);
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..f81abeccc386 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(&tgt->dev, shost);
/* Cleanup IOs */
snic_tgt_scsi_abort_io(tgt);
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index b2cdb078b7bd..b31ec356e8f5 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 *);
+extern void scsi_block_targets(struct device *dev, struct Scsi_Host *shost);
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] 12+ messages in thread* Re: [PATCH v4 6/6] scsi: replace scsi_target_block() by scsi_block_targets()
2023-06-12 15:03 ` [PATCH v4 6/6] scsi: replace scsi_target_block() by scsi_block_targets() mwilck
@ 2023-06-12 15:49 ` Bart Van Assche
0 siblings, 0 replies; 12+ messages in thread
From: Bart Van Assche @ 2023-06-12 15:49 UTC (permalink / raw)
To: mwilck, Martin K. Petersen, Christoph Hellwig, Ming Lei
Cc: James Bottomley, linux-scsi, linux-block, Hannes Reinecke,
Karan Tilak Kumar, Sesidhar Baddela
On 6/12/23 08:03, mwilck@suse.com wrote:
> + * Note:
> + * @dev must not itself be a scsi_target device.
Please add a WARN_ON_ONCE() that checks this condition.
Thanks,
Bart.
^ permalink raw reply [flat|nested] 12+ messages in thread