aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStanislav Kinsbursky <skinsbursky@parallels.com>2012-03-29 11:34:16 -0400
committerJ. Bruce Fields <bfields@redhat.com>2012-04-11 17:55:05 -0400
commitf890edbbeff6928b7db0c6179a9036cbd4f0efbf (patch)
tree82c057972c3b9e5247a1f6be8a3f99850a05cb96
parentc89172e36e3d3972f9f3fa107c1f3e666f1e05cf (diff)
NFSd: remove hard-coded dereferences to name-to-id and id-to-name caches
These dereferences to global static caches are redundant. They also prevents converting these caches into per-net ones. So this patch is cleanup + precursor of patch set,a which will make them per-net. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r--fs/nfsd/nfs4idmap.c50
1 files changed, 24 insertions, 26 deletions
diff --git a/fs/nfsd/nfs4idmap.c b/fs/nfsd/nfs4idmap.c
index 322d11ce06a4..2ff44708ea96 100644
--- a/fs/nfsd/nfs4idmap.c
+++ b/fs/nfsd/nfs4idmap.c
@@ -183,8 +183,9 @@ warn_no_idmapd(struct cache_detail *detail, int has_died)
183 183
184 184
185static int idtoname_parse(struct cache_detail *, char *, int); 185static int idtoname_parse(struct cache_detail *, char *, int);
186static struct ent *idtoname_lookup(struct ent *); 186static struct ent *idtoname_lookup(struct cache_detail *, struct ent *);
187static struct ent *idtoname_update(struct ent *, struct ent *); 187static struct ent *idtoname_update(struct cache_detail *, struct ent *,
188 struct ent *);
188 189
189static struct cache_detail idtoname_cache = { 190static struct cache_detail idtoname_cache = {
190 .owner = THIS_MODULE, 191 .owner = THIS_MODULE,
@@ -244,7 +245,7 @@ idtoname_parse(struct cache_detail *cd, char *buf, int buflen)
244 goto out; 245 goto out;
245 246
246 error = -ENOMEM; 247 error = -ENOMEM;
247 res = idtoname_lookup(&ent); 248 res = idtoname_lookup(cd, &ent);
248 if (!res) 249 if (!res)
249 goto out; 250 goto out;
250 251
@@ -260,11 +261,11 @@ idtoname_parse(struct cache_detail *cd, char *buf, int buflen)
260 else 261 else
261 memcpy(ent.name, buf1, sizeof(ent.name)); 262 memcpy(ent.name, buf1, sizeof(ent.name));
262 error = -ENOMEM; 263 error = -ENOMEM;
263 res = idtoname_update(&ent, res); 264 res = idtoname_update(cd, &ent, res);
264 if (res == NULL) 265 if (res == NULL)
265 goto out; 266 goto out;
266 267
267 cache_put(&res->h, &idtoname_cache); 268 cache_put(&res->h, cd);
268 269
269 error = 0; 270 error = 0;
270out: 271out:
@@ -275,10 +276,9 @@ out:
275 276
276 277
277static struct ent * 278static struct ent *
278idtoname_lookup(struct ent *item) 279idtoname_lookup(struct cache_detail *cd, struct ent *item)
279{ 280{
280 struct cache_head *ch = sunrpc_cache_lookup(&idtoname_cache, 281 struct cache_head *ch = sunrpc_cache_lookup(cd, &item->h,
281 &item->h,
282 idtoname_hash(item)); 282 idtoname_hash(item));
283 if (ch) 283 if (ch)
284 return container_of(ch, struct ent, h); 284 return container_of(ch, struct ent, h);
@@ -287,10 +287,9 @@ idtoname_lookup(struct ent *item)
287} 287}
288 288
289static struct ent * 289static struct ent *
290idtoname_update(struct ent *new, struct ent *old) 290idtoname_update(struct cache_detail *cd, struct ent *new, struct ent *old)
291{ 291{
292 struct cache_head *ch = sunrpc_cache_update(&idtoname_cache, 292 struct cache_head *ch = sunrpc_cache_update(cd, &new->h, &old->h,
293 &new->h, &old->h,
294 idtoname_hash(new)); 293 idtoname_hash(new));
295 if (ch) 294 if (ch)
296 return container_of(ch, struct ent, h); 295 return container_of(ch, struct ent, h);
@@ -359,8 +358,9 @@ nametoid_show(struct seq_file *m, struct cache_detail *cd, struct cache_head *h)
359 return 0; 358 return 0;
360} 359}
361 360
362static struct ent *nametoid_lookup(struct ent *); 361static struct ent *nametoid_lookup(struct cache_detail *, struct ent *);
363static struct ent *nametoid_update(struct ent *, struct ent *); 362static struct ent *nametoid_update(struct cache_detail *, struct ent *,
363 struct ent *);
364static int nametoid_parse(struct cache_detail *, char *, int); 364static int nametoid_parse(struct cache_detail *, char *, int);
365 365
366static struct cache_detail nametoid_cache = { 366static struct cache_detail nametoid_cache = {
@@ -426,14 +426,14 @@ nametoid_parse(struct cache_detail *cd, char *buf, int buflen)
426 set_bit(CACHE_NEGATIVE, &ent.h.flags); 426 set_bit(CACHE_NEGATIVE, &ent.h.flags);
427 427
428 error = -ENOMEM; 428 error = -ENOMEM;
429 res = nametoid_lookup(&ent); 429 res = nametoid_lookup(cd, &ent);
430 if (res == NULL) 430 if (res == NULL)
431 goto out; 431 goto out;
432 res = nametoid_update(&ent, res); 432 res = nametoid_update(cd, &ent, res);
433 if (res == NULL) 433 if (res == NULL)
434 goto out; 434 goto out;
435 435
436 cache_put(&res->h, &nametoid_cache); 436 cache_put(&res->h, cd);
437 error = 0; 437 error = 0;
438out: 438out:
439 kfree(buf1); 439 kfree(buf1);
@@ -443,10 +443,9 @@ out:
443 443
444 444
445static struct ent * 445static struct ent *
446nametoid_lookup(struct ent *item) 446nametoid_lookup(struct cache_detail *cd, struct ent *item)
447{ 447{
448 struct cache_head *ch = sunrpc_cache_lookup(&nametoid_cache, 448 struct cache_head *ch = sunrpc_cache_lookup(cd, &item->h,
449 &item->h,
450 nametoid_hash(item)); 449 nametoid_hash(item));
451 if (ch) 450 if (ch)
452 return container_of(ch, struct ent, h); 451 return container_of(ch, struct ent, h);
@@ -455,10 +454,9 @@ nametoid_lookup(struct ent *item)
455} 454}
456 455
457static struct ent * 456static struct ent *
458nametoid_update(struct ent *new, struct ent *old) 457nametoid_update(struct cache_detail *cd, struct ent *new, struct ent *old)
459{ 458{
460 struct cache_head *ch = sunrpc_cache_update(&nametoid_cache, 459 struct cache_head *ch = sunrpc_cache_update(cd, &new->h, &old->h,
461 &new->h, &old->h,
462 nametoid_hash(new)); 460 nametoid_hash(new));
463 if (ch) 461 if (ch)
464 return container_of(ch, struct ent, h); 462 return container_of(ch, struct ent, h);
@@ -493,12 +491,12 @@ nfsd_idmap_shutdown(void)
493 491
494static int 492static int
495idmap_lookup(struct svc_rqst *rqstp, 493idmap_lookup(struct svc_rqst *rqstp,
496 struct ent *(*lookup_fn)(struct ent *), struct ent *key, 494 struct ent *(*lookup_fn)(struct cache_detail *, struct ent *),
497 struct cache_detail *detail, struct ent **item) 495 struct ent *key, struct cache_detail *detail, struct ent **item)
498{ 496{
499 int ret; 497 int ret;
500 498
501 *item = lookup_fn(key); 499 *item = lookup_fn(detail, key);
502 if (!*item) 500 if (!*item)
503 return -ENOMEM; 501 return -ENOMEM;
504 retry: 502 retry:
@@ -506,7 +504,7 @@ idmap_lookup(struct svc_rqst *rqstp,
506 504
507 if (ret == -ETIMEDOUT) { 505 if (ret == -ETIMEDOUT) {
508 struct ent *prev_item = *item; 506 struct ent *prev_item = *item;
509 *item = lookup_fn(key); 507 *item = lookup_fn(detail, key);
510 if (*item != prev_item) 508 if (*item != prev_item)
511 goto retry; 509 goto retry;
512 cache_put(&(*item)->h, detail); 510 cache_put(&(*item)->h, detail);