aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/export.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd/export.c')
-rw-r--r--fs/nfsd/export.c51
1 files changed, 24 insertions, 27 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