Thread (5 messages) 5 messages, 2 authors, 2021-06-04

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

From: Song Liu <song@kernel.org>
Date: 2021-05-11 06:39:39

Hi Lidong,

On Sat, May 8, 2021 at 12:41 AM Zhong Lidong [off-list ref] 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:
quoted
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 <redacted>
---
 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 {
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help