diff options
Diffstat (limited to 'fs/cifs/connect.c')
-rw-r--r-- | fs/cifs/connect.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index a279ffc0bc29..886db8b41e35 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -3755,6 +3755,13 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses, | |||
3755 | return rc; | 3755 | return rc; |
3756 | } | 3756 | } |
3757 | 3757 | ||
3758 | static void delayed_free(struct rcu_head *p) | ||
3759 | { | ||
3760 | struct cifs_sb_info *sbi = container_of(p, struct cifs_sb_info, rcu); | ||
3761 | unload_nls(sbi->local_nls); | ||
3762 | kfree(sbi); | ||
3763 | } | ||
3764 | |||
3758 | void | 3765 | void |
3759 | cifs_umount(struct cifs_sb_info *cifs_sb) | 3766 | cifs_umount(struct cifs_sb_info *cifs_sb) |
3760 | { | 3767 | { |
@@ -3779,8 +3786,7 @@ cifs_umount(struct cifs_sb_info *cifs_sb) | |||
3779 | 3786 | ||
3780 | bdi_destroy(&cifs_sb->bdi); | 3787 | bdi_destroy(&cifs_sb->bdi); |
3781 | kfree(cifs_sb->mountdata); | 3788 | kfree(cifs_sb->mountdata); |
3782 | unload_nls(cifs_sb->local_nls); | 3789 | call_rcu(&cifs_sb->rcu, delayed_free); |
3783 | kfree(cifs_sb); | ||
3784 | } | 3790 | } |
3785 | 3791 | ||
3786 | int | 3792 | int |