Skip to content

Commit

Permalink
NFS: handle NFS caches dentries by network namespace aware routines
Browse files Browse the repository at this point in the history
This patch makes NFS caches PipeFS dentries allocated and destroyed in network
namespace context by PipeFS network namespace aware routines.

Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
  • Loading branch information
Stanislav Kinsbursky authored and Trond Myklebust committed Jan 31, 2012
1 parent 9222b95 commit 5c1cacb
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 13 deletions.
44 changes: 35 additions & 9 deletions fs/nfs/cache_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <linux/slab.h>
#include <linux/sunrpc/cache.h>
#include <linux/sunrpc/rpc_pipe_fs.h>
#include <net/net_namespace.h>

#include "cache_lib.h"

Expand Down Expand Up @@ -111,31 +112,56 @@ int nfs_cache_wait_for_upcall(struct nfs_cache_defer_req *dreq)
return 0;
}

int nfs_cache_register(struct cache_detail *cd)
static int nfs_cache_register_sb(struct super_block *sb, struct cache_detail *cd)
{
int ret;
struct dentry *dir;

dir = rpc_d_lookup_sb(sb, "cache");
BUG_ON(dir == NULL);
ret = sunrpc_cache_register_pipefs(dir, cd->name, 0600, cd);
dput(dir);
return ret;
}

int nfs_cache_register_net(struct net *net, struct cache_detail *cd)
{
struct vfsmount *mnt;
struct path path;
struct super_block *pipefs_sb;
int ret;

mnt = rpc_get_mount();
if (IS_ERR(mnt))
return PTR_ERR(mnt);
ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &path);
if (ret)
pipefs_sb = rpc_get_sb_net(net);
if (!pipefs_sb) {
ret = -ENOENT;
goto err;
ret = sunrpc_cache_register_pipefs(path.dentry, cd->name, 0600, cd);
path_put(&path);
}
ret = nfs_cache_register_sb(pipefs_sb, cd);
rpc_put_sb_net(net);
if (!ret)
return ret;
err:
rpc_put_mount();
return ret;
}

void nfs_cache_unregister(struct cache_detail *cd)
static void nfs_cache_unregister_sb(struct super_block *sb, struct cache_detail *cd)
{
sunrpc_cache_unregister_pipefs(cd);
sunrpc_destroy_cache_detail(cd);
if (cd->u.pipefs.dir)
sunrpc_cache_unregister_pipefs(cd);
}

void nfs_cache_unregister_net(struct net *net, struct cache_detail *cd)
{
struct super_block *pipefs_sb;

pipefs_sb = rpc_get_sb_net(net);
if (pipefs_sb) {
nfs_cache_unregister_sb(pipefs_sb, cd);
rpc_put_sb_net(net);
}
rpc_put_mount();
}

Expand Down
4 changes: 2 additions & 2 deletions fs/nfs/cache_lib.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@ extern int nfs_cache_wait_for_upcall(struct nfs_cache_defer_req *dreq);

extern void nfs_cache_init(struct cache_detail *cd);
extern void nfs_cache_destroy(struct cache_detail *cd);
extern int nfs_cache_register(struct cache_detail *cd);
extern void nfs_cache_unregister(struct cache_detail *cd);
extern int nfs_cache_register_net(struct net *net, struct cache_detail *cd);
extern void nfs_cache_unregister_net(struct net *net, struct cache_detail *cd);
4 changes: 2 additions & 2 deletions fs/nfs/dns_resolve.c
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ int nfs_dns_resolver_init(void)
int err;

nfs_cache_init(&nfs_dns_resolve);
err = nfs_cache_register(&nfs_dns_resolve);
err = nfs_cache_register_net(&init_net, &nfs_dns_resolve);
if (err) {
nfs_cache_destroy(&nfs_dns_resolve);
return err;
Expand All @@ -374,7 +374,7 @@ int nfs_dns_resolver_init(void)

void nfs_dns_resolver_destroy(void)
{
nfs_cache_unregister(&nfs_dns_resolve);
nfs_cache_unregister_net(&init_net, &nfs_dns_resolve);
nfs_cache_destroy(&nfs_dns_resolve);
}

Expand Down

0 comments on commit 5c1cacb

Please sign in to comment.