]>
git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blob - fs/aufs/module.h
2 * Copyright (C) 2005-2016 Junjiro R. Okajima
4 * This program, aufs is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 * module initialization and module-global
22 #ifndef __AUFS_MODULE_H__
23 #define __AUFS_MODULE_H__
27 #include <linux/slab.h>
33 /* module parameters */
34 extern int sysaufs_brs
;
35 extern bool au_userns
;
37 /* ---------------------------------------------------------------------- */
39 extern int au_dir_roflags
;
41 void *au_krealloc(void *p
, unsigned int new_sz
, gfp_t gfp
, int may_shrink
);
42 void *au_kzrealloc(void *p
, unsigned int nused
, unsigned int new_sz
, gfp_t gfp
,
45 static inline int au_kmidx_sub(size_t sz
, size_t new_sz
)
48 return kmalloc_index(sz
) - kmalloc_index(new_sz
);
50 return -1; /* SLOB is untested */
54 int au_seq_path(struct seq_file
*seq
, struct path
*path
);
58 int __init
au_procfs_init(void);
59 void au_procfs_fin(void);
61 AuStubInt0(au_procfs_init
, void);
62 AuStubVoid(au_procfs_fin
, void);
65 /* ---------------------------------------------------------------------- */
67 /* kmem cache and delayed free */
74 AuCache_HNOTIFY
, /* must be last */
85 struct kmem_cache
*cache
;
86 struct llist_head llist
; /* delayed free */
90 * in order to reduce the cost of the internal timer, consolidate all the
91 * delayed free works into a single delayed_work.
94 struct au_cache cache
[AuCache_Last
];
95 struct llist_head llist
[AU_DFREE_Last
];
96 struct delayed_work dwork
;
99 extern struct au_dfree au_dfree
;
101 #define AuCacheFlags (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD)
102 #define AuCache(type) KMEM_CACHE(type, AuCacheFlags)
103 #define AuCacheCtor(type, ctor) \
104 kmem_cache_create(#type, sizeof(struct type), \
105 __alignof__(struct type), AuCacheFlags, ctor)
107 #define AU_DFREE_DELAY msecs_to_jiffies(10)
108 #define AU_DFREE_BODY(lnode, llist) do { \
109 if (llist_add(lnode, llist)) \
110 schedule_delayed_work(&au_dfree.dwork, \
113 #define AU_CACHE_DFREE_FUNC(name, idx, lnode) \
114 void au_cache_dfree_##name(struct au_##name *p) \
116 struct au_cache *cp = au_dfree.cache + AuCache_##idx; \
117 AU_DFREE_BODY(&p->lnode, &cp->llist); \
120 #define AuCacheFuncs(name, index) \
121 static inline struct au_##name *au_cache_alloc_##name(void) \
122 { return kmem_cache_alloc(au_dfree.cache[AuCache_##index].cache, GFP_NOFS); } \
123 static inline void au_cache_free_##name(struct au_##name *p) \
124 { kmem_cache_free(au_dfree.cache[AuCache_##index].cache, p); } \
125 void au_cache_dfree_##name(struct au_##name *p)
127 AuCacheFuncs(dinfo
, DINFO
);
128 AuCacheFuncs(icntnr
, ICNTNR
);
129 AuCacheFuncs(finfo
, FINFO
);
130 AuCacheFuncs(vdir
, VDIR
);
131 AuCacheFuncs(vdir_dehstr
, DEHSTR
);
132 #ifdef CONFIG_AUFS_HNOTIFY
133 AuCacheFuncs(hnotify
, HNOTIFY
);
136 static inline void au_delayed_kfree(const void *p
)
139 AuDebugOn(ksize(p
) < sizeof(struct llist_node
));
141 AU_DFREE_BODY((void *)p
, au_dfree
.llist
+ AU_DFREE_KFREE
);
145 static inline void au_free_page(void *p
)
147 free_page((unsigned long)p
);
150 static inline void au_delayed_free_page(unsigned long addr
)
152 AU_DFREE_BODY((void *)addr
, au_dfree
.llist
+ AU_DFREE_FREE_PAGE
);
155 #endif /* __KERNEL__ */
156 #endif /* __AUFS_MODULE_H__ */