[PATCH 5/6 v9] sunrpc: New helper cache_delete_entry for deleting cache_head directly
From: Kinglong Mee <hidden>
Date: 2015-08-18 07:22:44
Also in:
linux-fsdevel
Subsystem:
kernel nfsd, sunrpc, and lockd servers, networking [general], nfs, sunrpc, and lockd clients, the rest · Maintainers:
Chuck Lever, Jeff Layton, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Trond Myklebust, Anna Schumaker, Linus Torvalds
A new helper cache_delete_entry() for delete cache_head from
cache_detail directly.
It will be used by pin_kill, so make sure the cache_detail is valid
before deleting is needed.
Because pin_kill is not many times, so the influence of performance
is accepted.
v9, delete duplicate checking of cache_detail
Signed-off-by: Kinglong Mee <redacted>
---
include/linux/sunrpc/cache.h | 1 +
net/sunrpc/cache.c | 20 ++++++++++++++++++++
2 files changed, 21 insertions(+)
diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h
index 03d3b4c..2824db5 100644
--- a/include/linux/sunrpc/cache.h
+++ b/include/linux/sunrpc/cache.h
@@ -210,6 +210,7 @@ extern int cache_check(struct cache_detail *detail,
struct cache_head *h, struct cache_req *rqstp);
extern void cache_flush(void);
extern void cache_purge(struct cache_detail *detail);
+extern void cache_delete_entry(struct cache_detail *cd, struct cache_head *h);
#define NEVER (0x7FFFFFFF)
extern void __init cache_initialize(void);
extern int cache_register_net(struct cache_detail *cd, struct net *net);
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c
index 4a2340a..430b5fa 100644
--- a/net/sunrpc/cache.c
+++ b/net/sunrpc/cache.c
@@ -454,6 +454,26 @@ static int cache_clean(void)
return rv;
}
+void cache_delete_entry(struct cache_detail *detail, struct cache_head *h)
+{
+ if (!detail || !h)
+ return;
+
+ write_lock(&detail->hash_lock);
+ if (hlist_unhashed(&h->cache_list)) {
+ write_unlock(&detail->hash_lock);
+ return ;
+ }
+
+ hlist_del_init(&h->cache_list);
+ detail->entries--;
+ set_bit(CACHE_CLEANED, &h->flags);
+ write_unlock(&detail->hash_lock);
+
+ cache_put(h, detail);
+}
+EXPORT_SYMBOL_GPL(cache_delete_entry);
+
/*
* We want to regularly clean the cache, so we need to schedule some work ...
*/--
2.4.3