Create a helper routine to loop through all devices on an shost and change their current and maximum queue depth. The helper is created such that is lldd callable. Signed-off-by: James Smart <jsmart2021@xxxxxxxxx> --- v3: fix spaces change ENOTSUPP to ENXIO --- drivers/scsi/scsi.c | 32 ++++++++++++++++++++++++++++++++ include/scsi/scsi_device.h | 1 + 2 files changed, 33 insertions(+) diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 195c0b11260a..86db018bacb2 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -272,6 +272,38 @@ scsi_change_max_queue_depth(struct scsi_device *sdev, int depth) } /** + * shost_change_max_queue_depths - helper to walk all devices on a + * shost and change their max queue depth. + * @shost: shost whose devices we want to iterate over. + * @depth: number of commands allowed to be queued to the driver + * + * Validates the shost allows a change of queue depth, the value is valid, + * then traverses over all devices and sets their maximum queue depth. + */ +int shost_change_max_queue_depths(struct Scsi_Host *shost, int depth) +{ + struct scsi_device *sdev; + int retval; + + if (!shost->hostt->change_queue_depth) + return -ENXIO; + + if (depth < 1 || depth > shost->can_queue) + return -EINVAL; + + shost_for_each_device(sdev, shost) { + retval = scsi_change_max_queue_depth(sdev, depth); + if (retval != 0) + sdev_printk(KERN_INFO, sdev, + "failed to set queue depth to %d (err %d)", + depth, retval); + } + + return 0; +} +EXPORT_SYMBOL(shost_change_max_queue_depths); + +/** * scsi_track_queue_full - track QUEUE_FULL events to adjust queue depth * @sdev: SCSI Device in question * @depth: Current number of outstanding SCSI commands on this device, diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index f8312a3e5b42..38c4b97fc1b8 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h @@ -392,6 +392,7 @@ extern struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *, extern int scsi_change_queue_depth(struct scsi_device *, int); extern int scsi_track_queue_full(struct scsi_device *, int); +extern int shost_change_max_queue_depths(struct Scsi_Host *shost, int depth); extern int scsi_set_medium_removal(struct scsi_device *, char); -- 2.13.7