diff options
Diffstat (limited to 'fs/nfs/cache_lib.c')
| -rw-r--r-- | fs/nfs/cache_lib.c | 61 | 
1 files changed, 43 insertions, 18 deletions
diff --git a/fs/nfs/cache_lib.c b/fs/nfs/cache_lib.c index c98b439332f..dded2636811 100644 --- a/fs/nfs/cache_lib.c +++ b/fs/nfs/cache_lib.c @@ -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" @@ -111,30 +112,54 @@ int nfs_cache_wait_for_upcall(struct nfs_cache_defer_req *dreq)  	return 0;  } -int nfs_cache_register(struct cache_detail *cd) +int nfs_cache_register_sb(struct super_block *sb, struct cache_detail *cd)  { -	struct vfsmount *mnt; -	struct path path;  	int ret; +	struct dentry *dir; -	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) -		goto err; -	ret = sunrpc_cache_register_pipefs(path.dentry, cd->name, 0600, cd); -	path_put(&path); -	if (!ret) -		return ret; -err: -	rpc_put_mount(); +	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;  } -void nfs_cache_unregister(struct cache_detail *cd) +int nfs_cache_register_net(struct net *net, struct cache_detail *cd)  { -	sunrpc_cache_unregister_pipefs(cd); -	rpc_put_mount(); +	struct super_block *pipefs_sb; +	int ret = 0; + +	pipefs_sb = rpc_get_sb_net(net); +	if (pipefs_sb) { +		ret = nfs_cache_register_sb(pipefs_sb, cd); +		rpc_put_sb_net(net); +	} +	return ret; +} + +void nfs_cache_unregister_sb(struct super_block *sb, struct 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); +	} +} + +void nfs_cache_init(struct cache_detail *cd) +{ +	sunrpc_init_cache_detail(cd);  } +void nfs_cache_destroy(struct cache_detail *cd) +{ +	sunrpc_destroy_cache_detail(cd); +}  |