diff options
author | Andrew Price <anprice@redhat.com> | 2015-09-23 09:45:43 -0400 |
---|---|---|
committer | Bob Peterson <rpeterso@redhat.com> | 2015-09-23 09:45:43 -0400 |
commit | 6de20eb0dee4c802d9d228d6c08d00386e172e52 (patch) | |
tree | 0cb2d63548aee11bcf8204cedba10eef06b0ede1 /fs/gfs2 | |
parent | 4b813f09405823dcbb27a434f6ddcd1741e55e9b (diff) |
GFS2: Set s_mode before parsing mount options
In the generic mount_bdev() function, deactivate_locked_super() is
called after the fill_super() call fails, at which point s_mode has been
set. kill_block_super() expects this and dumps a warning when
FMODE_EXCL is not set in s_mode.
In gfs2_mount() we call deactivate_locked_super() on failure of
gfs2_mount_args(), at which point s_mode has not yet been set. This
causes kill_block_super() to dump a stack trace when gfs2 fails to mount
with invalid options. Set s_mode earlier in gfs2_mount() to avoid that.
Signed-off-by: Andrew Price <anprice@redhat.com>
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Diffstat (limited to 'fs/gfs2')
-rw-r--r-- | fs/gfs2/ops_fstype.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 02586e7eb964..baab99b69d8a 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
@@ -1291,6 +1291,9 @@ static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags, | |||
1291 | up_write(&s->s_umount); | 1291 | up_write(&s->s_umount); |
1292 | blkdev_put(bdev, mode); | 1292 | blkdev_put(bdev, mode); |
1293 | down_write(&s->s_umount); | 1293 | down_write(&s->s_umount); |
1294 | } else { | ||
1295 | /* s_mode must be set before deactivate_locked_super calls */ | ||
1296 | s->s_mode = mode; | ||
1294 | } | 1297 | } |
1295 | 1298 | ||
1296 | memset(&args, 0, sizeof(args)); | 1299 | memset(&args, 0, sizeof(args)); |
@@ -1314,7 +1317,6 @@ static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags, | |||
1314 | } else { | 1317 | } else { |
1315 | char b[BDEVNAME_SIZE]; | 1318 | char b[BDEVNAME_SIZE]; |
1316 | 1319 | ||
1317 | s->s_mode = mode; | ||
1318 | strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); | 1320 | strlcpy(s->s_id, bdevname(bdev, b), sizeof(s->s_id)); |
1319 | sb_set_blocksize(s, block_size(bdev)); | 1321 | sb_set_blocksize(s, block_size(bdev)); |
1320 | error = fill_super(s, &args, flags & MS_SILENT ? 1 : 0); | 1322 | error = fill_super(s, &args, flags & MS_SILENT ? 1 : 0); |