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