Re: [PATCH 1/1] [PATCH V2 md-6.12 1/1] md: add new_level sysfs interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

在 2024/08/29 21:13, Xiao Ni 写道:
On Thu, Aug 29, 2024 at 8:24 PM Yu Kuai <yukuai1@xxxxxxxxxxxxxxx> wrote:

Hi,

在 2024/08/29 18:01, Xiao Ni 写道:
This interface is used to update new level during reshape progress.
Now it doesn't update new level during reshape. So it can't know the
new level when systemd service mdadm-grow-continue runs. And it can't
finally change to new level.

Hi Kuai

I'm not sure why updaing new level during reshape. Will this corrupt
data in the array completely?

There is no data corruption.



mdadm -CR /dev/md0 -l6 -n4 /dev/loop[0-3]
mdadm --wait /dev/md0
mdadm /dev/md0 --grow -l5 --backup=backup
cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid0] [raid1] [raid10]
md0 : active raid6 loop3[3] loop2[2] loop1[1] loop0[0]

The problem is that level is still 6 after mddev --grow -l5? I don't
understand yet why this is related to update new level during reshape.
:)

mdadm --grow command returns once reshape starts when specifying
backup file. And it needs mdadm-grow-continue service to monitor the
reshape progress. It doesn't record the new level when running `mdadm
--grow`. So mdadm-grow-continue doesn't know the new level and it
can't change to new level after reshape finishes. This needs userspace
patch to work together.
https://www.spinics.net/lists/raid/msg78081.html

Hi,

Got it. Then I just wonder, what kind of content are stored in the
backup file, why don't store the 'new level' in it as well, after
reshape finishes, can mdadm use the level api to do this?

Thanks,
Kuai


Best Regards

Xiao

Thanks,
Kuai


The case 07changelevels in mdadm can trigger this problem. Now it can't
run successfully. This patch is used to fix this. There is also a
userspace patch set that work together with this patch to fix this problem.

Signed-off-by: Xiao Ni <xni@xxxxxxxxxx>
---
V2: add detail about test information
   drivers/md/md.c | 29 +++++++++++++++++++++++++++++
   1 file changed, 29 insertions(+)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index d3a837506a36..3c354e7a7825 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -4141,6 +4141,34 @@ level_store(struct mddev *mddev, const char *buf, size_t len)
   static struct md_sysfs_entry md_level =
   __ATTR(level, S_IRUGO|S_IWUSR, level_show, level_store);

+static ssize_t
+new_level_show(struct mddev *mddev, char *page)
+{
+     return sprintf(page, "%d\n", mddev->new_level);
+}
+
+static ssize_t
+new_level_store(struct mddev *mddev, const char *buf, size_t len)
+{
+     unsigned int n;
+     int err;
+
+     err = kstrtouint(buf, 10, &n);
+     if (err < 0)
+             return err;
+     err = mddev_lock(mddev);
+     if (err)
+             return err;
+
+     mddev->new_level = n;
+     md_update_sb(mddev, 1);
+
+     mddev_unlock(mddev);
+     return len;
+}
+static struct md_sysfs_entry md_new_level =
+__ATTR(new_level, 0664, new_level_show, new_level_store);
+
   static ssize_t
   layout_show(struct mddev *mddev, char *page)
   {
@@ -5666,6 +5694,7 @@ __ATTR(serialize_policy, S_IRUGO | S_IWUSR, serialize_policy_show,

   static struct attribute *md_default_attrs[] = {
       &md_level.attr,
+     &md_new_level.attr,
       &md_layout.attr,
       &md_raid_disks.attr,
       &md_uuid.attr,





.






[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux