From 235aa7ff17e12ca7a76dcfd77abfe143c2ce4dea Mon Sep 17 00:00:00 2001 From: Thomas Graf Date: Fri, 16 Nov 2012 00:27:51 +0100 Subject: cache: hold a reference to the cache ops while a cache is provided over it Signed-off-by: Thomas Graf --- lib/cache_mngt.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/cache_mngt.c b/lib/cache_mngt.c index d5ca6d3..8f011fb 100644 --- a/lib/cache_mngt.c +++ b/lib/cache_mngt.c @@ -335,6 +335,14 @@ void nl_cache_mngt_provide(struct nl_cache *cache) BUG(); else { nl_cache_get(cache); + + /* + * Hold a reference to the cache operations to ensure the + * ops don't go away while we use it to store the cache pointer. + */ + if (!ops->co_major_cache) + nl_cache_ops_get(ops); + ops->co_major_cache = cache; } @@ -360,6 +368,7 @@ void nl_cache_mngt_unprovide(struct nl_cache *cache) BUG(); else if (ops->co_major_cache == cache) { nl_cache_free(ops->co_major_cache); + nl_cache_ops_put(ops); ops->co_major_cache = NULL; } @@ -369,12 +378,15 @@ void nl_cache_mngt_unprovide(struct nl_cache *cache) struct nl_cache *__nl_cache_mngt_require(const char *name) { struct nl_cache_ops *ops; + struct nl_cache *cache = NULL; - ops = nl_cache_ops_lookup(name); - if (ops) - return ops->co_major_cache; + ops = nl_cache_ops_lookup_safe(name); + if (ops) { + cache = ops->co_major_cache; + nl_cache_ops_put(ops); + } - return NULL; + return cache; } /** -- cgit v0.12