X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Flinux%2Fnfsd%2Fexport.h;h=6bad4766d3d9d235227af2dc1f35cf99f0359637;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=d2a8abb5011abfb8d5a2ad225672c6c35078dfc5;hpb=f7ed79d23a47594e7834d66a8f14449796d4f3e6;p=linux-2.6.git diff --git a/include/linux/nfsd/export.h b/include/linux/nfsd/export.h index d2a8abb50..6bad4766d 100644 --- a/include/linux/nfsd/export.h +++ b/include/linux/nfsd/export.h @@ -67,8 +67,7 @@ struct svc_expkey { int ek_fsidtype; u32 ek_fsid[3]; - struct vfsmount * ek_mnt; - struct dentry * ek_dentry; + struct svc_export * ek_export; }; #define EX_SECURE(exp) (!((exp)->ex_flags & NFSEXP_INSECURE_PORT)) @@ -86,6 +85,9 @@ void nfsd_export_shutdown(void); void nfsd_export_flush(void); void exp_readlock(void); void exp_readunlock(void); +struct svc_expkey * exp_find_key(struct auth_domain *clp, + int fsid_type, u32 *fsidv, + struct cache_req *reqp); struct svc_export * exp_get_by_name(struct auth_domain *clp, struct vfsmount *mnt, struct dentry *dentry, @@ -99,20 +101,35 @@ int exp_rootfh(struct auth_domain *, int exp_pseudoroot(struct auth_domain *, struct svc_fh *fhp, struct cache_req *creq); int nfserrno(int errno); -extern struct cache_detail svc_export_cache; +extern void expkey_put(struct cache_head *item, struct cache_detail *cd); +extern void svc_export_put(struct cache_head *item, struct cache_detail *cd); +extern struct cache_detail svc_export_cache, svc_expkey_cache; static inline void exp_put(struct svc_export *exp) { - cache_put(&exp->h, &svc_export_cache); + svc_export_put(&exp->h, &svc_export_cache); } static inline void exp_get(struct svc_export *exp) { cache_get(&exp->h); } -extern struct svc_export * +static inline struct svc_export * exp_find(struct auth_domain *clp, int fsid_type, u32 *fsidv, - struct cache_req *reqp); + 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)); +} #endif /* __KERNEL__ */