aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd')
-rw-r--r--fs/nfsd/export.c51
-rw-r--r--fs/nfsd/nfs4idmap.c18
-rw-r--r--fs/nfsd/nfsfh.c2
3 files changed, 33 insertions, 38 deletions
diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
index abd68965822f..cc811a1094cb 100644
--- a/fs/nfsd/export.c
+++ b/fs/nfsd/export.c
@@ -57,18 +57,17 @@ static int exp_verify_string(char *cp, int max);
57#define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1) 57#define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1)
58static struct cache_head *expkey_table[EXPKEY_HASHMAX]; 58static struct cache_head *expkey_table[EXPKEY_HASHMAX];
59 59
60void expkey_put(struct cache_head *item, struct cache_detail *cd) 60void expkey_put(struct kref *ref)
61{ 61{
62 if (cache_put(item, cd)) { 62 struct svc_expkey *key = container_of(ref, struct svc_expkey, h.ref);
63 struct svc_expkey *key = container_of(item, struct svc_expkey, h); 63
64 if (test_bit(CACHE_VALID, &item->flags) && 64 if (test_bit(CACHE_VALID, &key->h.flags) &&
65 !test_bit(CACHE_NEGATIVE, &item->flags)) { 65 !test_bit(CACHE_NEGATIVE, &key->h.flags)) {
66 dput(key->ek_dentry); 66 dput(key->ek_dentry);
67 mntput(key->ek_mnt); 67 mntput(key->ek_mnt);
68 }
69 auth_domain_put(key->ek_client);
70 kfree(key);
71 } 68 }
69 auth_domain_put(key->ek_client);
70 kfree(key);
72} 71}
73 72
74static void expkey_request(struct cache_detail *cd, 73static void expkey_request(struct cache_detail *cd,
@@ -158,7 +157,7 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
158 set_bit(CACHE_NEGATIVE, &key.h.flags); 157 set_bit(CACHE_NEGATIVE, &key.h.flags);
159 ek = svc_expkey_update(&key, ek); 158 ek = svc_expkey_update(&key, ek);
160 if (ek) 159 if (ek)
161 expkey_put(&ek->h, &svc_expkey_cache); 160 cache_put(&ek->h, &svc_expkey_cache);
162 else err = -ENOMEM; 161 else err = -ENOMEM;
163 } else { 162 } else {
164 struct nameidata nd; 163 struct nameidata nd;
@@ -172,7 +171,7 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
172 171
173 ek = svc_expkey_update(&key, ek); 172 ek = svc_expkey_update(&key, ek);
174 if (ek) 173 if (ek)
175 expkey_put(&ek->h, &svc_expkey_cache); 174 cache_put(&ek->h, &svc_expkey_cache);
176 else 175 else
177 err = -ENOMEM; 176 err = -ENOMEM;
178 path_release(&nd); 177 path_release(&nd);
@@ -318,15 +317,13 @@ svc_expkey_update(struct svc_expkey *new, struct svc_expkey *old)
318 317
319static struct cache_head *export_table[EXPORT_HASHMAX]; 318static struct cache_head *export_table[EXPORT_HASHMAX];
320 319
321void svc_export_put(struct cache_head *item, struct cache_detail *cd) 320static void svc_export_put(struct kref *ref)
322{ 321{
323 if (cache_put(item, cd)) { 322 struct svc_export *exp = container_of(ref, struct svc_export, h.ref);
324 struct svc_export *exp = container_of(item, struct svc_export, h); 323 dput(exp->ex_dentry);
325 dput(exp->ex_dentry); 324 mntput(exp->ex_mnt);
326 mntput(exp->ex_mnt); 325 auth_domain_put(exp->ex_client);
327 auth_domain_put(exp->ex_client); 326 kfree(exp);
328 kfree(exp);
329 }
330} 327}
331 328
332static void svc_export_request(struct cache_detail *cd, 329static void svc_export_request(struct cache_detail *cd,
@@ -633,7 +630,7 @@ static int exp_set_key(svc_client *clp, int fsid_type, u32 *fsidv,
633 if (ek) 630 if (ek)
634 ek = svc_expkey_update(&key,ek); 631 ek = svc_expkey_update(&key,ek);
635 if (ek) { 632 if (ek) {
636 expkey_put(&ek->h, &svc_expkey_cache); 633 cache_put(&ek->h, &svc_expkey_cache);
637 return 0; 634 return 0;
638 } 635 }
639 return -ENOMEM; 636 return -ENOMEM;
@@ -762,7 +759,7 @@ static void exp_fsid_unhash(struct svc_export *exp)
762 ek = exp_get_fsid_key(exp->ex_client, exp->ex_fsid); 759 ek = exp_get_fsid_key(exp->ex_client, exp->ex_fsid);
763 if (ek && !IS_ERR(ek)) { 760 if (ek && !IS_ERR(ek)) {
764 ek->h.expiry_time = get_seconds()-1; 761 ek->h.expiry_time = get_seconds()-1;
765 expkey_put(&ek->h, &svc_expkey_cache); 762 cache_put(&ek->h, &svc_expkey_cache);
766 } 763 }
767 svc_expkey_cache.nextcheck = get_seconds(); 764 svc_expkey_cache.nextcheck = get_seconds();
768} 765}
@@ -800,7 +797,7 @@ static void exp_unhash(struct svc_export *exp)
800 ek = exp_get_key(exp->ex_client, inode->i_sb->s_dev, inode->i_ino); 797 ek = exp_get_key(exp->ex_client, inode->i_sb->s_dev, inode->i_ino);
801 if (ek && !IS_ERR(ek)) { 798 if (ek && !IS_ERR(ek)) {
802 ek->h.expiry_time = get_seconds()-1; 799 ek->h.expiry_time = get_seconds()-1;
803 expkey_put(&ek->h, &svc_expkey_cache); 800 cache_put(&ek->h, &svc_expkey_cache);
804 } 801 }
805 svc_expkey_cache.nextcheck = get_seconds(); 802 svc_expkey_cache.nextcheck = get_seconds();
806} 803}
@@ -902,7 +899,7 @@ finish:
902 if (exp) 899 if (exp)
903 exp_put(exp); 900 exp_put(exp);
904 if (fsid_key && !IS_ERR(fsid_key)) 901 if (fsid_key && !IS_ERR(fsid_key))
905 expkey_put(&fsid_key->h, &svc_expkey_cache); 902 cache_put(&fsid_key->h, &svc_expkey_cache);
906 if (clp) 903 if (clp)
907 auth_domain_put(clp); 904 auth_domain_put(clp);
908 path_release(&nd); 905 path_release(&nd);
@@ -1030,7 +1027,7 @@ exp_find(struct auth_domain *clp, int fsid_type, u32 *fsidv,
1030 return ERR_PTR(PTR_ERR(ek)); 1027 return ERR_PTR(PTR_ERR(ek));
1031 1028
1032 exp = exp_get_by_name(clp, ek->ek_mnt, ek->ek_dentry, reqp); 1029 exp = exp_get_by_name(clp, ek->ek_mnt, ek->ek_dentry, reqp);
1033 expkey_put(&ek->h, &svc_expkey_cache); 1030 cache_put(&ek->h, &svc_expkey_cache);
1034 1031
1035 if (!exp || IS_ERR(exp)) 1032 if (!exp || IS_ERR(exp))
1036 return ERR_PTR(PTR_ERR(exp)); 1033 return ERR_PTR(PTR_ERR(exp));
@@ -1068,7 +1065,7 @@ exp_pseudoroot(struct auth_domain *clp, struct svc_fh *fhp,
1068 else 1065 else
1069 rv = fh_compose(fhp, exp, 1066 rv = fh_compose(fhp, exp,
1070 fsid_key->ek_dentry, NULL); 1067 fsid_key->ek_dentry, NULL);
1071 expkey_put(&fsid_key->h, &svc_expkey_cache); 1068 cache_put(&fsid_key->h, &svc_expkey_cache);
1072 return rv; 1069 return rv;
1073} 1070}
1074 1071
@@ -1187,7 +1184,7 @@ static int e_show(struct seq_file *m, void *p)
1187 cache_get(&exp->h); 1184 cache_get(&exp->h);
1188 if (cache_check(&svc_export_cache, &exp->h, NULL)) 1185 if (cache_check(&svc_export_cache, &exp->h, NULL))
1189 return 0; 1186 return 0;
1190 if (cache_put(&exp->h, &svc_export_cache)) BUG(); 1187 cache_put(&exp->h, &svc_export_cache);
1191 return svc_export_show(m, &svc_export_cache, cp); 1188 return svc_export_show(m, &svc_export_cache, cp);
1192} 1189}
1193 1190
diff --git a/fs/nfsd/nfs4idmap.c b/fs/nfsd/nfs4idmap.c
index 75cfbb68b205..4b6aa60dfceb 100644
--- a/fs/nfsd/nfs4idmap.c
+++ b/fs/nfsd/nfs4idmap.c
@@ -96,12 +96,10 @@ ent_init(struct cache_head *cnew, struct cache_head *citm)
96} 96}
97 97
98static void 98static void
99ent_put(struct cache_head *ch, struct cache_detail *cd) 99ent_put(struct kref *ref)
100{ 100{
101 if (cache_put(ch, cd)) { 101 struct ent *map = container_of(ref, struct ent, h.ref);
102 struct ent *map = container_of(ch, struct ent, h); 102 kfree(map);
103 kfree(map);
104 }
105} 103}
106 104
107static struct cache_head * 105static struct cache_head *
@@ -270,7 +268,7 @@ idtoname_parse(struct cache_detail *cd, char *buf, int buflen)
270 if (res == NULL) 268 if (res == NULL)
271 goto out; 269 goto out;
272 270
273 ent_put(&res->h, &idtoname_cache); 271 cache_put(&res->h, &idtoname_cache);
274 272
275 error = 0; 273 error = 0;
276out: 274out:
@@ -433,7 +431,7 @@ nametoid_parse(struct cache_detail *cd, char *buf, int buflen)
433 if (res == NULL) 431 if (res == NULL)
434 goto out; 432 goto out;
435 433
436 ent_put(&res->h, &nametoid_cache); 434 cache_put(&res->h, &nametoid_cache);
437 error = 0; 435 error = 0;
438out: 436out:
439 kfree(buf1); 437 kfree(buf1);
@@ -562,7 +560,7 @@ do_idmap_lookup_nowait(struct ent *(*lookup_fn)(struct ent *),
562 goto out_put; 560 goto out_put;
563 return 0; 561 return 0;
564out_put: 562out_put:
565 ent_put(&(*item)->h, detail); 563 cache_put(&(*item)->h, detail);
566out_err: 564out_err:
567 *item = NULL; 565 *item = NULL;
568 return ret; 566 return ret;
@@ -613,7 +611,7 @@ idmap_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen
613 if (ret) 611 if (ret)
614 return ret; 612 return ret;
615 *id = item->id; 613 *id = item->id;
616 ent_put(&item->h, &nametoid_cache); 614 cache_put(&item->h, &nametoid_cache);
617 return 0; 615 return 0;
618} 616}
619 617
@@ -635,7 +633,7 @@ idmap_id_to_name(struct svc_rqst *rqstp, int type, uid_t id, char *name)
635 ret = strlen(item->name); 633 ret = strlen(item->name);
636 BUG_ON(ret > IDMAP_NAMESZ); 634 BUG_ON(ret > IDMAP_NAMESZ);
637 memcpy(name, item->name, ret); 635 memcpy(name, item->name, ret);
638 ent_put(&item->h, &idtoname_cache); 636 cache_put(&item->h, &idtoname_cache);
639 return ret; 637 return ret;
640} 638}
641 639
diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c
index 7a3e397b4ed3..3f2ec2e6d06c 100644
--- a/fs/nfsd/nfsfh.c
+++ b/fs/nfsd/nfsfh.c
@@ -506,7 +506,7 @@ fh_put(struct svc_fh *fhp)
506 nfsd_nr_put++; 506 nfsd_nr_put++;
507 } 507 }
508 if (exp) { 508 if (exp) {
509 svc_export_put(&exp->h, &svc_export_cache); 509 cache_put(&exp->h, &svc_export_cache);
510 fhp->fh_export = NULL; 510 fhp->fh_export = NULL;
511 } 511 }
512 return; 512 return;