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 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, > > >