diff options
author | J. Bruce Fields <bfields@redhat.com> | 2012-03-21 16:42:14 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2012-03-26 11:48:54 -0400 |
commit | 1df00640c9111c881633d9b219f18e66c52599ec (patch) | |
tree | e36d3924d84f47ec93f6650ff1fd5b8ea7d10d24 /fs/nfs/cache_lib.c | |
parent | ab4684d1560f8d77f6ce82bd3f1f82937070d397 (diff) | |
parent | 5a7c9eec9fde1da0e3adf0a4ddb64ff2a324a492 (diff) |
Merge nfs containerization work from Trond's tree
The nfs containerization work is a prerequisite for Jeff Layton's reboot
recovery rework.
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 c98b439332fc..dded26368111 100644 --- a/fs/nfs/cache_lib.c +++ b/fs/nfs/cache_lib.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
14 | #include <linux/sunrpc/cache.h> | 14 | #include <linux/sunrpc/cache.h> |
15 | #include <linux/sunrpc/rpc_pipe_fs.h> | 15 | #include <linux/sunrpc/rpc_pipe_fs.h> |
16 | #include <net/net_namespace.h> | ||
16 | 17 | ||
17 | #include "cache_lib.h" | 18 | #include "cache_lib.h" |
18 | 19 | ||
@@ -111,30 +112,54 @@ int nfs_cache_wait_for_upcall(struct nfs_cache_defer_req *dreq) | |||
111 | return 0; | 112 | return 0; |
112 | } | 113 | } |
113 | 114 | ||
114 | int nfs_cache_register(struct cache_detail *cd) | 115 | int nfs_cache_register_sb(struct super_block *sb, struct cache_detail *cd) |
115 | { | 116 | { |
116 | struct vfsmount *mnt; | ||
117 | struct path path; | ||
118 | int ret; | 117 | int ret; |
118 | struct dentry *dir; | ||
119 | 119 | ||
120 | mnt = rpc_get_mount(); | 120 | dir = rpc_d_lookup_sb(sb, "cache"); |
121 | if (IS_ERR(mnt)) | 121 | BUG_ON(dir == NULL); |
122 | return PTR_ERR(mnt); | 122 | ret = sunrpc_cache_register_pipefs(dir, cd->name, 0600, cd); |
123 | ret = vfs_path_lookup(mnt->mnt_root, mnt, "/cache", 0, &path); | 123 | dput(dir); |
124 | if (ret) | ||
125 | goto err; | ||
126 | ret = sunrpc_cache_register_pipefs(path.dentry, cd->name, 0600, cd); | ||
127 | path_put(&path); | ||
128 | if (!ret) | ||
129 | return ret; | ||
130 | err: | ||
131 | rpc_put_mount(); | ||
132 | return ret; | 124 | return ret; |
133 | } | 125 | } |
134 | 126 | ||
135 | void nfs_cache_unregister(struct cache_detail *cd) | 127 | int nfs_cache_register_net(struct net *net, struct cache_detail *cd) |
136 | { | 128 | { |
137 | sunrpc_cache_unregister_pipefs(cd); | 129 | struct super_block *pipefs_sb; |
138 | rpc_put_mount(); | 130 | int ret = 0; |
131 | |||
132 | pipefs_sb = rpc_get_sb_net(net); | ||
133 | if (pipefs_sb) { | ||
134 | ret = nfs_cache_register_sb(pipefs_sb, cd); | ||
135 | rpc_put_sb_net(net); | ||
136 | } | ||
137 | return ret; | ||
138 | } | ||
139 | |||
140 | void nfs_cache_unregister_sb(struct super_block *sb, struct cache_detail *cd) | ||
141 | { | ||
142 | if (cd->u.pipefs.dir) | ||
143 | sunrpc_cache_unregister_pipefs(cd); | ||
144 | } | ||
145 | |||
146 | void nfs_cache_unregister_net(struct net *net, struct cache_detail *cd) | ||
147 | { | ||
148 | struct super_block *pipefs_sb; | ||
149 | |||
150 | pipefs_sb = rpc_get_sb_net(net); | ||
151 | if (pipefs_sb) { | ||
152 | nfs_cache_unregister_sb(pipefs_sb, cd); | ||
153 | rpc_put_sb_net(net); | ||
154 | } | ||
155 | } | ||
156 | |||
157 | void nfs_cache_init(struct cache_detail *cd) | ||
158 | { | ||
159 | sunrpc_init_cache_detail(cd); | ||
139 | } | 160 | } |
140 | 161 | ||
162 | void nfs_cache_destroy(struct cache_detail *cd) | ||
163 | { | ||
164 | sunrpc_destroy_cache_detail(cd); | ||
165 | } | ||