summaryrefslogtreecommitdiff
path: root/fs/aufs/hnotify.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/aufs/hnotify.c')
-rw-r--r--fs/aufs/hnotify.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/fs/aufs/hnotify.c b/fs/aufs/hnotify.c
index 3016c5e73..a05aed870 100644
--- a/fs/aufs/hnotify.c
+++ b/fs/aufs/hnotify.c
@@ -22,7 +22,7 @@ int au_hn_alloc(struct au_hinode *hinode, struct inode *inode)
AuTraceErr(err);
if (unlikely(err)) {
hinode->hi_notify = NULL;
- au_cache_free_hnotify(hn);
+ au_cache_dfree_hnotify(hn);
/*
* The upper dir was removed by udba, but the same named
* dir left. In this case, aufs assignes a new inode
@@ -46,7 +46,7 @@ void au_hn_free(struct au_hinode *hinode)
if (hn) {
hinode->hi_notify = NULL;
if (au_hnotify_op.free(hinode, hn))
- au_cache_free_hnotify(hn);
+ au_cache_dfree_hnotify(hn);
}
}
@@ -480,7 +480,7 @@ static void au_hn_bh(void *_args)
|| au_ftest_hnjob(a->flags[AuHn_CHILD], GEN))) {
inode = lookup_wlock_by_ino(sb, bfound, h_ino);
try_iput = 1;
- }
+ }
args.flags = a->flags[AuHn_CHILD];
args.dentry = dentry;
@@ -519,7 +519,7 @@ out:
iput(a->dir);
si_write_unlock(sb);
au_nwt_done(&sbinfo->si_nowait);
- kfree(a);
+ au_delayed_kfree(a);
}
/* ---------------------------------------------------------------------- */
@@ -625,7 +625,7 @@ int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask,
iput(args->h_child_inode);
iput(args->h_dir);
iput(args->dir);
- kfree(args);
+ au_delayed_kfree(args);
}
out:
@@ -666,17 +666,26 @@ void au_hnotify_fin_br(struct au_branch *br)
static void au_hn_destroy_cache(void)
{
- kmem_cache_destroy(au_cachep[AuCache_HNOTIFY]);
- au_cachep[AuCache_HNOTIFY] = NULL;
+ struct au_cache *cp;
+
+ flush_delayed_work(&au_dfree.dwork);
+ cp = au_dfree.cache + AuCache_HNOTIFY;
+ AuDebugOn(!llist_empty(&cp->llist));
+ kmem_cache_destroy(cp->cache);
+ cp->cache = NULL;
}
+AU_CACHE_DFREE_FUNC(hnotify, HNOTIFY, hn_lnode);
+
int __init au_hnotify_init(void)
{
int err;
+ struct au_cache *cp;
err = -ENOMEM;
- au_cachep[AuCache_HNOTIFY] = AuCache(au_hnotify);
- if (au_cachep[AuCache_HNOTIFY]) {
+ cp = au_dfree.cache + AuCache_HNOTIFY;
+ cp->cache = AuCache(au_hnotify);
+ if (cp->cache) {
err = 0;
if (au_hnotify_op.init)
err = au_hnotify_op.init();
@@ -689,9 +698,13 @@ int __init au_hnotify_init(void)
void au_hnotify_fin(void)
{
+ struct au_cache *cp;
+
if (au_hnotify_op.fin)
au_hnotify_op.fin();
+
/* cf. au_cache_fin() */
- if (au_cachep[AuCache_HNOTIFY])
+ cp = au_dfree.cache + AuCache_HNOTIFY;
+ if (cp->cache)
au_hn_destroy_cache();
}