* [PATCH 1/2] md: Fix logical_block_size configuration being overwritten
@ 2025-12-19 9:21 linan666
2025-12-19 9:21 ` [PATCH 2/2] md: Fix forward incompatibility from configurable logical block size linan666
2025-12-25 8:30 ` [PATCH 1/2] md: Fix logical_block_size configuration being overwritten Yu Kuai
0 siblings, 2 replies; 4+ messages in thread
From: linan666 @ 2025-12-19 9:21 UTC (permalink / raw)
To: song, yukuai, xni, linan122
Cc: linux-raid, linux-kernel, linan666, yangerkun, yi.zhang, bugreports61
From: Li Nan <linan122@huawei.com>
In super_1_validate(), mddev->logical_block_size is directly overwritten
with the value from metadata. This causes the previously configured lbs
to be lost, making the configuration ineffective. Fix it.
Fixes: 62ed1b582246 ("md: allow configuring logical block size")
Signed-off-by: Li Nan <linan122@huawei.com>
---
drivers/md/md.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/md/md.c b/drivers/md/md.c
index e5922a682953..7c0dd94a4d25 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -1999,7 +1999,6 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *freshest, struc
mddev->layout = le32_to_cpu(sb->layout);
mddev->raid_disks = le32_to_cpu(sb->raid_disks);
mddev->dev_sectors = le64_to_cpu(sb->size);
- mddev->logical_block_size = le32_to_cpu(sb->logical_block_size);
mddev->events = ev1;
mddev->bitmap_info.offset = 0;
mddev->bitmap_info.space = 0;
@@ -2015,6 +2014,9 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *freshest, struc
mddev->max_disks = (4096-256)/2;
+ if (!mddev->logical_block_size)
+ mddev->logical_block_size = le32_to_cpu(sb->logical_block_size);
+
if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET) &&
mddev->bitmap_info.file == NULL) {
mddev->bitmap_info.offset =
--
2.39.2
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH 2/2] md: Fix forward incompatibility from configurable logical block size 2025-12-19 9:21 [PATCH 1/2] md: Fix logical_block_size configuration being overwritten linan666 @ 2025-12-19 9:21 ` linan666 2025-12-25 8:39 ` Yu Kuai 2025-12-25 8:30 ` [PATCH 1/2] md: Fix logical_block_size configuration being overwritten Yu Kuai 1 sibling, 1 reply; 4+ messages in thread From: linan666 @ 2025-12-19 9:21 UTC (permalink / raw) To: song, yukuai, xni, linan122 Cc: linux-raid, linux-kernel, linan666, yangerkun, yi.zhang, bugreports61 From: Li Nan <linan122@huawei.com> Commit 62ed1b582246 ("md: allow configuring logical block size") used reserved pad to add 'logical_block_size' to metadata. RAID rejects non-zero reserved pad, so arrays fail when rolling back to old kernels after booting new ones. Set 'logical_block_size' only for newly created arrays to support rollback to old kernels. Importantly new arrays still won't work on old kernels to prevent data loss issue from LBS changes. For arrays created on old kernels which confirmed not to rollback, configure LBS by echo 'enable' to md/logical_block_size. Fixes: 62ed1b582246 ("md: allow configuring logical block size") Reported-by: BugReports <bugreports61@gmail.com> Closes: https://lore.kernel.org/linux-raid/825e532d-d1e1-44bb-5581-692b7c091796@huaweicloud.com/T/#t Signed-off-by: Li Nan <linan122@huawei.com> --- drivers/md/md.c | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 7c0dd94a4d25..28c9435016fe 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -2014,8 +2014,14 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *freshest, struc mddev->max_disks = (4096-256)/2; - if (!mddev->logical_block_size) + if (!mddev->logical_block_size) { mddev->logical_block_size = le32_to_cpu(sb->logical_block_size); + if (!mddev->logical_block_size) + pr_warn("%s: echo 'enable' to md/logical_block_size to prevent data loss issue from LBS changes.\n" + " Note: After enable, array will not be assembled in old kernels (<= 6.18)\n", + mdname(mddev)); + } + if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET) && mddev->bitmap_info.file == NULL) { @@ -5983,8 +5989,27 @@ lbs_store(struct mddev *mddev, const char *buf, size_t len) if (mddev->major_version == 0) return -EINVAL; - if (mddev->pers) - return -EBUSY; + if (mddev->pers) { + if (mddev->logical_block_size) + return -EBUSY; + /* + * To fix forward compatibility issues, LBS is not + * configured in old kernels array (<=6.18) by default. + * If the user confirms no rollback to old kernels, + * enable LBS by writing "enable" — to prevent data + * loss from LBS changes. + */ + if (cmd_match(buf, "enable")) { + mddev->logical_block_size = + queue_logical_block_size(mddev->gendisk->queue); + set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); + pr_info("%s: config logical block size success, array will not be assembled in old kernels (<= 6.18)\n", + mdname(mddev)); + return len; + } else { + return -EBUSY; + } + } err = kstrtouint(buf, 10, &lbs); if (err < 0) @@ -6165,7 +6190,18 @@ int mddev_stack_rdev_limits(struct mddev *mddev, struct queue_limits *lim, mdname(mddev)); return -EINVAL; } - mddev->logical_block_size = lim->logical_block_size; + + /* + * Fix forward compatibility issue. Only set LBS by default for + * new array, mddev->events == 0 indicates the array was just + * created. When assembling an array, read LBS from the superblock + * instead — LBS is 0 in superblocks created by old kernels. + */ + if (!mddev->events && mddev->major_version == 1) { + pr_info("%s: array will not be assembled in old kernels that lack configurable lbs support (<= 6.18)\n", + mdname(mddev)); + mddev->logical_block_size = lim->logical_block_size; + } return 0; } -- 2.39.2 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] md: Fix forward incompatibility from configurable logical block size 2025-12-19 9:21 ` [PATCH 2/2] md: Fix forward incompatibility from configurable logical block size linan666 @ 2025-12-25 8:39 ` Yu Kuai 0 siblings, 0 replies; 4+ messages in thread From: Yu Kuai @ 2025-12-25 8:39 UTC (permalink / raw) To: linan666, song, xni, linan122 Cc: linux-raid, linux-kernel, yangerkun, yi.zhang, bugreports61, yukuai Hi, 在 2025/12/19 17:21, linan666@huaweicloud.com 写道: > From: Li Nan <linan122@huawei.com> > > Commit 62ed1b582246 ("md: allow configuring logical block size") used > reserved pad to add 'logical_block_size' to metadata. RAID rejects > non-zero reserved pad, so arrays fail when rolling back to old kernels > after booting new ones. > > Set 'logical_block_size' only for newly created arrays to support rollback > to old kernels. Importantly new arrays still won't work on old kernels to > prevent data loss issue from LBS changes. > > For arrays created on old kernels which confirmed not to rollback, > configure LBS by echo 'enable' to md/logical_block_size. > > Fixes: 62ed1b582246 ("md: allow configuring logical block size") > Reported-by: BugReports <bugreports61@gmail.com> > Closes: https://lore.kernel.org/linux-raid/825e532d-d1e1-44bb-5581-692b7c091796@huaweicloud.com/T/#t > Signed-off-by: Li Nan <linan122@huawei.com> > --- > drivers/md/md.c | 44 ++++++++++++++++++++++++++++++++++++++++---- > 1 file changed, 40 insertions(+), 4 deletions(-) > > diff --git a/drivers/md/md.c b/drivers/md/md.c > index 7c0dd94a4d25..28c9435016fe 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -2014,8 +2014,14 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *freshest, struc > > mddev->max_disks = (4096-256)/2; > > - if (!mddev->logical_block_size) > + if (!mddev->logical_block_size) { > mddev->logical_block_size = le32_to_cpu(sb->logical_block_size); > + if (!mddev->logical_block_size) > + pr_warn("%s: echo 'enable' to md/logical_block_size to prevent data loss issue from LBS changes.\n" > + " Note: After enable, array will not be assembled in old kernels (<= 6.18)\n", > + mdname(mddev)); Looks like this will print the same message for every rdev added to this array, please move the warning to mddev_stack_rdev_limits() as well. > + } > + > > if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET) && > mddev->bitmap_info.file == NULL) { > @@ -5983,8 +5989,27 @@ lbs_store(struct mddev *mddev, const char *buf, size_t len) > if (mddev->major_version == 0) > return -EINVAL; > > - if (mddev->pers) > - return -EBUSY; > + if (mddev->pers) { > + if (mddev->logical_block_size) > + return -EBUSY; > + /* > + * To fix forward compatibility issues, LBS is not > + * configured in old kernels array (<=6.18) by default. > + * If the user confirms no rollback to old kernels, > + * enable LBS by writing "enable" — to prevent data > + * loss from LBS changes. > + */ > + if (cmd_match(buf, "enable")) { > + mddev->logical_block_size = > + queue_logical_block_size(mddev->gendisk->queue); > + set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags); > + pr_info("%s: config logical block size success, array will not be assembled in old kernels (<= 6.18)\n", > + mdname(mddev)); Instead of a new string "enabled", I'll prefer to echo the exact lbs. > + return len; > + } else { > + return -EBUSY; > + } > + } > > err = kstrtouint(buf, 10, &lbs); > if (err < 0) > @@ -6165,7 +6190,18 @@ int mddev_stack_rdev_limits(struct mddev *mddev, struct queue_limits *lim, > mdname(mddev)); > return -EINVAL; > } > - mddev->logical_block_size = lim->logical_block_size; > + > + /* > + * Fix forward compatibility issue. Only set LBS by default for > + * new array, mddev->events == 0 indicates the array was just > + * created. When assembling an array, read LBS from the superblock > + * instead — LBS is 0 in superblocks created by old kernels. > + */ > + if (!mddev->events && mddev->major_version == 1) { > + pr_info("%s: array will not be assembled in old kernels that lack configurable lbs support (<= 6.18)\n", > + mdname(mddev)); > + mddev->logical_block_size = lim->logical_block_size; > + } > > return 0; > } -- Thansk, Kuai ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] md: Fix logical_block_size configuration being overwritten 2025-12-19 9:21 [PATCH 1/2] md: Fix logical_block_size configuration being overwritten linan666 2025-12-19 9:21 ` [PATCH 2/2] md: Fix forward incompatibility from configurable logical block size linan666 @ 2025-12-25 8:30 ` Yu Kuai 1 sibling, 0 replies; 4+ messages in thread From: Yu Kuai @ 2025-12-25 8:30 UTC (permalink / raw) To: linan666, song, xni, linan122 Cc: linux-raid, linux-kernel, yangerkun, yi.zhang, bugreports61, yukuai 在 2025/12/19 17:21, linan666@huaweicloud.com 写道: > From: Li Nan<linan122@huawei.com> > > In super_1_validate(), mddev->logical_block_size is directly overwritten > with the value from metadata. This causes the previously configured lbs > to be lost, making the configuration ineffective. Fix it. > > Fixes: 62ed1b582246 ("md: allow configuring logical block size") > Signed-off-by: Li Nan<linan122@huawei.com> > --- > drivers/md/md.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-)\ LGTM Reviewed-by: Yu Kuai <yukuai@fnnas.com> -- Thansk, Kuai ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-12-25 8:39 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-12-19 9:21 [PATCH 1/2] md: Fix logical_block_size configuration being overwritten linan666 2025-12-19 9:21 ` [PATCH 2/2] md: Fix forward incompatibility from configurable logical block size linan666 2025-12-25 8:39 ` Yu Kuai 2025-12-25 8:30 ` [PATCH 1/2] md: Fix logical_block_size configuration being overwritten Yu Kuai
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®