diff options
| author | NeilBrown <neilb@suse.de> | 2006-03-27 04:15:00 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-27 11:44:41 -0500 |
| commit | eab7e2e647c348b418e8715ecaca0177e1b473c7 (patch) | |
| tree | 91aa453d6313eee89c8b19eea48699b1143264aa /include/linux | |
| parent | efc36aa5608f5717338747e152c23f2cfdb14697 (diff) | |
[PATCH] knfsd: Break the hard linkage from svc_expkey to svc_export
Current svc_expkey holds a pointer to the svc_export structure, so updates to
that structure have to be in-place, which is a wart on the whole cache
infrastruct. So we break that linkage and just do a second lookup.
If this became a performance issue, it would be possible to put a direct link
back in which was only used conditionally. i.e. when an object is replaced
in the cache, we set a flag in the old object. When dereferencing the link
from svc_expkey, if the flag is set, we drop the reference and do a fresh
lookup.
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/nfsd/export.h | 20 |
1 files changed, 4 insertions, 16 deletions
diff --git a/include/linux/nfsd/export.h b/include/linux/nfsd/export.h index 6bad4766d3d9..d52e0b7ad37b 100644 --- a/include/linux/nfsd/export.h +++ b/include/linux/nfsd/export.h | |||
| @@ -67,7 +67,8 @@ struct svc_expkey { | |||
| 67 | int ek_fsidtype; | 67 | int ek_fsidtype; |
| 68 | u32 ek_fsid[3]; | 68 | u32 ek_fsid[3]; |
| 69 | 69 | ||
| 70 | struct svc_export * ek_export; | 70 | struct vfsmount * ek_mnt; |
| 71 | struct dentry * ek_dentry; | ||
| 71 | }; | 72 | }; |
| 72 | 73 | ||
| 73 | #define EX_SECURE(exp) (!((exp)->ex_flags & NFSEXP_INSECURE_PORT)) | 74 | #define EX_SECURE(exp) (!((exp)->ex_flags & NFSEXP_INSECURE_PORT)) |
| @@ -114,22 +115,9 @@ static inline void exp_get(struct svc_export *exp) | |||
| 114 | { | 115 | { |
| 115 | cache_get(&exp->h); | 116 | cache_get(&exp->h); |
| 116 | } | 117 | } |
| 117 | static inline struct svc_export * | 118 | extern struct svc_export * |
| 118 | exp_find(struct auth_domain *clp, int fsid_type, u32 *fsidv, | 119 | exp_find(struct auth_domain *clp, int fsid_type, u32 *fsidv, |
| 119 | struct cache_req *reqp) | 120 | struct cache_req *reqp); |
| 120 | { | ||
| 121 | struct svc_expkey *ek = exp_find_key(clp, fsid_type, fsidv, reqp); | ||
| 122 | if (ek && !IS_ERR(ek)) { | ||
| 123 | struct svc_export *exp = ek->ek_export; | ||
| 124 | int err; | ||
| 125 | exp_get(exp); | ||
| 126 | expkey_put(&ek->h, &svc_expkey_cache); | ||
| 127 | if ((err = cache_check(&svc_export_cache, &exp->h, reqp))) | ||
| 128 | exp = ERR_PTR(err); | ||
| 129 | return exp; | ||
| 130 | } else | ||
| 131 | return ERR_PTR(PTR_ERR(ek)); | ||
| 132 | } | ||
| 133 | 121 | ||
| 134 | #endif /* __KERNEL__ */ | 122 | #endif /* __KERNEL__ */ |
| 135 | 123 | ||
