aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc
diff options
context:
space:
mode:
authorVasiliy Kulikov <segoon@openwall.com>2012-04-05 14:25:04 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2012-04-05 15:25:50 -0700
commit99663be772c827b8f5f594fe87eb4807be1994e5 (patch)
treef1adffce3f6d10a90f5be8b86b96729ce8c5d23c /fs/proc
parent10bdfb5ef7e1a429a3de31e498942a8ae5749a46 (diff)
downloadkernel_goldelico_gta04-99663be772c827b8f5f594fe87eb4807be1994e5.zip
kernel_goldelico_gta04-99663be772c827b8f5f594fe87eb4807be1994e5.tar.gz
kernel_goldelico_gta04-99663be772c827b8f5f594fe87eb4807be1994e5.tar.bz2
proc: fix mount -t proc -o AAA
The proc_parse_options() call from proc_mount() runs only once at boot time. So on any later mount attempt, any mount options are ignored because ->s_root is already initialized. As a consequence, "mount -o <options>" will ignore the options. The only way to change mount options is "mount -o remount,<options>". To fix this, parse the mount options unconditionally. Signed-off-by: Vasiliy Kulikov <segoon@openwall.com> Reported-by: Arkadiusz Miskiewicz <a.miskiewicz@gmail.com> Tested-by: Arkadiusz Miskiewicz <a.miskiewicz@gmail.com> Cc: Alexey Dobriyan <adobriyan@gmail.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Valdis Kletnieks <Valdis.Kletnieks@vt.edu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/proc')
-rw-r--r--fs/proc/root.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/fs/proc/root.c b/fs/proc/root.c
index 46a15d8..eed44bf 100644
--- a/fs/proc/root.c
+++ b/fs/proc/root.c
@@ -115,12 +115,13 @@ static struct dentry *proc_mount(struct file_system_type *fs_type,
if (IS_ERR(sb))
return ERR_CAST(sb);
+ if (!proc_parse_options(options, ns)) {
+ deactivate_locked_super(sb);
+ return ERR_PTR(-EINVAL);
+ }
+
if (!sb->s_root) {
sb->s_flags = flags;
- if (!proc_parse_options(options, ns)) {
- deactivate_locked_super(sb);
- return ERR_PTR(-EINVAL);
- }
err = proc_fill_super(sb);
if (err) {
deactivate_locked_super(sb);