From d1b47cff054c69366adaa688e8e72258d9814d93 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Wed, 23 Nov 2011 12:14:10 -0500 Subject: [PATCH] --- yaml --- r: 280163 b: refs/heads/master c: 7d6fec45a5131918b51dcd76da52f2ec86a85be6 h: refs/heads/master i: 280161: e8fb6e4d9b76a7b44e7655739bf51f2b37d5a608 280159: 6cfc00c3ad408b746b15245d22f102c895fdf90f v: v3 --- [refs] | 2 +- trunk/fs/mount.h | 9 +++++++++ trunk/fs/namespace.c | 18 ++++++++++-------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 4a8e44abc97b..2f11bdbdeabb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: dabe0dc194d5d56d379a8994fff47392744b6491 +refs/heads/master: 7d6fec45a5131918b51dcd76da52f2ec86a85be6 diff --git a/trunk/fs/mount.h b/trunk/fs/mount.h index 7890e49f74ef..47da8163e1f4 100644 --- a/trunk/fs/mount.h +++ b/trunk/fs/mount.h @@ -1,5 +1,14 @@ #include +struct mount { + struct vfsmount mnt; +}; + +static inline struct mount *real_mount(struct vfsmount *mnt) +{ + return container_of(mnt, struct mount, mnt); +} + static inline int mnt_has_parent(struct vfsmount *mnt) { return mnt != mnt->mnt_parent; diff --git a/trunk/fs/namespace.c b/trunk/fs/namespace.c index 86b4f6406470..dda47fee6fdf 100644 --- a/trunk/fs/namespace.c +++ b/trunk/fs/namespace.c @@ -173,8 +173,9 @@ unsigned int mnt_get_count(struct vfsmount *mnt) static struct vfsmount *alloc_vfsmnt(const char *name) { - struct vfsmount *mnt = kmem_cache_zalloc(mnt_cache, GFP_KERNEL); - if (mnt) { + struct mount *p = kmem_cache_zalloc(mnt_cache, GFP_KERNEL); + if (p) { + struct vfsmount *mnt = &p->mnt; int err; err = mnt_alloc_id(mnt); @@ -210,16 +211,16 @@ static struct vfsmount *alloc_vfsmnt(const char *name) INIT_HLIST_HEAD(&mnt->mnt_fsnotify_marks); #endif } - return mnt; + return &p->mnt; #ifdef CONFIG_SMP out_free_devname: - kfree(mnt->mnt_devname); + kfree(p->mnt.mnt_devname); #endif out_free_id: - mnt_free_id(mnt); + mnt_free_id(&p->mnt); out_free_cache: - kmem_cache_free(mnt_cache, mnt); + kmem_cache_free(mnt_cache, p); return NULL; } @@ -449,12 +450,13 @@ static void __mnt_unmake_readonly(struct vfsmount *mnt) static void free_vfsmnt(struct vfsmount *mnt) { + struct mount *p = real_mount(mnt); kfree(mnt->mnt_devname); mnt_free_id(mnt); #ifdef CONFIG_SMP free_percpu(mnt->mnt_pcp); #endif - kmem_cache_free(mnt_cache, mnt); + kmem_cache_free(mnt_cache, p); } /* @@ -2698,7 +2700,7 @@ void __init mnt_init(void) init_rwsem(&namespace_sem); - mnt_cache = kmem_cache_create("mnt_cache", sizeof(struct vfsmount), + mnt_cache = kmem_cache_create("mnt_cache", sizeof(struct mount), 0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL); mount_hashtable = (struct list_head *)__get_free_page(GFP_ATOMIC);