[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>
This commit is contained in:
committed by
Linus Torvalds
parent
efc36aa560
commit
eab7e2e647
@@ -67,7 +67,8 @@ struct svc_expkey {
|
||||
int ek_fsidtype;
|
||||
u32 ek_fsid[3];
|
||||
|
||||
struct svc_export * ek_export;
|
||||
struct vfsmount * ek_mnt;
|
||||
struct dentry * ek_dentry;
|
||||
};
|
||||
|
||||
#define EX_SECURE(exp) (!((exp)->ex_flags & NFSEXP_INSECURE_PORT))
|
||||
@@ -114,22 +115,9 @@ static inline void exp_get(struct svc_export *exp)
|
||||
{
|
||||
cache_get(&exp->h);
|
||||
}
|
||||
static inline struct svc_export *
|
||||
extern struct svc_export *
|
||||
exp_find(struct auth_domain *clp, int fsid_type, u32 *fsidv,
|
||||
struct cache_req *reqp)
|
||||
{
|
||||
struct svc_expkey *ek = exp_find_key(clp, fsid_type, fsidv, reqp);
|
||||
if (ek && !IS_ERR(ek)) {
|
||||
struct svc_export *exp = ek->ek_export;
|
||||
int err;
|
||||
exp_get(exp);
|
||||
expkey_put(&ek->h, &svc_expkey_cache);
|
||||
if ((err = cache_check(&svc_export_cache, &exp->h, reqp)))
|
||||
exp = ERR_PTR(err);
|
||||
return exp;
|
||||
} else
|
||||
return ERR_PTR(PTR_ERR(ek));
|
||||
}
|
||||
struct cache_req *reqp);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
Reference in New Issue
Block a user