GFS2: don't hold s_umount over blkdev_put
This is a GFS2 version of Tejun's patch:
4f331f01b9
vfs: don't hold s_umount over close_bdev_exclusive() call
In this case its blkdev_put itself that is the issue and this
patch uses the same solution of dropping and retaking s_umount.
Reported-by: Tejun Heo <tj@kernel.org>
Reported-by: Al Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
parent
7e3528c366
commit
dfe5b9ad83
|
@ -1366,8 +1366,18 @@ static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags,
|
||||||
if (IS_ERR(s))
|
if (IS_ERR(s))
|
||||||
goto error_bdev;
|
goto error_bdev;
|
||||||
|
|
||||||
if (s->s_root)
|
if (s->s_root) {
|
||||||
|
/*
|
||||||
|
* s_umount nests inside bd_mutex during
|
||||||
|
* __invalidate_device(). blkdev_put() acquires
|
||||||
|
* bd_mutex and can't be called under s_umount. Drop
|
||||||
|
* s_umount temporarily. This is safe as we're
|
||||||
|
* holding an active reference.
|
||||||
|
*/
|
||||||
|
up_write(&s->s_umount);
|
||||||
blkdev_put(bdev, mode);
|
blkdev_put(bdev, mode);
|
||||||
|
down_write(&s->s_umount);
|
||||||
|
}
|
||||||
|
|
||||||
memset(&args, 0, sizeof(args));
|
memset(&args, 0, sizeof(args));
|
||||||
args.ar_quota = GFS2_QUOTA_DEFAULT;
|
args.ar_quota = GFS2_QUOTA_DEFAULT;
|
||||||
|
|
Loading…
Reference in New Issue