diff options
Diffstat (limited to 'fs/nfsd/export.c')
-rw-r--r-- | fs/nfsd/export.c | 51 |
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) |
58 | static struct cache_head *expkey_table[EXPKEY_HASHMAX]; | 58 | static struct cache_head *expkey_table[EXPKEY_HASHMAX]; |
59 | 59 | ||
60 | void expkey_put(struct cache_head *item, struct cache_detail *cd) | 60 | void 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 | ||
74 | static void expkey_request(struct cache_detail *cd, | 73 | static 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 | ||
319 | static struct cache_head *export_table[EXPORT_HASHMAX]; | 318 | static struct cache_head *export_table[EXPORT_HASHMAX]; |
320 | 319 | ||
321 | void svc_export_put(struct cache_head *item, struct cache_detail *cd) | 320 | static 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 | ||
332 | static void svc_export_request(struct cache_detail *cd, | 329 | static 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 | ||