Hi Ted, On Fri, May 17, 2024 at 10:26:46PM -0400, Theodore Ts'o wrote: > #regzbot introduced: 1c0e720228ad > > While doing final regression testing before sending a pull request for > the ext4 tree, I found a regression which was triggered by generic/347 > and generic/405 on on multiple fstests configurations, including > both ext4/4k and xfs/4k. > > It bisects cleanly to commit 1c0e720228ad ("dm: use > queue_limits_set"), and the resulting WARNING is attached below. This > stack trace can be seen for both generic/347 and generic/405. And if > I revert this commit on top of linux-next, the failure goes away, so > it pretty clearly root causes to 1c0e720228ad. > > For now, I'll add generic/347 and generic/405 to my global exclude > file, but maybe we should consider reverting the commit if it can't be > fixed quickly? Commit 1c0e720228ad is a red herring, it switches DM over to using queue_limits_set() which I now see is clearly disregarding DM's desire to disable discards (in blk_validate_limits). It looks like the combo of commit d690cb8ae14bd ("block: add an API to atomically update queue limits") and 4f563a64732da ("block: add a max_user_discard_sectors queue limit") needs fixing. This being one potential fix from code inspection I've done to this point, please see if it resolves your fstests failures (but I haven't actually looked at those fstests yet _and_ I still need to review commits d690cb8ae14bd and 4f563a64732da further -- will do on Monday, sorry for the trouble): diff --git a/block/blk-settings.c b/block/blk-settings.c index cdbaef159c4b..c442f7ec3a6b 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -165,11 +165,13 @@ static int blk_validate_limits(struct queue_limits *lim) lim->max_discard_sectors = min(lim->max_hw_discard_sectors, lim->max_user_discard_sectors); - if (!lim->max_discard_segments) - lim->max_discard_segments = 1; + if (lim->max_discard_sectors) { + if (!lim->max_discard_segments) + lim->max_discard_segments = 1; - if (lim->discard_granularity < lim->physical_block_size) - lim->discard_granularity = lim->physical_block_size; + if (lim->discard_granularity < lim->physical_block_size) + lim->discard_granularity = lim->physical_block_size; + } /* * By default there is no limit on the segment boundary alignment, diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 88114719fe18..e647e1bcd50c 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -1969,6 +1969,7 @@ int dm_table_set_restrictions(struct dm_table *t, struct request_queue *q, blk_queue_flag_clear(QUEUE_FLAG_NOWAIT, q); if (!dm_table_supports_discards(t)) { + limits->max_user_discard_sectors = 0; limits->max_hw_discard_sectors = 0; limits->discard_granularity = 0; limits->discard_alignment = 0;