diff options
author | David Howells <dhowells@redhat.com> | 2014-01-24 07:17:54 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-04-01 23:19:18 -0400 |
commit | 8ffcb32e05239f0e53abfb0a1bc4eee4855b7fd2 (patch) | |
tree | d731abff96c06cdd6469ab24fea814ac03fbedd9 /fs | |
parent | 3ef120a459260b35175a64a418bdb115d80bf58f (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.c | 20 |
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) | |||
568 | static void free_vfsmnt(struct mount *mnt) | 568 | static 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 | ||
577 | static 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 */ |
579 | bool legitimize_mnt(struct vfsmount *bastard, unsigned seq) | 583 | bool 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 | ||
933 | static 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 | |||
943 | static void mntput_no_expire(struct mount *mnt) | 939 | static void mntput_no_expire(struct mount *mnt) |
944 | { | 940 | { |
945 | put_again: | 941 | put_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 | ||
995 | void mntput(struct vfsmount *mnt) | 991 | void mntput(struct vfsmount *mnt) |