Commit 820f9442 authored by Stanislav Kinsbursky's avatar Stanislav Kinsbursky Committed by Trond Myklebust

SUNRPC: split cache creation and PipeFS registration

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: default avatarStanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 30507f58
...@@ -120,6 +120,7 @@ int nfs_cache_register(struct cache_detail *cd) ...@@ -120,6 +120,7 @@ int nfs_cache_register(struct cache_detail *cd)
mnt = rpc_get_mount(); mnt = rpc_get_mount();
if (IS_ERR(mnt)) if (IS_ERR(mnt))
return PTR_ERR(mnt); return PTR_ERR(mnt);
sunrpc_init_cache_detail(cd);
ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &path); ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &path);
if (ret) if (ret)
goto err; goto err;
...@@ -128,6 +129,7 @@ int nfs_cache_register(struct cache_detail *cd) ...@@ -128,6 +129,7 @@ int nfs_cache_register(struct cache_detail *cd)
if (!ret) if (!ret)
return ret; return ret;
err: err:
sunrpc_destroy_cache_detail(cd);
rpc_put_mount(); rpc_put_mount();
return ret; return ret;
} }
...@@ -135,6 +137,7 @@ int nfs_cache_register(struct cache_detail *cd) ...@@ -135,6 +137,7 @@ int nfs_cache_register(struct cache_detail *cd)
void nfs_cache_unregister(struct cache_detail *cd) void nfs_cache_unregister(struct cache_detail *cd)
{ {
sunrpc_cache_unregister_pipefs(cd); sunrpc_cache_unregister_pipefs(cd);
sunrpc_destroy_cache_detail(cd);
rpc_put_mount(); rpc_put_mount();
} }
...@@ -202,6 +202,8 @@ extern int cache_register_net(struct cache_detail *cd, struct net *net); ...@@ -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(struct cache_detail *cd);
extern void cache_unregister_net(struct cache_detail *cd, struct net *net); 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 *, extern int sunrpc_cache_register_pipefs(struct dentry *parent, const char *,
umode_t, struct cache_detail *); umode_t, struct cache_detail *);
extern void sunrpc_cache_unregister_pipefs(struct cache_detail *); extern void sunrpc_cache_unregister_pipefs(struct cache_detail *);
......
...@@ -344,7 +344,7 @@ static int current_index; ...@@ -344,7 +344,7 @@ static int current_index;
static void do_cache_clean(struct work_struct *work); static void do_cache_clean(struct work_struct *work);
static struct delayed_work cache_cleaner; 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); rwlock_init(&cd->hash_lock);
INIT_LIST_HEAD(&cd->queue); INIT_LIST_HEAD(&cd->queue);
...@@ -360,8 +360,9 @@ static void sunrpc_init_cache_detail(struct cache_detail *cd) ...@@ -360,8 +360,9 @@ static void sunrpc_init_cache_detail(struct cache_detail *cd)
/* start the cleaning process */ /* start the cleaning process */
schedule_delayed_work(&cache_cleaner, 0); 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); cache_purge(cd);
spin_lock(&cache_list_lock); spin_lock(&cache_list_lock);
...@@ -384,6 +385,7 @@ static void sunrpc_destroy_cache_detail(struct cache_detail *cd) ...@@ -384,6 +385,7 @@ static void sunrpc_destroy_cache_detail(struct cache_detail *cd)
out: out:
printk(KERN_ERR "nfsd: failed to unregister %s cache\n", cd->name); 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 /* clean cache tries to find something to clean
* and cleans it. * and cleans it.
...@@ -1787,17 +1789,14 @@ int sunrpc_cache_register_pipefs(struct dentry *parent, ...@@ -1787,17 +1789,14 @@ int sunrpc_cache_register_pipefs(struct dentry *parent,
struct dentry *dir; struct dentry *dir;
int ret = 0; int ret = 0;
sunrpc_init_cache_detail(cd);
q.name = name; q.name = name;
q.len = strlen(name); q.len = strlen(name);
q.hash = full_name_hash(q.name, q.len); q.hash = full_name_hash(q.name, q.len);
dir = rpc_create_cache_dir(parent, &q, umode, cd); dir = rpc_create_cache_dir(parent, &q, umode, cd);
if (!IS_ERR(dir)) if (!IS_ERR(dir))
cd->u.pipefs.dir = dir; cd->u.pipefs.dir = dir;
else { else
sunrpc_destroy_cache_detail(cd);
ret = PTR_ERR(dir); ret = PTR_ERR(dir);
}
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs); EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs);
...@@ -1806,7 +1805,6 @@ void sunrpc_cache_unregister_pipefs(struct cache_detail *cd) ...@@ -1806,7 +1805,6 @@ void sunrpc_cache_unregister_pipefs(struct cache_detail *cd)
{ {
rpc_remove_cache_dir(cd->u.pipefs.dir); rpc_remove_cache_dir(cd->u.pipefs.dir);
cd->u.pipefs.dir = NULL; cd->u.pipefs.dir = NULL;
sunrpc_destroy_cache_detail(cd);
} }
EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs); EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment