Message ID | 20230607182249.22623-8-mwilck@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | scsi: fixes for targets with many LUNs, and scsi_target_block rework | expand |
On Wed, Jun 07, 2023 at 08:22:48PM +0200, mwilck@suse.com wrote: > 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(). > Simplify scsi_target_block() to assume that it is always passed a parent > device. Btw, one thing I realized is that the function has been a bit misnamed for a while, and becomes even more so now. Maybe scsi_block_targets is a better name as it blocks all the targets hanging off the passed in devices as children?
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);