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]

 



On Fri, Aug 30, 2024 at 3:37 PM Yu Kuai <yukuai1@xxxxxxxxxxxxxxx> wrote:
>
> Hi,
>
> 在 2024/08/29 21:48, Xiao Ni 写道:
> > On Thu, Aug 29, 2024 at 9:34 PM Yu Kuai <yukuai1@xxxxxxxxxxxxxxx> wrote:
> >>
> >> 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?
> >
> > The backup file has a superblock too and the content is the data from
> > the raid. The service monitors reshape progress and controls it. It
> > copies the data from raid to backup file, and then it reshapes. Now we
> > usually don't care about it because the data offset can change and it
> > has free space. For situations where the data offset can't be changed,
> > it needs to write the data to the region where it is read from. If
> > there is a power down or something else, the backup file can avoid
> > data corruption.
> >
> > It should be right to update the new level in md during reshape. If
> > not, the new level is wrong.
>
> Thanks for the explanation, I still need to investigate more about
> detals, I won't object to the new sysfs api, however, I'll suggest
> consider this as the final choice.

Hi Kuai

The userspace reshape_array is the key function. Feel free to ask any
questions. I didn't know much about it before fixing mdadm regression
test cases. For now, I think it's the easiest way to fix this. It
needs to update the superblock with the right information.

By the way, the --backup design doesn't work as expected. There is a
data corruption risk when reshaping with a backup file. I didn't fix
it because focus on fixing regression cases this time.

Best Regards
Xiao
>
> Thanks,
> Kuai
> >
> > Best Regards
> > Xiao
> >>
> >> 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