Switch to the ->device_configure method instead of ->slave_configure
and update the block limits on the passed in queue_limits instead
of using the per-limit accessors.

Also use the proper atomic queue limit update helpers and freeze the
queue when updating max_hw_sectors from sysfs.

Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 drivers/usb/storage/scsiglue.c | 36 ++++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
index eb4ba03e082d89..b31464740f6c86 100644
--- a/drivers/usb/storage/scsiglue.c
+++ b/drivers/usb/storage/scsiglue.c
@@ -82,7 +82,7 @@ static int slave_alloc (struct scsi_device *sdev)
        return 0;
 }
 
-static int slave_configure(struct scsi_device *sdev)
+static int device_configure(struct scsi_device *sdev, struct queue_limits *lim)
 {
        struct us_data *us = host_to_us(sdev->host);
        struct device *dev = us->pusb_dev->bus->sysdev;
@@ -97,31 +97,28 @@ static int slave_configure(struct scsi_device *sdev)
 
                if (us->fflags & US_FL_MAX_SECTORS_MIN)
                        max_sectors = PAGE_SIZE >> 9;
-               if (queue_max_hw_sectors(sdev->request_queue) > max_sectors)
-                       blk_queue_max_hw_sectors(sdev->request_queue,
-                                             max_sectors);
+               lim->max_hw_sectors = min(lim->max_hw_sectors, max_sectors);
        } else if (sdev->type == TYPE_TAPE) {
                /*
                 * Tapes need much higher max_sector limits, so just
                 * raise it to the maximum possible (4 GB / 512) and
                 * let the queue segment size sort out the real limit.
                 */
-               blk_queue_max_hw_sectors(sdev->request_queue, 0x7FFFFF);
+               lim->max_hw_sectors = 0x7FFFFF;
        } else if (us->pusb_dev->speed >= USB_SPEED_SUPER) {
                /*
                 * USB3 devices will be limited to 2048 sectors. This gives us
                 * better throughput on most devices.
                 */
-               blk_queue_max_hw_sectors(sdev->request_queue, 2048);
+               lim->max_hw_sectors = 2048;
        }
 
        /*
         * The max_hw_sectors should be up to maximum size of a mapping for
         * the device. Otherwise, a DMA API might fail on swiotlb environment.
         */
-       blk_queue_max_hw_sectors(sdev->request_queue,
-               min_t(size_t, queue_max_hw_sectors(sdev->request_queue),
-                     dma_max_mapping_size(dev) >> SECTOR_SHIFT));
+       lim->max_hw_sectors = min_t(size_t,
+               lim->max_hw_sectors, dma_max_mapping_size(dev) >> SECTOR_SHIFT);
 
        /*
         * We can't put these settings in slave_alloc() because that gets
@@ -582,13 +579,22 @@ static ssize_t max_sectors_store(struct device *dev, 
struct device_attribute *at
                size_t count)
 {
        struct scsi_device *sdev = to_scsi_device(dev);
+       struct queue_limits lim;
        unsigned short ms;
+       int ret;
 
-       if (sscanf(buf, "%hu", &ms) > 0) {
-               blk_queue_max_hw_sectors(sdev->request_queue, ms);
-               return count;
-       }
-       return -EINVAL;
+       if (sscanf(buf, "%hu", &ms) <= 0)
+               return -EINVAL;
+
+       blk_mq_freeze_queue(sdev->request_queue);
+       lim = queue_limits_start_update(sdev->request_queue);
+       lim.max_hw_sectors = ms;
+       ret = queue_limits_commit_update(sdev->request_queue, &lim);
+       blk_mq_unfreeze_queue(sdev->request_queue);
+
+       if (ret)
+               return ret;
+       return count;
 }
 static DEVICE_ATTR_RW(max_sectors);
 
@@ -626,7 +632,7 @@ static const struct scsi_host_template 
usb_stor_host_template = {
        .this_id =                      -1,
 
        .slave_alloc =                  slave_alloc,
-       .slave_configure =              slave_configure,
+       .device_configure =             device_configure,
        .target_alloc =                 target_alloc,
 
        /* lots of sg segments can be handled */
-- 
2.39.2

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to open-iscsi+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20240324235448.2039074-18-hch%40lst.de.

Reply via email to