@@ -249,6 +249,28 @@ int scsi_change_queue_depth(struct scsi_device *sdev, int depth)
}
EXPORT_SYMBOL(scsi_change_queue_depth);
+/*
+ * scsi_change_max_queue_depth - change the max queue depth for a device.
+ * @sdev: SCSI Device in question
+ * @depth: number of commands allowed to be queued to the driver
+ *
+ * Calls the device's transport to validate and change the queue depth,
+ * then stores the new maximum on the device.
+ */
+int
+scsi_change_max_queue_depth(struct scsi_device *sdev, int depth)
+{
+ int retval;
+
+ retval = sdev->host->hostt->change_queue_depth(sdev, depth);
+ if (retval < 0)
+ return retval;
+
+ sdev->max_queue_depth = sdev->queue_depth;
+
+ return 0;
+}
+
/**
* scsi_track_queue_full - track QUEUE_FULL events to adjust queue depth
* @sdev: SCSI Device in question
@@ -41,6 +41,7 @@ static inline void scsi_log_send(struct scsi_cmnd *cmd)
static inline void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
{ };
#endif
+int scsi_change_max_queue_depth(struct scsi_device *sdev, int depth);
/* scsi_devinfo.c */
@@ -982,9 +982,8 @@ sdev_store_queue_depth(struct device *dev, struct device_attribute *attr,
{
int depth, retval;
struct scsi_device *sdev = to_scsi_device(dev);
- struct scsi_host_template *sht = sdev->host->hostt;
- if (!sht->change_queue_depth)
+ if (!sdev->host->hostt->change_queue_depth)
return -EINVAL;
depth = simple_strtoul(buf, NULL, 0);
@@ -992,12 +991,10 @@ sdev_store_queue_depth(struct device *dev, struct device_attribute *attr,
if (depth < 1 || depth > sdev->host->can_queue)
return -EINVAL;
- retval = sht->change_queue_depth(sdev, depth);
+ retval = scsi_change_max_queue_depth(sdev, depth);
if (retval < 0)
return retval;
- sdev->max_queue_depth = sdev->queue_depth;
-
return count;
}
sdev_show_function(queue_depth, "%d\n");
In preparation for allowing other attributes and routines to change the current and max lun queue depth on an sdev, refactor the sysfs sdev attribute change routine. The refactoring creates a new scsi-internal routine, scsi_change_max_queue_depth(), which changes a devices current and max queue value. The new routine is placed next to the routine, scsi_change_queue_depth(), which is used by most lldds to implement a queue depth change. Signed-off-by: James Smart <jsmart2021@gmail.com> --- v3: revert -ENOTSUPP status on shost template check back to -EINVAL --- drivers/scsi/scsi.c | 22 ++++++++++++++++++++++ drivers/scsi/scsi_priv.h | 1 + drivers/scsi/scsi_sysfs.c | 7 ++----- 3 files changed, 25 insertions(+), 5 deletions(-)