fs/adfs: super: safely update options on remount

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>
This commit is contained in:
Russell King 2019-06-04 14:50:09 +01:00 committed by Al Viro
parent 421d3c0faa
commit 4c5762f5f5
1 changed files with 13 additions and 4 deletions

View File

@ -170,10 +170,10 @@ static const match_table_t tokens = {
{Opt_err, NULL} {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; char *p;
struct adfs_sb_info *asb = ADFS_SB(sb);
int option; int option;
if (!options) 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) static int adfs_remount(struct super_block *sb, int *flags, char *data)
{ {
struct adfs_sb_info temp_asb;
int ret;
sync_filesystem(sb); sync_filesystem(sb);
*flags |= ADFS_SB_FLAGS; *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) 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_other_mask = ADFS_DEFAULT_OTHER_MASK;
asb->s_ftsuffix = 0; asb->s_ftsuffix = 0;
if (parse_options(sb, data)) if (parse_options(sb, asb, data))
goto error; goto error;
sb_set_blocksize(sb, BLOCK_SIZE); sb_set_blocksize(sb, BLOCK_SIZE);