scsi: core: Use the atomic queue limits API in scsi_add_lun()
authorChristoph Hellwig <hch@lst.de>
Tue, 9 Apr 2024 14:37:34 +0000 (16:37 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 12 Apr 2024 01:37:49 +0000 (21:37 -0400)
Switch scsi_add_lun() to use the atomic queue limits API to update the
max_hw_sectors for devices with quirks.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20240409143748.980206-10-hch@lst.de
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: John Garry <john.g.garry@oracle.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_scan.c

index 205ab3b3ea89beb04f965d931d7838973c145fd0..1ec4b309af726d6477156649fdfb35355555bb8d 100644 (file)
@@ -874,6 +874,7 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,
 static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
                blist_flags_t *bflags, int async)
 {
+       struct queue_limits lim;
        int ret;
 
        /*
@@ -1004,19 +1005,6 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
        if (*bflags & BLIST_SELECT_NO_ATN)
                sdev->select_no_atn = 1;
 
-       /*
-        * Maximum 512 sector transfer length
-        * broken RA4x00 Compaq Disk Array
-        */
-       if (*bflags & BLIST_MAX_512)
-               blk_queue_max_hw_sectors(sdev->request_queue, 512);
-       /*
-        * Max 1024 sector transfer length for targets that report incorrect
-        * max/optimal lengths and relied on the old block layer safe default
-        */
-       else if (*bflags & BLIST_MAX_1024)
-               blk_queue_max_hw_sectors(sdev->request_queue, 1024);
-
        /*
         * Some devices may not want to have a start command automatically
         * issued when a device is added.
@@ -1077,6 +1065,20 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
 
        transport_configure_device(&sdev->sdev_gendev);
 
+       /*
+        * No need to freeze the queue as it isn't reachable to anyone else yet.
+        */
+       lim = queue_limits_start_update(sdev->request_queue);
+       if (*bflags & BLIST_MAX_512)
+               lim.max_hw_sectors = 512;
+       else if (*bflags & BLIST_MAX_1024)
+               lim.max_hw_sectors = 1024;
+       ret = queue_limits_commit_update(sdev->request_queue, &lim);
+       if (ret) {
+               sdev_printk(KERN_ERR, sdev, "failed to apply queue limits.\n");
+               return SCSI_SCAN_NO_RESPONSE;
+       }
+
        if (sdev->host->hostt->slave_configure) {
                ret = sdev->host->hostt->slave_configure(sdev);
                if (ret) {