aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2014-01-24 07:17:54 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2014-04-01 23:19:18 -0400
commit8ffcb32e05239f0e53abfb0a1bc4eee4855b7fd2 (patch)
treed731abff96c06cdd6469ab24fea814ac03fbedd9 /fs
parent3ef120a459260b35175a64a418bdb115d80bf58f (diff)
VFS: Make delayed_free() call free_vfsmnt()
Make delayed_free() call free_vfsmnt() so that we don't have two functions doing the same job. This requires the calls to mnt_free_id() in free_vfsmnt() to be moved into the callers of that function. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r--fs/namespace.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/fs/namespace.c b/fs/namespace.c
index 20e8696c31a7..182bc41cd887 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -568,13 +568,17 @@ int sb_prepare_remount_readonly(struct super_block *sb)
568static void free_vfsmnt(struct mount *mnt) 568static void free_vfsmnt(struct mount *mnt)
569{ 569{
570 kfree(mnt->mnt_devname); 570 kfree(mnt->mnt_devname);
571 mnt_free_id(mnt);
572#ifdef CONFIG_SMP 571#ifdef CONFIG_SMP
573 free_percpu(mnt->mnt_pcp); 572 free_percpu(mnt->mnt_pcp);
574#endif 573#endif
575 kmem_cache_free(mnt_cache, mnt); 574 kmem_cache_free(mnt_cache, mnt);
576} 575}
577 576
577static void delayed_free_vfsmnt(struct rcu_head *head)
578{
579 free_vfsmnt(container_of(head, struct mount, mnt_rcu));
580}
581
578/* call under rcu_read_lock */ 582/* call under rcu_read_lock */
579bool legitimize_mnt(struct vfsmount *bastard, unsigned seq) 583bool legitimize_mnt(struct vfsmount *bastard, unsigned seq)
580{ 584{
@@ -846,6 +850,7 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void
846 850
847 root = mount_fs(type, flags, name, data); 851 root = mount_fs(type, flags, name, data);
848 if (IS_ERR(root)) { 852 if (IS_ERR(root)) {
853 mnt_free_id(mnt);
849 free_vfsmnt(mnt); 854 free_vfsmnt(mnt);
850 return ERR_CAST(root); 855 return ERR_CAST(root);
851 } 856 }
@@ -926,20 +931,11 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root,
926 return mnt; 931 return mnt;
927 932
928 out_free: 933 out_free:
934 mnt_free_id(mnt);
929 free_vfsmnt(mnt); 935 free_vfsmnt(mnt);
930 return ERR_PTR(err); 936 return ERR_PTR(err);
931} 937}
932 938
933static void delayed_free(struct rcu_head *head)
934{
935 struct mount *mnt = container_of(head, struct mount, mnt_rcu);
936 kfree(mnt->mnt_devname);
937#ifdef CONFIG_SMP
938 free_percpu(mnt->mnt_pcp);
939#endif
940 kmem_cache_free(mnt_cache, mnt);
941}
942
943static void mntput_no_expire(struct mount *mnt) 939static void mntput_no_expire(struct mount *mnt)
944{ 940{
945put_again: 941put_again:
@@ -989,7 +985,7 @@ put_again:
989 dput(mnt->mnt.mnt_root); 985 dput(mnt->mnt.mnt_root);
990 deactivate_super(mnt->mnt.mnt_sb); 986 deactivate_super(mnt->mnt.mnt_sb);
991 mnt_free_id(mnt); 987 mnt_free_id(mnt);
992 call_rcu(&mnt->mnt_rcu, delayed_free); 988 call_rcu(&mnt->mnt_rcu, delayed_free_vfsmnt);
993} 989}
994 990
995void mntput(struct vfsmount *mnt) 991void mntput(struct vfsmount *mnt)