super1 clear extra flags when initializing metadata

(cherry picked from commit 29a34781e4b5901eeb8196b2db0e8e6463ade95c)
This commit is contained in:
wguanghao 2025-03-18 02:31:02 +00:00 committed by openeuler-sync-bot
parent 470b88ad3e
commit 08f28303d6
2 changed files with 77 additions and 1 deletions

View File

@ -0,0 +1,72 @@
From e556604c2121338ad532222b524baff8e03d3e84 Mon Sep 17 00:00:00 2001
From: Wu Guanghao <wuguanghao3@huawei.com>
Date: Tue, 11 Mar 2025 03:11:55 +0000
Subject: [PATCH] super1: Clear extra flags when initializing metadata
When adding a disk to a RAID1 array, the metadata is read from the
existing member disks for sync. However, only the bad_blocks flag are
copied, the bad_blocks records are not copied, so the bad_blocks
records are all zeros. The kernel function super_1_load() detects
bad_blocks flag and reads the bad_blocks record, then sets the bad
block using badblocks_set().
After the kernel commit 1726c7746783 (badblocks: improve badblocks_set()
for multiple ranges handling) if the length of a bad_blocks record is 0,
it will return a failure. Therefore the device addition will fail.
So when adding a new disk, some flags cannot be sync and need to be clead.
Signed-off-by: Wu Guanghao <wuguanghao3@huawei.com>
---
super1.c | 3 +++
tests/05r1-add-badblocks | 24 ++++++++++++++++++++++++
2 files changed, 27 insertions(+)
create mode 100644 tests/05r1-add-badblocks
diff --git a/super1.c b/super1.c
index 6354bea..e9aa216 100644
--- a/super1.c
+++ b/super1.c
@@ -1952,6 +1952,9 @@ static int write_init_super1(struct supertype *st)
long bm_offset;
int raid0_need_layout = 0;
+ /* Clear extra flags */
+ sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_BAD_BLOCKS | MD_FEATURE_REPLACEMENT);
+
for (di = st->info; di; di = di->next) {
if (di->disk.state & (1 << MD_DISK_JOURNAL))
sb->feature_map |= __cpu_to_le32(MD_FEATURE_JOURNAL);
diff --git a/tests/05r1-add-badblocks b/tests/05r1-add-badblocks
new file mode 100644
index 0000000..6192327
--- /dev/null
+++ b/tests/05r1-add-badblocks
@@ -0,0 +1,24 @@
+#
+# create a raid1 with a drive and set badblocks for the drive.
+# add a new drive does not cause an error.
+#
+
+# create raid1
+mdadm -CR $md0 -l1 -n2 -e1.0 $dev1 missing
+testdev $md0 1 $mdsize1a 64
+sleep 3
+
+# set badblocks for the drive
+dev1_name=$(basename $dev1)
+echo "100 100" > /sys/block/md0/md/dev-$dev1_name/bad_blocks
+echo "write_error" > /sys/block/md0/md/dev-$dev1_name/state
+
+# write badblocks to metadata
+dd if=/dev/zero of=$md0 bs=512 count=200 oflag=direct
+
+# re-add and recovery
+mdadm $md0 -a $dev2
+check recovery
+
+mdadm -S $md0
+
--
2.33.0

View File

@ -1,6 +1,6 @@
Name: mdadm
Version: 4.2
Release: 14
Release: 15
Summary: The software RAID arrays user manage tools
License: GPLv2+
URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/
@ -35,6 +35,7 @@ Patch22: 0022-mdadm-mdopen-fix-coverity-issue-CHECKED_RETURN.patch
Patch23: 0023-mdadm-super1-fix-coverity-issue-CHECKED_RETURN.patch
Patch24: 0024-mdadm-util.c-fix-coverity-issues.patch
Patch25: 0025-mdadm-sysfs.c-fix-coverity-issues.patch
Patch26: 0026-super1-Clear-extra-flags-when-initializing-metadata.patch
BuildRequires: systemd gcc binutils libudev-devel
Requires(post): systemd coreutils
@ -100,6 +101,9 @@ install -d -m 710 %{buildroot}/var/run/mdadm/
%{_mandir}/man*/*
%changelog
* Tue Mar 18 2025 wuguanghao <wuguanghao3@huawei.com> - 4.2-15
- Super1 clear extra flags when initializing metadata
* Wed Aug 28 2024 wuguanghao <wuguanghao3@huawei.com> - 4.2-14
- backport bugfix patches from community