|
@@ -707,13 +707,21 @@ static void fat_set_state(struct super_block *sb,
|
|
|
brelse(bh);
|
|
|
}
|
|
|
|
|
|
+static void fat_reset_iocharset(struct fat_mount_options *opts)
|
|
|
+{
|
|
|
+ if (opts->iocharset != fat_default_iocharset) {
|
|
|
+ /* Note: opts->iocharset can be NULL here */
|
|
|
+ kfree(opts->iocharset);
|
|
|
+ opts->iocharset = fat_default_iocharset;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void delayed_free(struct rcu_head *p)
|
|
|
{
|
|
|
struct msdos_sb_info *sbi = container_of(p, struct msdos_sb_info, rcu);
|
|
|
unload_nls(sbi->nls_disk);
|
|
|
unload_nls(sbi->nls_io);
|
|
|
- if (sbi->options.iocharset != fat_default_iocharset)
|
|
|
- kfree(sbi->options.iocharset);
|
|
|
+ fat_reset_iocharset(&sbi->options);
|
|
|
kfree(sbi);
|
|
|
}
|
|
|
|
|
@@ -1132,7 +1140,7 @@ static int parse_options(struct super_block *sb, char *options, int is_vfat,
|
|
|
opts->fs_fmask = opts->fs_dmask = current_umask();
|
|
|
opts->allow_utime = -1;
|
|
|
opts->codepage = fat_default_codepage;
|
|
|
- opts->iocharset = fat_default_iocharset;
|
|
|
+ fat_reset_iocharset(opts);
|
|
|
if (is_vfat) {
|
|
|
opts->shortname = VFAT_SFN_DISPLAY_WINNT|VFAT_SFN_CREATE_WIN95;
|
|
|
opts->rodir = 0;
|
|
@@ -1289,8 +1297,7 @@ static int parse_options(struct super_block *sb, char *options, int is_vfat,
|
|
|
|
|
|
/* vfat specific */
|
|
|
case Opt_charset:
|
|
|
- if (opts->iocharset != fat_default_iocharset)
|
|
|
- kfree(opts->iocharset);
|
|
|
+ fat_reset_iocharset(opts);
|
|
|
iocharset = match_strdup(&args[0]);
|
|
|
if (!iocharset)
|
|
|
return -ENOMEM;
|
|
@@ -1881,8 +1888,7 @@ out_fail:
|
|
|
iput(fat_inode);
|
|
|
unload_nls(sbi->nls_io);
|
|
|
unload_nls(sbi->nls_disk);
|
|
|
- if (sbi->options.iocharset != fat_default_iocharset)
|
|
|
- kfree(sbi->options.iocharset);
|
|
|
+ fat_reset_iocharset(&sbi->options);
|
|
|
sb->s_fs_info = NULL;
|
|
|
kfree(sbi);
|
|
|
return error;
|