Revert "dm: use queue_limits_set"
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 12 Mar 2024 00:11:28 +0000 (17:11 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 12 Mar 2024 00:11:28 +0000 (17:11 -0700)
This reverts commit 8e0ef412869430d114158fc3b9b1fb111e247bd3.

It's broken, and causes the boot to fail on encrypted volumes.

Reported-and-bisected-by: Johannes Weiner <hannes@cmpxchg.org>
Link: https://lore.kernel.org/all/20240311235023.GA1205@cmpxchg.org/
Acked-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
block/blk-settings.c
drivers/md/dm-table.c

index 3c7d8d638ab59dc9704aa01217c9b940b5941e4b..e160d56e8edaa19f2e9e72dacc2552fcc652244a 100644 (file)
@@ -267,7 +267,7 @@ int queue_limits_commit_update(struct request_queue *q,
 EXPORT_SYMBOL_GPL(queue_limits_commit_update);
 
 /**
- * queue_limits_set - apply queue limits to queue
+ * queue_limits_commit_set - apply queue limits to queue
  * @q:         queue to update
  * @lim:       limits to apply
  *
index 88114719fe187ad42905424b2f5e685bf3e21e17..41f1d731ae5ac275d90fbc334666438187da02b4 100644 (file)
@@ -1963,27 +1963,26 @@ 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)) {
-               limits->max_hw_discard_sectors = 0;
-               limits->discard_granularity = 0;
-               limits->discard_alignment = 0;
-               limits->discard_misaligned = 0;
+               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;
        }
 
-       if (!dm_table_supports_write_zeroes(t))
-               limits->max_write_zeroes_sectors = 0;
-
        if (!dm_table_supports_secure_erase(t))
-               limits->max_secure_erase_sectors = 0;
-
-       r = queue_limits_set(q, limits);
-       if (r)
-               return r;
+               q->limits.max_secure_erase_sectors = 0;
 
        if (dm_table_supports_flush(t, (1UL << QUEUE_FLAG_WC))) {
                wc = true;
@@ -2008,6 +2007,9 @@ 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);
 
        /*
@@ -2045,6 +2047,7 @@ 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