#include <linux/mount.h>
+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;
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);
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;
}
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);
}
/*
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);