diff options
author | Stanislav Kinsbursky <skinsbursky@parallels.com> | 2012-04-11 07:13:28 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2012-04-12 09:11:46 -0400 |
commit | e5f06f720eff24e32f1cc08ec03bcc8c4b2d2934 (patch) | |
tree | 9afeda20ea7ea07f6c1bbcc9dc5979c98cc62def /fs/nfsd/export.c | |
parent | b3853e0ea1f2ef58f7e7c03e47819e2ae3766dea (diff) |
nfsd: make expkey cache allocated per network namespace context
This patch also changes svcauth_unix_purge() function: added network namespace
as a parameter and thus loop over all networks was replaced by only one call
for ip map cache purge.
Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/export.c')
-rw-r--r-- | fs/nfsd/export.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index 84d020fc0e37..dcb52b884519 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c | |||
@@ -40,7 +40,6 @@ typedef struct svc_export svc_export; | |||
40 | #define EXPKEY_HASHBITS 8 | 40 | #define EXPKEY_HASHBITS 8 |
41 | #define EXPKEY_HASHMAX (1 << EXPKEY_HASHBITS) | 41 | #define EXPKEY_HASHMAX (1 << EXPKEY_HASHBITS) |
42 | #define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1) | 42 | #define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1) |
43 | static struct cache_head *expkey_table[EXPKEY_HASHMAX]; | ||
44 | 43 | ||
45 | static void expkey_put(struct kref *ref) | 44 | static void expkey_put(struct kref *ref) |
46 | { | 45 | { |
@@ -241,10 +240,9 @@ static struct cache_head *expkey_alloc(void) | |||
241 | return NULL; | 240 | return NULL; |
242 | } | 241 | } |
243 | 242 | ||
244 | static struct cache_detail svc_expkey_cache = { | 243 | static struct cache_detail svc_expkey_cache_template = { |
245 | .owner = THIS_MODULE, | 244 | .owner = THIS_MODULE, |
246 | .hash_size = EXPKEY_HASHMAX, | 245 | .hash_size = EXPKEY_HASHMAX, |
247 | .hash_table = expkey_table, | ||
248 | .name = "nfsd.fh", | 246 | .name = "nfsd.fh", |
249 | .cache_put = expkey_put, | 247 | .cache_put = expkey_put, |
250 | .cache_upcall = expkey_upcall, | 248 | .cache_upcall = expkey_upcall, |
@@ -883,12 +881,13 @@ static struct svc_export *exp_find(struct cache_detail *cd, | |||
883 | u32 *fsidv, struct cache_req *reqp) | 881 | u32 *fsidv, struct cache_req *reqp) |
884 | { | 882 | { |
885 | struct svc_export *exp; | 883 | struct svc_export *exp; |
886 | struct svc_expkey *ek = exp_find_key(&svc_expkey_cache, clp, fsid_type, fsidv, reqp); | 884 | struct nfsd_net *nn = net_generic(cd->net, nfsd_net_id); |
885 | struct svc_expkey *ek = exp_find_key(nn->svc_expkey_cache, clp, fsid_type, fsidv, reqp); | ||
887 | if (IS_ERR(ek)) | 886 | if (IS_ERR(ek)) |
888 | return ERR_CAST(ek); | 887 | return ERR_CAST(ek); |
889 | 888 | ||
890 | exp = exp_get_by_name(cd, clp, &ek->ek_path, reqp); | 889 | exp = exp_get_by_name(cd, clp, &ek->ek_path, reqp); |
891 | cache_put(&ek->h, &svc_expkey_cache); | 890 | cache_put(&ek->h, nn->svc_expkey_cache); |
892 | 891 | ||
893 | if (IS_ERR(exp)) | 892 | if (IS_ERR(exp)) |
894 | return ERR_CAST(exp); | 893 | return ERR_CAST(exp); |
@@ -1232,7 +1231,6 @@ const struct seq_operations nfs_exports_op = { | |||
1232 | .show = e_show, | 1231 | .show = e_show, |
1233 | }; | 1232 | }; |
1234 | 1233 | ||
1235 | |||
1236 | /* | 1234 | /* |
1237 | * Initialize the exports module. | 1235 | * Initialize the exports module. |
1238 | */ | 1236 | */ |
@@ -1251,11 +1249,18 @@ nfsd_export_init(struct net *net) | |||
1251 | if (rv) | 1249 | if (rv) |
1252 | goto destroy_export_cache; | 1250 | goto destroy_export_cache; |
1253 | 1251 | ||
1254 | rv = cache_register_net(&svc_expkey_cache, net); | 1252 | nn->svc_expkey_cache = cache_create_net(&svc_expkey_cache_template, net); |
1255 | if (rv) | 1253 | if (IS_ERR(nn->svc_expkey_cache)) { |
1254 | rv = PTR_ERR(nn->svc_expkey_cache); | ||
1256 | goto unregister_export_cache; | 1255 | goto unregister_export_cache; |
1256 | } | ||
1257 | rv = cache_register_net(nn->svc_expkey_cache, net); | ||
1258 | if (rv) | ||
1259 | goto destroy_expkey_cache; | ||
1257 | return 0; | 1260 | return 0; |
1258 | 1261 | ||
1262 | destroy_expkey_cache: | ||
1263 | cache_destroy_net(nn->svc_expkey_cache, net); | ||
1259 | unregister_export_cache: | 1264 | unregister_export_cache: |
1260 | cache_unregister_net(nn->svc_export_cache, net); | 1265 | cache_unregister_net(nn->svc_export_cache, net); |
1261 | destroy_export_cache: | 1266 | destroy_export_cache: |
@@ -1271,7 +1276,7 @@ nfsd_export_flush(struct net *net) | |||
1271 | { | 1276 | { |
1272 | struct nfsd_net *nn = net_generic(net, nfsd_net_id); | 1277 | struct nfsd_net *nn = net_generic(net, nfsd_net_id); |
1273 | 1278 | ||
1274 | cache_purge(&svc_expkey_cache); | 1279 | cache_purge(nn->svc_expkey_cache); |
1275 | cache_purge(nn->svc_export_cache); | 1280 | cache_purge(nn->svc_export_cache); |
1276 | } | 1281 | } |
1277 | 1282 | ||
@@ -1285,10 +1290,11 @@ nfsd_export_shutdown(struct net *net) | |||
1285 | 1290 | ||
1286 | dprintk("nfsd: shutting down export module (net: %p).\n", net); | 1291 | dprintk("nfsd: shutting down export module (net: %p).\n", net); |
1287 | 1292 | ||
1288 | cache_unregister_net(&svc_expkey_cache, net); | 1293 | cache_unregister_net(nn->svc_expkey_cache, net); |
1289 | cache_unregister_net(nn->svc_export_cache, net); | 1294 | cache_unregister_net(nn->svc_export_cache, net); |
1295 | cache_destroy_net(nn->svc_expkey_cache, net); | ||
1290 | cache_destroy_net(nn->svc_export_cache, net); | 1296 | cache_destroy_net(nn->svc_export_cache, net); |
1291 | svcauth_unix_purge(); | 1297 | svcauth_unix_purge(net); |
1292 | 1298 | ||
1293 | dprintk("nfsd: export shutdown complete (net: %p).\n", net); | 1299 | dprintk("nfsd: export shutdown complete (net: %p).\n", net); |
1294 | } | 1300 | } |