]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
fs/adfs: super: safely update options on remount
authorRussell King <rmk+kernel@armlinux.org.uk>
Tue, 4 Jun 2019 13:50:09 +0000 (14:50 +0100)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 27 Jun 2019 00:14:14 +0000 (20:14 -0400)
Only update the options on remount if we successfully parse all options,
rather than updating those we've managed to parse.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/adfs/super.c

index b393905abe13fdfbb49c36f3b3e0cf8d6e444905..2f81c1c297573a2bb291ca230f6fcaf21c602df2 100644 (file)
@@ -170,10 +170,10 @@ static const match_table_t tokens = {
        {Opt_err, NULL}
 };
 
-static int parse_options(struct super_block *sb, char *options)
+static int parse_options(struct super_block *sb, struct adfs_sb_info *asb,
+                        char *options)
 {
        char *p;
-       struct adfs_sb_info *asb = ADFS_SB(sb);
        int option;
 
        if (!options)
@@ -228,9 +228,18 @@ static int parse_options(struct super_block *sb, char *options)
 
 static int adfs_remount(struct super_block *sb, int *flags, char *data)
 {
+       struct adfs_sb_info temp_asb;
+       int ret;
+
        sync_filesystem(sb);
        *flags |= ADFS_SB_FLAGS;
-       return parse_options(sb, data);
+
+       temp_asb = *ADFS_SB(sb);
+       ret = parse_options(sb, &temp_asb, data);
+       if (ret == 0)
+               *ADFS_SB(sb) = temp_asb;
+
+       return ret;
 }
 
 static int adfs_statfs(struct dentry *dentry, struct kstatfs *buf)
@@ -387,7 +396,7 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent)
        asb->s_other_mask = ADFS_DEFAULT_OTHER_MASK;
        asb->s_ftsuffix = 0;
 
-       if (parse_options(sb, data))
+       if (parse_options(sb, asb, data))
                goto error;
 
        sb_set_blocksize(sb, BLOCK_SIZE);