!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
|
Name: mdadm
|
||||||
Version: 4.2
|
Version: 4.2
|
||||||
Release: 18
|
Release: 19
|
||||||
Summary: The software RAID arrays user manage tools
|
Summary: The software RAID arrays user manage tools
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/
|
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
|
Patch28: 0028-mdadm-super1-fix-coverity-issue-CHECKED_RETURN.patch
|
||||||
Patch39: 0029-mdadm-util.c-fix-coverity-issues.patch
|
Patch39: 0029-mdadm-util.c-fix-coverity-issues.patch
|
||||||
Patch30: 0030-mdadm-sysfs.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
|
BuildRequires: systemd gcc binutils libudev-devel
|
||||||
|
|
||||||
@ -106,6 +107,9 @@ install -d -m 710 %{buildroot}/var/run/mdadm/
|
|||||||
%{_mandir}/man*/*
|
%{_mandir}/man*/*
|
||||||
|
|
||||||
%changelog
|
%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
|
* Mon Aug 26 2024 wuguanghao <wuguanghao3@huawei.com> - 4.2-18
|
||||||
- backport bugfix patches from community
|
- backport bugfix patches from community
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user