SUNRPC: split cache creation and PipeFS registration
authorStanislav Kinsbursky <skinsbursky@parallels.com>
Fri, 25 Nov 2011 14:12:40 +0000 (17:12 +0300)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 31 Jan 2012 23:20:26 +0000 (18:20 -0500)
This precursor patch splits SUNRPC cache creation and PipeFS registartion.
It's required for latter split of NFS DNS resolver cache creation per network
namespace context and PipeFS registration/unregistration on MOUNT/UMOUNT
events.

Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/cache_lib.c
include/linux/sunrpc/cache.h
net/sunrpc/cache.c

index c98b439332fcf913bcc4dfb4e34242dfed5c70a0..d62a8951cb128cfe5e7c64831d5711028bcfd214 100644 (file)
@@ -120,6 +120,7 @@ int nfs_cache_register(struct cache_detail *cd)
        mnt = rpc_get_mount();
        if (IS_ERR(mnt))
                return PTR_ERR(mnt);
+       sunrpc_init_cache_detail(cd);
        ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &path);
        if (ret)
                goto err;
@@ -128,6 +129,7 @@ int nfs_cache_register(struct cache_detail *cd)
        if (!ret)
                return ret;
 err:
+       sunrpc_destroy_cache_detail(cd);
        rpc_put_mount();
        return ret;
 }
@@ -135,6 +137,7 @@ err:
 void nfs_cache_unregister(struct cache_detail *cd)
 {
        sunrpc_cache_unregister_pipefs(cd);
+       sunrpc_destroy_cache_detail(cd);
        rpc_put_mount();
 }
 
index 57531f8e5956dd07c83652789bbb9d7a8a40e399..590a8ab0cec3eeaf5b73fd77ea0ef934ece14a1d 100644 (file)
@@ -202,6 +202,8 @@ extern int cache_register_net(struct cache_detail *cd, struct net *net);
 extern void cache_unregister(struct cache_detail *cd);
 extern void cache_unregister_net(struct cache_detail *cd, struct net *net);
 
+extern void sunrpc_init_cache_detail(struct cache_detail *cd);
+extern void sunrpc_destroy_cache_detail(struct cache_detail *cd);
 extern int sunrpc_cache_register_pipefs(struct dentry *parent, const char *,
                                        umode_t, struct cache_detail *);
 extern void sunrpc_cache_unregister_pipefs(struct cache_detail *);
index 465df9ae1046b7fc12fe99fd0759017be7a7dc2a..fefe06729f9d9f9cc82b4b50c4a4682d660eaf3b 100644 (file)
@@ -344,7 +344,7 @@ static int current_index;
 static void do_cache_clean(struct work_struct *work);
 static struct delayed_work cache_cleaner;
 
-static void sunrpc_init_cache_detail(struct cache_detail *cd)
+void sunrpc_init_cache_detail(struct cache_detail *cd)
 {
        rwlock_init(&cd->hash_lock);
        INIT_LIST_HEAD(&cd->queue);
@@ -360,8 +360,9 @@ static void sunrpc_init_cache_detail(struct cache_detail *cd)
        /* start the cleaning process */
        schedule_delayed_work(&cache_cleaner, 0);
 }
+EXPORT_SYMBOL_GPL(sunrpc_init_cache_detail);
 
-static void sunrpc_destroy_cache_detail(struct cache_detail *cd)
+void sunrpc_destroy_cache_detail(struct cache_detail *cd)
 {
        cache_purge(cd);
        spin_lock(&cache_list_lock);
@@ -384,6 +385,7 @@ static void sunrpc_destroy_cache_detail(struct cache_detail *cd)
 out:
        printk(KERN_ERR "nfsd: failed to unregister %s cache\n", cd->name);
 }
+EXPORT_SYMBOL_GPL(sunrpc_destroy_cache_detail);
 
 /* clean cache tries to find something to clean
  * and cleans it.
@@ -1787,17 +1789,14 @@ int sunrpc_cache_register_pipefs(struct dentry *parent,
        struct dentry *dir;
        int ret = 0;
 
-       sunrpc_init_cache_detail(cd);
        q.name = name;
        q.len = strlen(name);
        q.hash = full_name_hash(q.name, q.len);
        dir = rpc_create_cache_dir(parent, &q, umode, cd);
        if (!IS_ERR(dir))
                cd->u.pipefs.dir = dir;
-       else {
-               sunrpc_destroy_cache_detail(cd);
+       else
                ret = PTR_ERR(dir);
-       }
        return ret;
 }
 EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs);
@@ -1806,7 +1805,6 @@ void sunrpc_cache_unregister_pipefs(struct cache_detail *cd)
 {
        rpc_remove_cache_dir(cd->u.pipefs.dir);
        cd->u.pipefs.dir = NULL;
-       sunrpc_destroy_cache_detail(cd);
 }
 EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs);