|
|
|
@ -548,6 +548,16 @@ static void fat_set_state(struct super_block *sb, |
|
|
|
|
brelse(bh); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
kfree(sbi); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void fat_put_super(struct super_block *sb) |
|
|
|
|
{ |
|
|
|
|
struct msdos_sb_info *sbi = MSDOS_SB(sb); |
|
|
|
@ -557,14 +567,7 @@ static void fat_put_super(struct super_block *sb) |
|
|
|
|
iput(sbi->fsinfo_inode); |
|
|
|
|
iput(sbi->fat_inode); |
|
|
|
|
|
|
|
|
|
unload_nls(sbi->nls_disk); |
|
|
|
|
unload_nls(sbi->nls_io); |
|
|
|
|
|
|
|
|
|
if (sbi->options.iocharset != fat_default_iocharset) |
|
|
|
|
kfree(sbi->options.iocharset); |
|
|
|
|
|
|
|
|
|
sb->s_fs_info = NULL; |
|
|
|
|
kfree(sbi); |
|
|
|
|
call_rcu(&sbi->rcu, delayed_free); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static struct kmem_cache *fat_inode_cachep; |
|
|
|
|