1 /* 2 * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de> 3 */ 4 #ifndef NFSD_EXPORT_H 5 #define NFSD_EXPORT_H 6 7 #include <linux/sunrpc/cache.h> 8 #include <uapi/linux/nfsd/export.h> 9 #include <linux/nfs4.h> 10 11 struct knfsd_fh; 12 struct svc_fh; 13 struct svc_rqst; 14 15 /* 16 * FS Locations 17 */ 18 19 #define MAX_FS_LOCATIONS 128 20 21 struct nfsd4_fs_location { 22 char *hosts; /* colon separated list of hosts */ 23 char *path; /* slash separated list of path components */ 24 }; 25 26 struct nfsd4_fs_locations { 27 uint32_t locations_count; 28 struct nfsd4_fs_location *locations; 29 /* If we're not actually serving this data ourselves (only providing a 30 * list of replicas that do serve it) then we set "migrated": */ 31 int migrated; 32 }; 33 34 /* 35 * We keep an array of pseudoflavors with the export, in order from most 36 * to least preferred. For the foreseeable future, we don't expect more 37 * than the eight pseudoflavors null, unix, krb5, krb5i, krb5p, skpm3, 38 * spkm3i, and spkm3p (and using all 8 at once should be rare). 39 */ 40 #define MAX_SECINFO_LIST 8 41 #define EX_UUID_LEN 16 42 43 struct exp_flavor_info { 44 u32 pseudoflavor; 45 u32 flags; 46 }; 47 48 struct svc_export { 49 struct cache_head h; 50 struct auth_domain * ex_client; 51 int ex_flags; 52 struct path ex_path; 53 kuid_t ex_anon_uid; 54 kgid_t ex_anon_gid; 55 int ex_fsid; 56 unsigned char * ex_uuid; /* 16 byte fsid */ 57 struct nfsd4_fs_locations ex_fslocs; 58 uint32_t ex_nflavors; 59 struct exp_flavor_info ex_flavors[MAX_SECINFO_LIST]; 60 enum pnfs_layouttype ex_layout_type; 61 struct nfsd4_deviceid_map *ex_devid_map; 62 struct cache_detail *cd; 63 }; 64 65 /* an "export key" (expkey) maps a filehandlefragement to an 66 * svc_export for a given client. There can be several per export, 67 * for the different fsid types. 68 */ 69 struct svc_expkey { 70 struct cache_head h; 71 72 struct auth_domain * ek_client; 73 int ek_fsidtype; 74 u32 ek_fsid[6]; 75 76 struct path ek_path; 77 }; 78 79 #define EX_ISSYNC(exp) (!((exp)->ex_flags & NFSEXP_ASYNC)) 80 #define EX_NOHIDE(exp) ((exp)->ex_flags & NFSEXP_NOHIDE) 81 #define EX_WGATHER(exp) ((exp)->ex_flags & NFSEXP_GATHERED_WRITES) 82 83 int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export *exp); 84 __be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp); 85 86 /* 87 * Function declarations 88 */ 89 int nfsd_export_init(struct net *); 90 void nfsd_export_shutdown(struct net *); 91 void nfsd_export_flush(struct net *); 92 struct svc_export * rqst_exp_get_by_name(struct svc_rqst *, 93 struct path *); 94 struct svc_export * rqst_exp_parent(struct svc_rqst *, 95 struct path *); 96 struct svc_export * rqst_find_fsidzero_export(struct svc_rqst *); 97 int exp_rootfh(struct net *, struct auth_domain *, 98 char *path, struct knfsd_fh *, int maxsize); 99 __be32 exp_pseudoroot(struct svc_rqst *, struct svc_fh *); 100 __be32 nfserrno(int errno); 101 102 static inline void exp_put(struct svc_export *exp) 103 { 104 cache_put(&exp->h, exp->cd); 105 } 106 107 static inline struct svc_export *exp_get(struct svc_export *exp) 108 { 109 cache_get(&exp->h); 110 return exp; 111 } 112 struct svc_export * rqst_exp_find(struct svc_rqst *, int, u32 *); 113 114 #endif /* NFSD_EXPORT_H */ 115