From: Martin Wilck <mwilck@xxxxxxxx> 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(). Simplify scsi_target_block() to assume that it is always passed a parent device. Suggested-by: Christoph Hellwig <hch@xxxxxx> Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> --- drivers/scsi/scsi_lib.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 25ec6eb8df7f..e572fc56a8dd 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -2884,17 +2884,25 @@ target_block(struct device *dev, void *data) return 0; } +/** + * scsi_target_block - transition all SCSI child devices to SDEV_BLOCK state + * @dev: a parent device of one or more scsi_target devices + * + * 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. + * + * Returns zero if successful or a negative error code upon failure. + * + * Note: + * @dev must not itself be a scsi_target device. + */ 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); - + 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