!134 super1 clear extra flags when initializing metadata
From: @wguanghao Reviewed-by: @liubo254 Signed-off-by: @liubo254
This commit is contained in:
commit
14e8f7ef6b
@ -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
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
Name: mdadm
|
||||
Version: 4.2
|
||||
Release: 18
|
||||
Release: 19
|
||||
Summary: The software RAID arrays user manage tools
|
||||
License: GPLv2+
|
||||
URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/
|
||||
@ -40,6 +40,7 @@ Patch27: 0027-mdadm-mdopen-fix-coverity-issue-CHECKED_RETURN.patch
|
||||
Patch28: 0028-mdadm-super1-fix-coverity-issue-CHECKED_RETURN.patch
|
||||
Patch39: 0029-mdadm-util.c-fix-coverity-issues.patch
|
||||
Patch30: 0030-mdadm-sysfs.c-fix-coverity-issues.patch
|
||||
Patch31: 0031-super1-Clear-extra-flags-when-initializing-metadata.patch
|
||||
|
||||
BuildRequires: systemd gcc binutils libudev-devel
|
||||
|
||||
@ -106,6 +107,9 @@ install -d -m 710 %{buildroot}/var/run/mdadm/
|
||||
%{_mandir}/man*/*
|
||||
|
||||
%changelog
|
||||
* Tue Mar 18 2025 wuguanghao <wuguanghao3@huawei.com> - 4.2-19
|
||||
- super1 clear extra flags when initializing metadata
|
||||
|
||||
* Mon Aug 26 2024 wuguanghao <wuguanghao3@huawei.com> - 4.2-18
|
||||
- backport bugfix patches from community
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user