aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.com>2017-04-05 23:16:33 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-05-25 09:44:33 -0400
commit7e789787878321fc2b1b7869963fa5eeede7402e (patch)
tree9d5083a4428a7588fe0ffcbf5b43982ead510994 /drivers/md
parentfa9a4a9c6d6ffb21c220418384ed9d89f8c18e35 (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.c5
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);
7043out: 7046out:
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