Re: [PATCH] md: adding a new flag MD_DELETING

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

 



Hi Lidong,

On Sat, May 8, 2021 at 12:41 AM Zhong Lidong <lidong.zhong@xxxxxxxx> wrote:
>
> Hi Song,
>
> Could you share your opinion about this patch please?
>

The patch looks good to me. I will process it (run some tests etc)
later this week.

Thanks,
Song


>
> On 4/28/21 4:29 PM, Lidong Zhong wrote:
> > The mddev data structure is freed in mddev_delayed_delete(), which is
> > schedualed after the array is deconfigured completely when stopping. So
> > there is a race window between md_open() and do_md_stop(), which leads
> > to /dev/mdX can still be opened by userspace even it's not accessible
> > any more. As a result, a DeviceDisappeared event will not be able to be
> > monitored by mdadm in monitor mode. This patch tries to fix it by adding
> > this new flag MD_DELETING.
> >
> > Signed-off-by: Lidong Zhong <lidong.zhong@xxxxxxxx>
> > ---
> >  drivers/md/md.c | 4 +++-
> >  drivers/md/md.h | 2 ++
> >  2 files changed, 5 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/md/md.c b/drivers/md/md.c
> > index 21da0c48f6c2..566df2491318 100644
> > --- a/drivers/md/md.c
> > +++ b/drivers/md/md.c
> > @@ -6439,6 +6439,7 @@ static int do_md_stop(struct mddev *mddev, int mode,
> >               md_clean(mddev);
> >               if (mddev->hold_active == UNTIL_STOP)
> >                       mddev->hold_active = 0;
> > +             set_bit(MD_DELETING, &mddev->flags);
> >       }
> >       md_new_event(mddev);
> >       sysfs_notify_dirent_safe(mddev->sysfs_state);
> > @@ -7829,7 +7830,8 @@ static int md_open(struct block_device *bdev, fmode_t mode)
> >       if ((err = mutex_lock_interruptible(&mddev->open_mutex)))
> >               goto out;
> >
> > -     if (test_bit(MD_CLOSING, &mddev->flags)) {
> > +     if (test_bit(MD_CLOSING, &mddev->flags) ||
> > +            (test_bit(MD_DELETING, &mddev->flags) && mddev->pers == NULL)) {
> >               mutex_unlock(&mddev->open_mutex);
> >               err = -ENODEV;
> >               goto out;
> > diff --git a/drivers/md/md.h b/drivers/md/md.h
> > index bcbba1b5ec4a..83c7aa61699f 100644
> > --- a/drivers/md/md.h
> > +++ b/drivers/md/md.h
> > @@ -262,6 +262,8 @@ enum mddev_flags {
> >       MD_BROKEN,              /* This is used in RAID-0/LINEAR only, to stop
> >                                * I/O in case an array member is gone/failed.
> >                                */
> > +     MD_DELETING,            /* If set, we are deleting the array, do not open
> > +                              * it then */
> >  };
> >
> >  enum mddev_sb_flags {
> >
>



[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