diff options
author | NeilBrown <neilb@suse.com> | 2017-04-05 23:16:33 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-05-25 09:44:33 -0400 |
commit | 7e789787878321fc2b1b7869963fa5eeede7402e (patch) | |
tree | 9d5083a4428a7588fe0ffcbf5b43982ead510994 /drivers/md | |
parent | fa9a4a9c6d6ffb21c220418384ed9d89f8c18e35 (diff) |
md: MD_CLOSING needs to be cleared after called md_set_readonly or do_md_stop
commit 065e519e71b2c1f41936cce75b46b5ab34adb588 upstream.
if called md_set_readonly and set MD_CLOSING bit, the mddev cannot
be opened any more due to the MD_CLOING bit wasn't cleared. Thus it
needs to be cleared in md_ioctl after any call to md_set_readonly()
or do_md_stop().
Signed-off-by: NeilBrown <neilb@suse.com>
Fixes: af8d8e6f0315 ("md: changes for MD_STILL_CLOSED flag")
Signed-off-by: Zhilong Liu <zlliu@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/md')
-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 24925f2aa235..eddd360624a1 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -6752,6 +6752,7 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, | |||
6752 | void __user *argp = (void __user *)arg; | 6752 | void __user *argp = (void __user *)arg; |
6753 | struct mddev *mddev = NULL; | 6753 | struct mddev *mddev = NULL; |
6754 | int ro; | 6754 | int ro; |
6755 | bool did_set_md_closing = false; | ||
6755 | 6756 | ||
6756 | if (!md_ioctl_valid(cmd)) | 6757 | if (!md_ioctl_valid(cmd)) |
6757 | return -ENOTTY; | 6758 | return -ENOTTY; |
@@ -6841,7 +6842,9 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode, | |||
6841 | err = -EBUSY; | 6842 | err = -EBUSY; |
6842 | goto out; | 6843 | goto out; |
6843 | } | 6844 | } |
6845 | WARN_ON_ONCE(test_bit(MD_CLOSING, &mddev->flags)); | ||
6844 | set_bit(MD_CLOSING, &mddev->flags); | 6846 | set_bit(MD_CLOSING, &mddev->flags); |
6847 | did_set_md_closing = true; | ||
6845 | mutex_unlock(&mddev->open_mutex); | 6848 | mutex_unlock(&mddev->open_mutex); |
6846 | sync_blockdev(bdev); | 6849 | sync_blockdev(bdev); |
6847 | } | 6850 | } |
@@ -7041,6 +7044,8 @@ unlock: | |||
7041 | mddev->hold_active = 0; | 7044 | mddev->hold_active = 0; |
7042 | mddev_unlock(mddev); | 7045 | mddev_unlock(mddev); |
7043 | out: | 7046 | out: |
7047 | if(did_set_md_closing) | ||
7048 | clear_bit(MD_CLOSING, &mddev->flags); | ||
7044 | return err; | 7049 | return err; |
7045 | } | 7050 | } |
7046 | #ifdef CONFIG_COMPAT | 7051 | #ifdef CONFIG_COMPAT |