diff options
-rw-r--r-- | drivers/md/md.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 1db88d79549a..a612b9f83069 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -6925,6 +6925,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, | |||
6925 | void __user *argp = (void __user *)arg; | 6925 | void __user *argp = (void __user *)arg; |
6926 | struct mddev *mddev = NULL; | 6926 | struct mddev *mddev = NULL; |
6927 | int ro; | 6927 | int ro; |
6928 | bool did_set_md_closing = false; | ||
6928 | 6929 | ||
6929 | if (!md_ioctl_valid(cmd)) | 6930 | if (!md_ioctl_valid(cmd)) |
6930 | return -ENOTTY; | 6931 | return -ENOTTY; |
@@ -7014,7 +7015,9 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, | |||
7014 | err = -EBUSY; | 7015 | err = -EBUSY; |
7015 | goto out; | 7016 | goto out; |
7016 | } | 7017 | } |
7018 | WARN_ON_ONCE(test_bit(MD_CLOSING, &mddev->flags)); | ||
7017 | set_bit(MD_CLOSING, &mddev->flags); | 7019 | set_bit(MD_CLOSING, &mddev->flags); |
7020 | did_set_md_closing = true; | ||
7018 | mutex_unlock(&mddev->open_mutex); | 7021 | mutex_unlock(&mddev->open_mutex); |
7019 | sync_blockdev(bdev); | 7022 | sync_blockdev(bdev); |
7020 | } | 7023 | } |
@@ -7207,6 +7210,8 @@ unlock: | |||
7207 | mddev->hold_active = 0; | 7210 | mddev->hold_active = 0; |
7208 | mddev_unlock(mddev); | 7211 | mddev_unlock(mddev); |
7209 | out: | 7212 | out: |
7213 | if(did_set_md_closing) | ||
7214 | clear_bit(MD_CLOSING, &mddev->flags); | ||
7210 | return err; | 7215 | return err; |
7211 | } | 7216 | } |
7212 | #ifdef CONFIG_COMPAT | 7217 | #ifdef CONFIG_COMPAT |