dm: use queue_limits_set
authorChristoph Hellwig <hch@lst.de>
Wed, 28 Feb 2024 22:56:42 +0000 (14:56 -0800)
committerMike Snitzer <snitzer@kernel.org>
Tue, 23 Apr 2024 15:20:16 +0000 (11:20 -0400)
Use queue_limits_set which validates the limits and takes care of
updating the readahead settings instead of directly assigning them to
the queue.  For that make sure all limits are actually updated before
the assignment.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Mike Snitzer <snitzer@kernel.org>
drivers/md/dm-table.c

index 41f1d731ae5ac275d90fbc334666438187da02b4..88114719fe187ad42905424b2f5e685bf3e21e17 100644 (file)
@@ -1963,26 +1963,27 @@ int dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,
        bool wc = false, fua = false;
        int r;
 
-       /*
-        * Copy table's limits to the DM device's request_queue
-        */
-       q->limits = *limits;
-
        if (dm_table_supports_nowait(t))
                blk_queue_flag_set(QUEUE_FLAG_NOWAIT, q);
        else
                blk_queue_flag_clear(QUEUE_FLAG_NOWAIT, q);
 
        if (!dm_table_supports_discards(t)) {
-               q->limits.max_discard_sectors = 0;
-               q->limits.max_hw_discard_sectors = 0;
-               q->limits.discard_granularity = 0;
-               q->limits.discard_alignment = 0;
-               q->limits.discard_misaligned = 0;
+               limits->max_hw_discard_sectors = 0;
+               limits->discard_granularity = 0;
+               limits->discard_alignment = 0;
+               limits->discard_misaligned = 0;
        }
 
+       if (!dm_table_supports_write_zeroes(t))
+               limits->max_write_zeroes_sectors = 0;
+
        if (!dm_table_supports_secure_erase(t))
-               q->limits.max_secure_erase_sectors = 0;
+               limits->max_secure_erase_sectors = 0;
+
+       r = queue_limits_set(q, limits);
+       if (r)
+               return r;
 
        if (dm_table_supports_flush(t, (1UL << QUEUE_FLAG_WC))) {
                wc = true;
@@ -2007,9 +2008,6 @@ int dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,
        else
                blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
 
-       if (!dm_table_supports_write_zeroes(t))
-               q->limits.max_write_zeroes_sectors = 0;
-
        dm_table_verify_integrity(t);
 
        /*
@@ -2047,7 +2045,6 @@ int dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,
        }
 
        dm_update_crypto_profile(q, t);
-       disk_update_readahead(t->md->disk);
 
        /*
         * Check for request-based device is left to