xref: /OK3568_Linux_fs/kernel/fs/nfs/internal.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * NFS internal definitions
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include "nfs4_fs.h"
7*4882a593Smuzhiyun #include <linux/fs_context.h>
8*4882a593Smuzhiyun #include <linux/security.h>
9*4882a593Smuzhiyun #include <linux/crc32.h>
10*4882a593Smuzhiyun #include <linux/sunrpc/addr.h>
11*4882a593Smuzhiyun #include <linux/nfs_page.h>
12*4882a593Smuzhiyun #include <linux/wait_bit.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define NFS_SB_MASK (SB_RDONLY|SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS)
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun extern const struct export_operations nfs_export_ops;
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun struct nfs_string;
19*4882a593Smuzhiyun struct nfs_pageio_descriptor;
20*4882a593Smuzhiyun 
nfs_attr_check_mountpoint(struct super_block * parent,struct nfs_fattr * fattr)21*4882a593Smuzhiyun static inline void nfs_attr_check_mountpoint(struct super_block *parent, struct nfs_fattr *fattr)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun 	if (!nfs_fsid_equal(&NFS_SB(parent)->fsid, &fattr->fsid))
24*4882a593Smuzhiyun 		fattr->valid |= NFS_ATTR_FATTR_MOUNTPOINT;
25*4882a593Smuzhiyun }
26*4882a593Smuzhiyun 
nfs_attr_use_mounted_on_fileid(struct nfs_fattr * fattr)27*4882a593Smuzhiyun static inline int nfs_attr_use_mounted_on_fileid(struct nfs_fattr *fattr)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun 	if (((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) == 0) ||
30*4882a593Smuzhiyun 	    (((fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT) == 0) &&
31*4882a593Smuzhiyun 	     ((fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) == 0)))
32*4882a593Smuzhiyun 		return 0;
33*4882a593Smuzhiyun 	return 1;
34*4882a593Smuzhiyun }
35*4882a593Smuzhiyun 
nfs_lookup_is_soft_revalidate(const struct dentry * dentry)36*4882a593Smuzhiyun static inline bool nfs_lookup_is_soft_revalidate(const struct dentry *dentry)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun 	if (!(NFS_SB(dentry->d_sb)->flags & NFS_MOUNT_SOFTREVAL))
39*4882a593Smuzhiyun 		return false;
40*4882a593Smuzhiyun 	if (!d_is_positive(dentry) || !NFS_FH(d_inode(dentry))->size)
41*4882a593Smuzhiyun 		return false;
42*4882a593Smuzhiyun 	return true;
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun 
flags_to_mode(int flags)45*4882a593Smuzhiyun static inline fmode_t flags_to_mode(int flags)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun 	fmode_t res = (__force fmode_t)flags & FMODE_EXEC;
48*4882a593Smuzhiyun 	if ((flags & O_ACCMODE) != O_WRONLY)
49*4882a593Smuzhiyun 		res |= FMODE_READ;
50*4882a593Smuzhiyun 	if ((flags & O_ACCMODE) != O_RDONLY)
51*4882a593Smuzhiyun 		res |= FMODE_WRITE;
52*4882a593Smuzhiyun 	return res;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /*
56*4882a593Smuzhiyun  * Note: RFC 1813 doesn't limit the number of auth flavors that
57*4882a593Smuzhiyun  * a server can return, so make something up.
58*4882a593Smuzhiyun  */
59*4882a593Smuzhiyun #define NFS_MAX_SECFLAVORS	(12)
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /*
62*4882a593Smuzhiyun  * Value used if the user did not specify a port value.
63*4882a593Smuzhiyun  */
64*4882a593Smuzhiyun #define NFS_UNSPEC_PORT		(-1)
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define NFS_UNSPEC_RETRANS	(UINT_MAX)
67*4882a593Smuzhiyun #define NFS_UNSPEC_TIMEO	(UINT_MAX)
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /*
70*4882a593Smuzhiyun  * Maximum number of pages that readdir can use for creating
71*4882a593Smuzhiyun  * a vmapped array of pages.
72*4882a593Smuzhiyun  */
73*4882a593Smuzhiyun #define NFS_MAX_READDIR_PAGES 8
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun struct nfs_client_initdata {
76*4882a593Smuzhiyun 	unsigned long init_flags;
77*4882a593Smuzhiyun 	const char *hostname;			/* Hostname of the server */
78*4882a593Smuzhiyun 	const struct sockaddr *addr;		/* Address of the server */
79*4882a593Smuzhiyun 	const char *nodename;			/* Hostname of the client */
80*4882a593Smuzhiyun 	const char *ip_addr;			/* IP address of the client */
81*4882a593Smuzhiyun 	size_t addrlen;
82*4882a593Smuzhiyun 	struct nfs_subversion *nfs_mod;
83*4882a593Smuzhiyun 	int proto;
84*4882a593Smuzhiyun 	u32 minorversion;
85*4882a593Smuzhiyun 	unsigned int nconnect;
86*4882a593Smuzhiyun 	struct net *net;
87*4882a593Smuzhiyun 	const struct rpc_timeout *timeparms;
88*4882a593Smuzhiyun 	const struct cred *cred;
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /*
92*4882a593Smuzhiyun  * In-kernel mount arguments
93*4882a593Smuzhiyun  */
94*4882a593Smuzhiyun struct nfs_fs_context {
95*4882a593Smuzhiyun 	bool			internal;
96*4882a593Smuzhiyun 	bool			skip_reconfig_option_check;
97*4882a593Smuzhiyun 	bool			need_mount;
98*4882a593Smuzhiyun 	bool			sloppy;
99*4882a593Smuzhiyun 	unsigned int		flags;		/* NFS{,4}_MOUNT_* flags */
100*4882a593Smuzhiyun 	unsigned int		rsize, wsize;
101*4882a593Smuzhiyun 	unsigned int		timeo, retrans;
102*4882a593Smuzhiyun 	unsigned int		acregmin, acregmax;
103*4882a593Smuzhiyun 	unsigned int		acdirmin, acdirmax;
104*4882a593Smuzhiyun 	unsigned int		namlen;
105*4882a593Smuzhiyun 	unsigned int		options;
106*4882a593Smuzhiyun 	unsigned int		bsize;
107*4882a593Smuzhiyun 	struct nfs_auth_info	auth_info;
108*4882a593Smuzhiyun 	rpc_authflavor_t	selected_flavor;
109*4882a593Smuzhiyun 	char			*client_address;
110*4882a593Smuzhiyun 	unsigned int		version;
111*4882a593Smuzhiyun 	unsigned int		minorversion;
112*4882a593Smuzhiyun 	char			*fscache_uniq;
113*4882a593Smuzhiyun 	unsigned short		protofamily;
114*4882a593Smuzhiyun 	unsigned short		mountfamily;
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 	struct {
117*4882a593Smuzhiyun 		union {
118*4882a593Smuzhiyun 			struct sockaddr	address;
119*4882a593Smuzhiyun 			struct sockaddr_storage	_address;
120*4882a593Smuzhiyun 		};
121*4882a593Smuzhiyun 		size_t			addrlen;
122*4882a593Smuzhiyun 		char			*hostname;
123*4882a593Smuzhiyun 		u32			version;
124*4882a593Smuzhiyun 		int			port;
125*4882a593Smuzhiyun 		unsigned short		protocol;
126*4882a593Smuzhiyun 	} mount_server;
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	struct {
129*4882a593Smuzhiyun 		union {
130*4882a593Smuzhiyun 			struct sockaddr	address;
131*4882a593Smuzhiyun 			struct sockaddr_storage	_address;
132*4882a593Smuzhiyun 		};
133*4882a593Smuzhiyun 		size_t			addrlen;
134*4882a593Smuzhiyun 		char			*hostname;
135*4882a593Smuzhiyun 		char			*export_path;
136*4882a593Smuzhiyun 		int			port;
137*4882a593Smuzhiyun 		unsigned short		protocol;
138*4882a593Smuzhiyun 		unsigned short		nconnect;
139*4882a593Smuzhiyun 		unsigned short		export_path_len;
140*4882a593Smuzhiyun 	} nfs_server;
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	struct nfs_fh		*mntfh;
143*4882a593Smuzhiyun 	struct nfs_server	*server;
144*4882a593Smuzhiyun 	struct nfs_subversion	*nfs_mod;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 	/* Information for a cloned mount. */
147*4882a593Smuzhiyun 	struct nfs_clone_mount {
148*4882a593Smuzhiyun 		struct super_block	*sb;
149*4882a593Smuzhiyun 		struct dentry		*dentry;
150*4882a593Smuzhiyun 		struct nfs_fattr	*fattr;
151*4882a593Smuzhiyun 		unsigned int		inherited_bsize;
152*4882a593Smuzhiyun 	} clone_data;
153*4882a593Smuzhiyun };
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun #define nfs_errorf(fc, fmt, ...) ((fc)->log.log ?		\
156*4882a593Smuzhiyun 	errorf(fc, fmt, ## __VA_ARGS__) :			\
157*4882a593Smuzhiyun 	({ dprintk(fmt "\n", ## __VA_ARGS__); }))
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun #define nfs_ferrorf(fc, fac, fmt, ...) ((fc)->log.log ?		\
160*4882a593Smuzhiyun 	errorf(fc, fmt, ## __VA_ARGS__) :			\
161*4882a593Smuzhiyun 	({ dfprintk(fac, fmt "\n", ## __VA_ARGS__); }))
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun #define nfs_invalf(fc, fmt, ...) ((fc)->log.log ?		\
164*4882a593Smuzhiyun 	invalf(fc, fmt, ## __VA_ARGS__) :			\
165*4882a593Smuzhiyun 	({ dprintk(fmt "\n", ## __VA_ARGS__);  -EINVAL; }))
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun #define nfs_finvalf(fc, fac, fmt, ...) ((fc)->log.log ?		\
168*4882a593Smuzhiyun 	invalf(fc, fmt, ## __VA_ARGS__) :			\
169*4882a593Smuzhiyun 	({ dfprintk(fac, fmt "\n", ## __VA_ARGS__);  -EINVAL; }))
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun #define nfs_warnf(fc, fmt, ...) ((fc)->log.log ?		\
172*4882a593Smuzhiyun 	warnf(fc, fmt, ## __VA_ARGS__) :			\
173*4882a593Smuzhiyun 	({ dprintk(fmt "\n", ## __VA_ARGS__); }))
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #define nfs_fwarnf(fc, fac, fmt, ...) ((fc)->log.log ?		\
176*4882a593Smuzhiyun 	warnf(fc, fmt, ## __VA_ARGS__) :			\
177*4882a593Smuzhiyun 	({ dfprintk(fac, fmt "\n", ## __VA_ARGS__); }))
178*4882a593Smuzhiyun 
nfs_fc2context(const struct fs_context * fc)179*4882a593Smuzhiyun static inline struct nfs_fs_context *nfs_fc2context(const struct fs_context *fc)
180*4882a593Smuzhiyun {
181*4882a593Smuzhiyun 	return fc->fs_private;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun /* mount_clnt.c */
185*4882a593Smuzhiyun struct nfs_mount_request {
186*4882a593Smuzhiyun 	struct sockaddr		*sap;
187*4882a593Smuzhiyun 	size_t			salen;
188*4882a593Smuzhiyun 	char			*hostname;
189*4882a593Smuzhiyun 	char			*dirpath;
190*4882a593Smuzhiyun 	u32			version;
191*4882a593Smuzhiyun 	unsigned short		protocol;
192*4882a593Smuzhiyun 	struct nfs_fh		*fh;
193*4882a593Smuzhiyun 	int			noresvport;
194*4882a593Smuzhiyun 	unsigned int		*auth_flav_len;
195*4882a593Smuzhiyun 	rpc_authflavor_t	*auth_flavs;
196*4882a593Smuzhiyun 	struct net		*net;
197*4882a593Smuzhiyun };
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun extern int nfs_mount(struct nfs_mount_request *info);
200*4882a593Smuzhiyun extern void nfs_umount(const struct nfs_mount_request *info);
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun /* client.c */
203*4882a593Smuzhiyun extern const struct rpc_program nfs_program;
204*4882a593Smuzhiyun extern void nfs_clients_init(struct net *net);
205*4882a593Smuzhiyun extern void nfs_clients_exit(struct net *net);
206*4882a593Smuzhiyun extern struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *);
207*4882a593Smuzhiyun int nfs_create_rpc_client(struct nfs_client *, const struct nfs_client_initdata *, rpc_authflavor_t);
208*4882a593Smuzhiyun struct nfs_client *nfs_get_client(const struct nfs_client_initdata *);
209*4882a593Smuzhiyun int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *, struct nfs_fattr *);
210*4882a593Smuzhiyun void nfs_server_insert_lists(struct nfs_server *);
211*4882a593Smuzhiyun void nfs_server_remove_lists(struct nfs_server *);
212*4882a593Smuzhiyun void nfs_init_timeout_values(struct rpc_timeout *to, int proto, int timeo, int retrans);
213*4882a593Smuzhiyun int nfs_init_server_rpcclient(struct nfs_server *, const struct rpc_timeout *t,
214*4882a593Smuzhiyun 		rpc_authflavor_t);
215*4882a593Smuzhiyun struct nfs_server *nfs_alloc_server(void);
216*4882a593Smuzhiyun void nfs_server_copy_userdata(struct nfs_server *, struct nfs_server *);
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun extern void nfs_put_client(struct nfs_client *);
219*4882a593Smuzhiyun extern void nfs_free_client(struct nfs_client *);
220*4882a593Smuzhiyun extern struct nfs_client *nfs4_find_client_ident(struct net *, int);
221*4882a593Smuzhiyun extern struct nfs_client *
222*4882a593Smuzhiyun nfs4_find_client_sessionid(struct net *, const struct sockaddr *,
223*4882a593Smuzhiyun 				struct nfs4_sessionid *, u32);
224*4882a593Smuzhiyun extern struct nfs_server *nfs_create_server(struct fs_context *);
225*4882a593Smuzhiyun extern struct nfs_server *nfs4_create_server(struct fs_context *);
226*4882a593Smuzhiyun extern struct nfs_server *nfs4_create_referral_server(struct fs_context *);
227*4882a593Smuzhiyun extern int nfs4_update_server(struct nfs_server *server, const char *hostname,
228*4882a593Smuzhiyun 					struct sockaddr *sap, size_t salen,
229*4882a593Smuzhiyun 					struct net *net);
230*4882a593Smuzhiyun extern void nfs_free_server(struct nfs_server *server);
231*4882a593Smuzhiyun extern struct nfs_server *nfs_clone_server(struct nfs_server *,
232*4882a593Smuzhiyun 					   struct nfs_fh *,
233*4882a593Smuzhiyun 					   struct nfs_fattr *,
234*4882a593Smuzhiyun 					   rpc_authflavor_t);
235*4882a593Smuzhiyun extern bool nfs_client_init_is_complete(const struct nfs_client *clp);
236*4882a593Smuzhiyun extern int nfs_client_init_status(const struct nfs_client *clp);
237*4882a593Smuzhiyun extern int nfs_wait_client_init_complete(const struct nfs_client *clp);
238*4882a593Smuzhiyun extern void nfs_mark_client_ready(struct nfs_client *clp, int state);
239*4882a593Smuzhiyun extern struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
240*4882a593Smuzhiyun 					     const struct sockaddr *ds_addr,
241*4882a593Smuzhiyun 					     int ds_addrlen, int ds_proto,
242*4882a593Smuzhiyun 					     unsigned int ds_timeo,
243*4882a593Smuzhiyun 					     unsigned int ds_retrans,
244*4882a593Smuzhiyun 					     u32 minor_version);
245*4882a593Smuzhiyun extern struct rpc_clnt *nfs4_find_or_create_ds_client(struct nfs_client *,
246*4882a593Smuzhiyun 						struct inode *);
247*4882a593Smuzhiyun extern struct nfs_client *nfs3_set_ds_client(struct nfs_server *mds_srv,
248*4882a593Smuzhiyun 			const struct sockaddr *ds_addr, int ds_addrlen,
249*4882a593Smuzhiyun 			int ds_proto, unsigned int ds_timeo,
250*4882a593Smuzhiyun 			unsigned int ds_retrans);
251*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
252*4882a593Smuzhiyun extern int __init nfs_fs_proc_init(void);
253*4882a593Smuzhiyun extern void nfs_fs_proc_exit(void);
254*4882a593Smuzhiyun extern int nfs_fs_proc_net_init(struct net *net);
255*4882a593Smuzhiyun extern void nfs_fs_proc_net_exit(struct net *net);
256*4882a593Smuzhiyun #else
nfs_fs_proc_net_init(struct net * net)257*4882a593Smuzhiyun static inline int nfs_fs_proc_net_init(struct net *net)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun 	return 0;
260*4882a593Smuzhiyun }
nfs_fs_proc_net_exit(struct net * net)261*4882a593Smuzhiyun static inline void nfs_fs_proc_net_exit(struct net *net)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun }
nfs_fs_proc_init(void)264*4882a593Smuzhiyun static inline int nfs_fs_proc_init(void)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun 	return 0;
267*4882a593Smuzhiyun }
nfs_fs_proc_exit(void)268*4882a593Smuzhiyun static inline void nfs_fs_proc_exit(void)
269*4882a593Smuzhiyun {
270*4882a593Smuzhiyun }
271*4882a593Smuzhiyun #endif
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun /* callback_xdr.c */
274*4882a593Smuzhiyun extern const struct svc_version nfs4_callback_version1;
275*4882a593Smuzhiyun extern const struct svc_version nfs4_callback_version4;
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun /* fs_context.c */
278*4882a593Smuzhiyun extern struct file_system_type nfs_fs_type;
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun /* pagelist.c */
281*4882a593Smuzhiyun extern int __init nfs_init_nfspagecache(void);
282*4882a593Smuzhiyun extern void nfs_destroy_nfspagecache(void);
283*4882a593Smuzhiyun extern int __init nfs_init_readpagecache(void);
284*4882a593Smuzhiyun extern void nfs_destroy_readpagecache(void);
285*4882a593Smuzhiyun extern int __init nfs_init_writepagecache(void);
286*4882a593Smuzhiyun extern void nfs_destroy_writepagecache(void);
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun extern int __init nfs_init_directcache(void);
289*4882a593Smuzhiyun extern void nfs_destroy_directcache(void);
290*4882a593Smuzhiyun extern void nfs_pgheader_init(struct nfs_pageio_descriptor *desc,
291*4882a593Smuzhiyun 			      struct nfs_pgio_header *hdr,
292*4882a593Smuzhiyun 			      void (*release)(struct nfs_pgio_header *hdr));
293*4882a593Smuzhiyun void nfs_set_pgio_error(struct nfs_pgio_header *hdr, int error, loff_t pos);
294*4882a593Smuzhiyun int nfs_iocounter_wait(struct nfs_lock_context *l_ctx);
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun extern const struct nfs_pageio_ops nfs_pgio_rw_ops;
297*4882a593Smuzhiyun struct nfs_pgio_header *nfs_pgio_header_alloc(const struct nfs_rw_ops *);
298*4882a593Smuzhiyun void nfs_pgio_header_free(struct nfs_pgio_header *);
299*4882a593Smuzhiyun int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
300*4882a593Smuzhiyun int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_header *hdr,
301*4882a593Smuzhiyun 		      const struct cred *cred, const struct nfs_rpc_ops *rpc_ops,
302*4882a593Smuzhiyun 		      const struct rpc_call_ops *call_ops, int how, int flags);
303*4882a593Smuzhiyun void nfs_free_request(struct nfs_page *req);
304*4882a593Smuzhiyun struct nfs_pgio_mirror *
305*4882a593Smuzhiyun nfs_pgio_current_mirror(struct nfs_pageio_descriptor *desc);
306*4882a593Smuzhiyun 
nfs_match_open_context(const struct nfs_open_context * ctx1,const struct nfs_open_context * ctx2)307*4882a593Smuzhiyun static inline bool nfs_match_open_context(const struct nfs_open_context *ctx1,
308*4882a593Smuzhiyun 		const struct nfs_open_context *ctx2)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun 	return cred_fscmp(ctx1->cred, ctx2->cred) == 0 && ctx1->state == ctx2->state;
311*4882a593Smuzhiyun }
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun /* nfs2xdr.c */
314*4882a593Smuzhiyun extern const struct rpc_procinfo nfs_procedures[];
315*4882a593Smuzhiyun extern int nfs2_decode_dirent(struct xdr_stream *,
316*4882a593Smuzhiyun 				struct nfs_entry *, bool);
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun /* nfs3xdr.c */
319*4882a593Smuzhiyun extern const struct rpc_procinfo nfs3_procedures[];
320*4882a593Smuzhiyun extern int nfs3_decode_dirent(struct xdr_stream *,
321*4882a593Smuzhiyun 				struct nfs_entry *, bool);
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun /* nfs4xdr.c */
324*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_NFS_V4)
325*4882a593Smuzhiyun extern int nfs4_decode_dirent(struct xdr_stream *,
326*4882a593Smuzhiyun 				struct nfs_entry *, bool);
327*4882a593Smuzhiyun #endif
328*4882a593Smuzhiyun #ifdef CONFIG_NFS_V4_1
329*4882a593Smuzhiyun extern const u32 nfs41_maxread_overhead;
330*4882a593Smuzhiyun extern const u32 nfs41_maxwrite_overhead;
331*4882a593Smuzhiyun extern const u32 nfs41_maxgetdevinfo_overhead;
332*4882a593Smuzhiyun #endif
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun /* nfs4proc.c */
335*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_NFS_V4)
336*4882a593Smuzhiyun extern const struct rpc_procinfo nfs4_procedures[];
337*4882a593Smuzhiyun #endif
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun #ifdef CONFIG_NFS_V4_SECURITY_LABEL
340*4882a593Smuzhiyun extern struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags);
341*4882a593Smuzhiyun static inline struct nfs4_label *
nfs4_label_copy(struct nfs4_label * dst,struct nfs4_label * src)342*4882a593Smuzhiyun nfs4_label_copy(struct nfs4_label *dst, struct nfs4_label *src)
343*4882a593Smuzhiyun {
344*4882a593Smuzhiyun 	if (!dst || !src)
345*4882a593Smuzhiyun 		return NULL;
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	if (src->len > NFS4_MAXLABELLEN)
348*4882a593Smuzhiyun 		return NULL;
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 	dst->lfs = src->lfs;
351*4882a593Smuzhiyun 	dst->pi = src->pi;
352*4882a593Smuzhiyun 	dst->len = src->len;
353*4882a593Smuzhiyun 	memcpy(dst->label, src->label, src->len);
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	return dst;
356*4882a593Smuzhiyun }
nfs4_label_free(struct nfs4_label * label)357*4882a593Smuzhiyun static inline void nfs4_label_free(struct nfs4_label *label)
358*4882a593Smuzhiyun {
359*4882a593Smuzhiyun 	if (label) {
360*4882a593Smuzhiyun 		kfree(label->label);
361*4882a593Smuzhiyun 		kfree(label);
362*4882a593Smuzhiyun 	}
363*4882a593Smuzhiyun 	return;
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun 
nfs_zap_label_cache_locked(struct nfs_inode * nfsi)366*4882a593Smuzhiyun static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun 	if (nfs_server_capable(&nfsi->vfs_inode, NFS_CAP_SECURITY_LABEL))
369*4882a593Smuzhiyun 		nfsi->cache_validity |= NFS_INO_INVALID_LABEL;
370*4882a593Smuzhiyun }
371*4882a593Smuzhiyun #else
nfs4_label_alloc(struct nfs_server * server,gfp_t flags)372*4882a593Smuzhiyun static inline struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags) { return NULL; }
nfs4_label_free(void * label)373*4882a593Smuzhiyun static inline void nfs4_label_free(void *label) {}
nfs_zap_label_cache_locked(struct nfs_inode * nfsi)374*4882a593Smuzhiyun static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi)
375*4882a593Smuzhiyun {
376*4882a593Smuzhiyun }
377*4882a593Smuzhiyun static inline struct nfs4_label *
nfs4_label_copy(struct nfs4_label * dst,struct nfs4_label * src)378*4882a593Smuzhiyun nfs4_label_copy(struct nfs4_label *dst, struct nfs4_label *src)
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun 	return NULL;
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun #endif /* CONFIG_NFS_V4_SECURITY_LABEL */
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun /* proc.c */
385*4882a593Smuzhiyun void nfs_close_context(struct nfs_open_context *ctx, int is_sync);
386*4882a593Smuzhiyun extern struct nfs_client *nfs_init_client(struct nfs_client *clp,
387*4882a593Smuzhiyun 			   const struct nfs_client_initdata *);
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun /* dir.c */
390*4882a593Smuzhiyun extern void nfs_advise_use_readdirplus(struct inode *dir);
391*4882a593Smuzhiyun extern void nfs_force_use_readdirplus(struct inode *dir);
392*4882a593Smuzhiyun extern unsigned long nfs_access_cache_count(struct shrinker *shrink,
393*4882a593Smuzhiyun 					    struct shrink_control *sc);
394*4882a593Smuzhiyun extern unsigned long nfs_access_cache_scan(struct shrinker *shrink,
395*4882a593Smuzhiyun 					   struct shrink_control *sc);
396*4882a593Smuzhiyun struct dentry *nfs_lookup(struct inode *, struct dentry *, unsigned int);
397*4882a593Smuzhiyun int nfs_create(struct inode *, struct dentry *, umode_t, bool);
398*4882a593Smuzhiyun int nfs_mkdir(struct inode *, struct dentry *, umode_t);
399*4882a593Smuzhiyun int nfs_rmdir(struct inode *, struct dentry *);
400*4882a593Smuzhiyun int nfs_unlink(struct inode *, struct dentry *);
401*4882a593Smuzhiyun int nfs_symlink(struct inode *, struct dentry *, const char *);
402*4882a593Smuzhiyun int nfs_link(struct dentry *, struct inode *, struct dentry *);
403*4882a593Smuzhiyun int nfs_mknod(struct inode *, struct dentry *, umode_t, dev_t);
404*4882a593Smuzhiyun int nfs_rename(struct inode *, struct dentry *,
405*4882a593Smuzhiyun 	       struct inode *, struct dentry *, unsigned int);
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun /* file.c */
408*4882a593Smuzhiyun int nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync);
409*4882a593Smuzhiyun loff_t nfs_file_llseek(struct file *, loff_t, int);
410*4882a593Smuzhiyun ssize_t nfs_file_read(struct kiocb *, struct iov_iter *);
411*4882a593Smuzhiyun int nfs_file_mmap(struct file *, struct vm_area_struct *);
412*4882a593Smuzhiyun ssize_t nfs_file_write(struct kiocb *, struct iov_iter *);
413*4882a593Smuzhiyun int nfs_file_release(struct inode *, struct file *);
414*4882a593Smuzhiyun int nfs_lock(struct file *, int, struct file_lock *);
415*4882a593Smuzhiyun int nfs_flock(struct file *, int, struct file_lock *);
416*4882a593Smuzhiyun int nfs_check_flags(int);
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun /* inode.c */
419*4882a593Smuzhiyun extern struct workqueue_struct *nfsiod_workqueue;
420*4882a593Smuzhiyun extern struct inode *nfs_alloc_inode(struct super_block *sb);
421*4882a593Smuzhiyun extern void nfs_free_inode(struct inode *);
422*4882a593Smuzhiyun extern int nfs_write_inode(struct inode *, struct writeback_control *);
423*4882a593Smuzhiyun extern int nfs_drop_inode(struct inode *);
424*4882a593Smuzhiyun extern void nfs_clear_inode(struct inode *);
425*4882a593Smuzhiyun extern void nfs_evict_inode(struct inode *);
426*4882a593Smuzhiyun void nfs_zap_acl_cache(struct inode *inode);
427*4882a593Smuzhiyun extern bool nfs_check_cache_invalid(struct inode *, unsigned long);
428*4882a593Smuzhiyun extern int nfs_wait_bit_killable(struct wait_bit_key *key, int mode);
429*4882a593Smuzhiyun extern int nfs_wait_atomic_killable(atomic_t *p, unsigned int mode);
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun /* super.c */
432*4882a593Smuzhiyun extern const struct super_operations nfs_sops;
433*4882a593Smuzhiyun bool nfs_auth_info_match(const struct nfs_auth_info *, rpc_authflavor_t);
434*4882a593Smuzhiyun int nfs_try_get_tree(struct fs_context *);
435*4882a593Smuzhiyun int nfs_get_tree_common(struct fs_context *);
436*4882a593Smuzhiyun void nfs_kill_super(struct super_block *);
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun extern struct rpc_stat nfs_rpcstat;
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun extern int __init register_nfs_fs(void);
441*4882a593Smuzhiyun extern void __exit unregister_nfs_fs(void);
442*4882a593Smuzhiyun extern bool nfs_sb_active(struct super_block *sb);
443*4882a593Smuzhiyun extern void nfs_sb_deactive(struct super_block *sb);
444*4882a593Smuzhiyun extern int nfs_client_for_each_server(struct nfs_client *clp,
445*4882a593Smuzhiyun 				      int (*fn)(struct nfs_server *, void *),
446*4882a593Smuzhiyun 				      void *data);
447*4882a593Smuzhiyun /* io.c */
448*4882a593Smuzhiyun extern void nfs_start_io_read(struct inode *inode);
449*4882a593Smuzhiyun extern void nfs_end_io_read(struct inode *inode);
450*4882a593Smuzhiyun extern void nfs_start_io_write(struct inode *inode);
451*4882a593Smuzhiyun extern void nfs_end_io_write(struct inode *inode);
452*4882a593Smuzhiyun extern void nfs_start_io_direct(struct inode *inode);
453*4882a593Smuzhiyun extern void nfs_end_io_direct(struct inode *inode);
454*4882a593Smuzhiyun 
nfs_file_io_is_buffered(struct nfs_inode * nfsi)455*4882a593Smuzhiyun static inline bool nfs_file_io_is_buffered(struct nfs_inode *nfsi)
456*4882a593Smuzhiyun {
457*4882a593Smuzhiyun 	return test_bit(NFS_INO_ODIRECT, &nfsi->flags) == 0;
458*4882a593Smuzhiyun }
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun /* namespace.c */
461*4882a593Smuzhiyun #define NFS_PATH_CANONICAL 1
462*4882a593Smuzhiyun extern char *nfs_path(char **p, struct dentry *dentry,
463*4882a593Smuzhiyun 		      char *buffer, ssize_t buflen, unsigned flags);
464*4882a593Smuzhiyun extern struct vfsmount *nfs_d_automount(struct path *path);
465*4882a593Smuzhiyun int nfs_submount(struct fs_context *, struct nfs_server *);
466*4882a593Smuzhiyun int nfs_do_submount(struct fs_context *);
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun /* getroot.c */
469*4882a593Smuzhiyun extern int nfs_get_root(struct super_block *s, struct fs_context *fc);
470*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_NFS_V4)
471*4882a593Smuzhiyun extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool);
472*4882a593Smuzhiyun #endif
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun struct nfs_pgio_completion_ops;
475*4882a593Smuzhiyun /* read.c */
476*4882a593Smuzhiyun extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
477*4882a593Smuzhiyun 			struct inode *inode, bool force_mds,
478*4882a593Smuzhiyun 			const struct nfs_pgio_completion_ops *compl_ops);
479*4882a593Smuzhiyun extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
480*4882a593Smuzhiyun extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun /* super.c */
483*4882a593Smuzhiyun void nfs_umount_begin(struct super_block *);
484*4882a593Smuzhiyun int  nfs_statfs(struct dentry *, struct kstatfs *);
485*4882a593Smuzhiyun int  nfs_show_options(struct seq_file *, struct dentry *);
486*4882a593Smuzhiyun int  nfs_show_devname(struct seq_file *, struct dentry *);
487*4882a593Smuzhiyun int  nfs_show_path(struct seq_file *, struct dentry *);
488*4882a593Smuzhiyun int  nfs_show_stats(struct seq_file *, struct dentry *);
489*4882a593Smuzhiyun int  nfs_reconfigure(struct fs_context *);
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun /* write.c */
492*4882a593Smuzhiyun extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
493*4882a593Smuzhiyun 			struct inode *inode, int ioflags, bool force_mds,
494*4882a593Smuzhiyun 			const struct nfs_pgio_completion_ops *compl_ops);
495*4882a593Smuzhiyun extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
496*4882a593Smuzhiyun extern void nfs_commit_free(struct nfs_commit_data *p);
497*4882a593Smuzhiyun extern void nfs_write_prepare(struct rpc_task *task, void *calldata);
498*4882a593Smuzhiyun extern void nfs_commit_prepare(struct rpc_task *task, void *calldata);
499*4882a593Smuzhiyun extern int nfs_initiate_commit(struct rpc_clnt *clnt,
500*4882a593Smuzhiyun 			       struct nfs_commit_data *data,
501*4882a593Smuzhiyun 			       const struct nfs_rpc_ops *nfs_ops,
502*4882a593Smuzhiyun 			       const struct rpc_call_ops *call_ops,
503*4882a593Smuzhiyun 			       int how, int flags);
504*4882a593Smuzhiyun extern void nfs_init_commit(struct nfs_commit_data *data,
505*4882a593Smuzhiyun 			    struct list_head *head,
506*4882a593Smuzhiyun 			    struct pnfs_layout_segment *lseg,
507*4882a593Smuzhiyun 			    struct nfs_commit_info *cinfo);
508*4882a593Smuzhiyun int nfs_scan_commit_list(struct list_head *src, struct list_head *dst,
509*4882a593Smuzhiyun 			 struct nfs_commit_info *cinfo, int max);
510*4882a593Smuzhiyun unsigned long nfs_reqs_to_commit(struct nfs_commit_info *);
511*4882a593Smuzhiyun int nfs_scan_commit(struct inode *inode, struct list_head *dst,
512*4882a593Smuzhiyun 		    struct nfs_commit_info *cinfo);
513*4882a593Smuzhiyun void nfs_mark_request_commit(struct nfs_page *req,
514*4882a593Smuzhiyun 			     struct pnfs_layout_segment *lseg,
515*4882a593Smuzhiyun 			     struct nfs_commit_info *cinfo,
516*4882a593Smuzhiyun 			     u32 ds_commit_idx);
517*4882a593Smuzhiyun int nfs_write_need_commit(struct nfs_pgio_header *);
518*4882a593Smuzhiyun void nfs_writeback_update_inode(struct nfs_pgio_header *hdr);
519*4882a593Smuzhiyun int nfs_generic_commit_list(struct inode *inode, struct list_head *head,
520*4882a593Smuzhiyun 			    int how, struct nfs_commit_info *cinfo);
521*4882a593Smuzhiyun void nfs_retry_commit(struct list_head *page_list,
522*4882a593Smuzhiyun 		      struct pnfs_layout_segment *lseg,
523*4882a593Smuzhiyun 		      struct nfs_commit_info *cinfo,
524*4882a593Smuzhiyun 		      u32 ds_commit_idx);
525*4882a593Smuzhiyun void nfs_commitdata_release(struct nfs_commit_data *data);
526*4882a593Smuzhiyun void nfs_request_add_commit_list(struct nfs_page *req,
527*4882a593Smuzhiyun 				 struct nfs_commit_info *cinfo);
528*4882a593Smuzhiyun void nfs_request_add_commit_list_locked(struct nfs_page *req,
529*4882a593Smuzhiyun 		struct list_head *dst,
530*4882a593Smuzhiyun 		struct nfs_commit_info *cinfo);
531*4882a593Smuzhiyun void nfs_request_remove_commit_list(struct nfs_page *req,
532*4882a593Smuzhiyun 				    struct nfs_commit_info *cinfo);
533*4882a593Smuzhiyun void nfs_init_cinfo(struct nfs_commit_info *cinfo,
534*4882a593Smuzhiyun 		    struct inode *inode,
535*4882a593Smuzhiyun 		    struct nfs_direct_req *dreq);
536*4882a593Smuzhiyun int nfs_key_timeout_notify(struct file *filp, struct inode *inode);
537*4882a593Smuzhiyun bool nfs_ctx_key_to_expire(struct nfs_open_context *ctx, struct inode *inode);
538*4882a593Smuzhiyun void nfs_pageio_stop_mirroring(struct nfs_pageio_descriptor *pgio);
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun int nfs_filemap_write_and_wait_range(struct address_space *mapping,
541*4882a593Smuzhiyun 		loff_t lstart, loff_t lend);
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun #ifdef CONFIG_NFS_V4_1
544*4882a593Smuzhiyun static inline void
pnfs_bucket_clear_pnfs_ds_commit_verifiers(struct pnfs_commit_bucket * buckets,unsigned int nbuckets)545*4882a593Smuzhiyun pnfs_bucket_clear_pnfs_ds_commit_verifiers(struct pnfs_commit_bucket *buckets,
546*4882a593Smuzhiyun 		unsigned int nbuckets)
547*4882a593Smuzhiyun {
548*4882a593Smuzhiyun 	unsigned int i;
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun 	for (i = 0; i < nbuckets; i++)
551*4882a593Smuzhiyun 		buckets[i].direct_verf.committed = NFS_INVALID_STABLE_HOW;
552*4882a593Smuzhiyun }
553*4882a593Smuzhiyun static inline
nfs_clear_pnfs_ds_commit_verifiers(struct pnfs_ds_commit_info * cinfo)554*4882a593Smuzhiyun void nfs_clear_pnfs_ds_commit_verifiers(struct pnfs_ds_commit_info *cinfo)
555*4882a593Smuzhiyun {
556*4882a593Smuzhiyun 	struct pnfs_commit_array *array;
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	rcu_read_lock();
559*4882a593Smuzhiyun 	list_for_each_entry_rcu(array, &cinfo->commits, cinfo_list)
560*4882a593Smuzhiyun 		pnfs_bucket_clear_pnfs_ds_commit_verifiers(array->buckets,
561*4882a593Smuzhiyun 				array->nbuckets);
562*4882a593Smuzhiyun 	rcu_read_unlock();
563*4882a593Smuzhiyun }
564*4882a593Smuzhiyun #else
565*4882a593Smuzhiyun static inline
nfs_clear_pnfs_ds_commit_verifiers(struct pnfs_ds_commit_info * cinfo)566*4882a593Smuzhiyun void nfs_clear_pnfs_ds_commit_verifiers(struct pnfs_ds_commit_info *cinfo)
567*4882a593Smuzhiyun {
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun #endif
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun #ifdef CONFIG_MIGRATION
572*4882a593Smuzhiyun extern int nfs_migrate_page(struct address_space *,
573*4882a593Smuzhiyun 		struct page *, struct page *, enum migrate_mode);
574*4882a593Smuzhiyun #endif
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun static inline int
nfs_write_verifier_cmp(const struct nfs_write_verifier * v1,const struct nfs_write_verifier * v2)577*4882a593Smuzhiyun nfs_write_verifier_cmp(const struct nfs_write_verifier *v1,
578*4882a593Smuzhiyun 		const struct nfs_write_verifier *v2)
579*4882a593Smuzhiyun {
580*4882a593Smuzhiyun 	return memcmp(v1->data, v2->data, sizeof(v1->data));
581*4882a593Smuzhiyun }
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun static inline bool
nfs_write_match_verf(const struct nfs_writeverf * verf,struct nfs_page * req)584*4882a593Smuzhiyun nfs_write_match_verf(const struct nfs_writeverf *verf,
585*4882a593Smuzhiyun 		struct nfs_page *req)
586*4882a593Smuzhiyun {
587*4882a593Smuzhiyun 	return verf->committed > NFS_UNSTABLE &&
588*4882a593Smuzhiyun 		!nfs_write_verifier_cmp(&req->wb_verf, &verf->verifier);
589*4882a593Smuzhiyun }
590*4882a593Smuzhiyun 
nfs_io_gfp_mask(void)591*4882a593Smuzhiyun static inline gfp_t nfs_io_gfp_mask(void)
592*4882a593Smuzhiyun {
593*4882a593Smuzhiyun 	if (current->flags & PF_WQ_WORKER)
594*4882a593Smuzhiyun 		return GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN;
595*4882a593Smuzhiyun 	return GFP_KERNEL;
596*4882a593Smuzhiyun }
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun /* unlink.c */
599*4882a593Smuzhiyun extern struct rpc_task *
600*4882a593Smuzhiyun nfs_async_rename(struct inode *old_dir, struct inode *new_dir,
601*4882a593Smuzhiyun 		 struct dentry *old_dentry, struct dentry *new_dentry,
602*4882a593Smuzhiyun 		 void (*complete)(struct rpc_task *, struct nfs_renamedata *));
603*4882a593Smuzhiyun extern int nfs_sillyrename(struct inode *dir, struct dentry *dentry);
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun /* direct.c */
606*4882a593Smuzhiyun void nfs_init_cinfo_from_dreq(struct nfs_commit_info *cinfo,
607*4882a593Smuzhiyun 			      struct nfs_direct_req *dreq);
608*4882a593Smuzhiyun extern ssize_t nfs_dreq_bytes_left(struct nfs_direct_req *dreq);
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun /* nfs4proc.c */
611*4882a593Smuzhiyun extern struct nfs_client *nfs4_init_client(struct nfs_client *clp,
612*4882a593Smuzhiyun 			    const struct nfs_client_initdata *);
613*4882a593Smuzhiyun extern int nfs40_walk_client_list(struct nfs_client *clp,
614*4882a593Smuzhiyun 				struct nfs_client **result,
615*4882a593Smuzhiyun 				const struct cred *cred);
616*4882a593Smuzhiyun extern int nfs41_walk_client_list(struct nfs_client *clp,
617*4882a593Smuzhiyun 				struct nfs_client **result,
618*4882a593Smuzhiyun 				const struct cred *cred);
619*4882a593Smuzhiyun extern void nfs4_test_session_trunk(struct rpc_clnt *clnt,
620*4882a593Smuzhiyun 				struct rpc_xprt *xprt,
621*4882a593Smuzhiyun 				void *data);
622*4882a593Smuzhiyun 
nfs_igrab_and_active(struct inode * inode)623*4882a593Smuzhiyun static inline struct inode *nfs_igrab_and_active(struct inode *inode)
624*4882a593Smuzhiyun {
625*4882a593Smuzhiyun 	struct super_block *sb = inode->i_sb;
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun 	if (sb && nfs_sb_active(sb)) {
628*4882a593Smuzhiyun 		if (igrab(inode))
629*4882a593Smuzhiyun 			return inode;
630*4882a593Smuzhiyun 		nfs_sb_deactive(sb);
631*4882a593Smuzhiyun 	}
632*4882a593Smuzhiyun 	return NULL;
633*4882a593Smuzhiyun }
634*4882a593Smuzhiyun 
nfs_iput_and_deactive(struct inode * inode)635*4882a593Smuzhiyun static inline void nfs_iput_and_deactive(struct inode *inode)
636*4882a593Smuzhiyun {
637*4882a593Smuzhiyun 	if (inode != NULL) {
638*4882a593Smuzhiyun 		struct super_block *sb = inode->i_sb;
639*4882a593Smuzhiyun 
640*4882a593Smuzhiyun 		iput(inode);
641*4882a593Smuzhiyun 		nfs_sb_deactive(sb);
642*4882a593Smuzhiyun 	}
643*4882a593Smuzhiyun }
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun /*
646*4882a593Smuzhiyun  * Determine the device name as a string
647*4882a593Smuzhiyun  */
nfs_devname(struct dentry * dentry,char * buffer,ssize_t buflen)648*4882a593Smuzhiyun static inline char *nfs_devname(struct dentry *dentry,
649*4882a593Smuzhiyun 				char *buffer, ssize_t buflen)
650*4882a593Smuzhiyun {
651*4882a593Smuzhiyun 	char *dummy;
652*4882a593Smuzhiyun 	return nfs_path(&dummy, dentry, buffer, buflen, NFS_PATH_CANONICAL);
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun /*
656*4882a593Smuzhiyun  * Determine the actual block size (and log2 thereof)
657*4882a593Smuzhiyun  */
658*4882a593Smuzhiyun static inline
nfs_block_bits(unsigned long bsize,unsigned char * nrbitsp)659*4882a593Smuzhiyun unsigned long nfs_block_bits(unsigned long bsize, unsigned char *nrbitsp)
660*4882a593Smuzhiyun {
661*4882a593Smuzhiyun 	/* make sure blocksize is a power of two */
662*4882a593Smuzhiyun 	if ((bsize & (bsize - 1)) || nrbitsp) {
663*4882a593Smuzhiyun 		unsigned char	nrbits;
664*4882a593Smuzhiyun 
665*4882a593Smuzhiyun 		for (nrbits = 31; nrbits && !(bsize & (1 << nrbits)); nrbits--)
666*4882a593Smuzhiyun 			;
667*4882a593Smuzhiyun 		bsize = 1 << nrbits;
668*4882a593Smuzhiyun 		if (nrbitsp)
669*4882a593Smuzhiyun 			*nrbitsp = nrbits;
670*4882a593Smuzhiyun 	}
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun 	return bsize;
673*4882a593Smuzhiyun }
674*4882a593Smuzhiyun 
675*4882a593Smuzhiyun /*
676*4882a593Smuzhiyun  * Calculate the number of 512byte blocks used.
677*4882a593Smuzhiyun  */
nfs_calc_block_size(u64 tsize)678*4882a593Smuzhiyun static inline blkcnt_t nfs_calc_block_size(u64 tsize)
679*4882a593Smuzhiyun {
680*4882a593Smuzhiyun 	blkcnt_t used = (tsize + 511) >> 9;
681*4882a593Smuzhiyun 	return (used > ULONG_MAX) ? ULONG_MAX : used;
682*4882a593Smuzhiyun }
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun /*
685*4882a593Smuzhiyun  * Compute and set NFS server blocksize
686*4882a593Smuzhiyun  */
687*4882a593Smuzhiyun static inline
nfs_block_size(unsigned long bsize,unsigned char * nrbitsp)688*4882a593Smuzhiyun unsigned long nfs_block_size(unsigned long bsize, unsigned char *nrbitsp)
689*4882a593Smuzhiyun {
690*4882a593Smuzhiyun 	if (bsize < NFS_MIN_FILE_IO_SIZE)
691*4882a593Smuzhiyun 		bsize = NFS_DEF_FILE_IO_SIZE;
692*4882a593Smuzhiyun 	else if (bsize >= NFS_MAX_FILE_IO_SIZE)
693*4882a593Smuzhiyun 		bsize = NFS_MAX_FILE_IO_SIZE;
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 	return nfs_block_bits(bsize, nrbitsp);
696*4882a593Smuzhiyun }
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun /*
699*4882a593Smuzhiyun  * Determine the maximum file size for a superblock
700*4882a593Smuzhiyun  */
701*4882a593Smuzhiyun static inline
nfs_super_set_maxbytes(struct super_block * sb,__u64 maxfilesize)702*4882a593Smuzhiyun void nfs_super_set_maxbytes(struct super_block *sb, __u64 maxfilesize)
703*4882a593Smuzhiyun {
704*4882a593Smuzhiyun 	sb->s_maxbytes = (loff_t)maxfilesize;
705*4882a593Smuzhiyun 	if (sb->s_maxbytes > MAX_LFS_FILESIZE || sb->s_maxbytes <= 0)
706*4882a593Smuzhiyun 		sb->s_maxbytes = MAX_LFS_FILESIZE;
707*4882a593Smuzhiyun }
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun /*
710*4882a593Smuzhiyun  * Record the page as unstable (an extra writeback period) and mark its
711*4882a593Smuzhiyun  * inode as dirty.
712*4882a593Smuzhiyun  */
713*4882a593Smuzhiyun static inline
nfs_mark_page_unstable(struct page * page,struct nfs_commit_info * cinfo)714*4882a593Smuzhiyun void nfs_mark_page_unstable(struct page *page, struct nfs_commit_info *cinfo)
715*4882a593Smuzhiyun {
716*4882a593Smuzhiyun 	if (!cinfo->dreq) {
717*4882a593Smuzhiyun 		struct inode *inode = page_file_mapping(page)->host;
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun 		/* This page is really still in write-back - just that the
720*4882a593Smuzhiyun 		 * writeback is happening on the server now.
721*4882a593Smuzhiyun 		 */
722*4882a593Smuzhiyun 		inc_node_page_state(page, NR_WRITEBACK);
723*4882a593Smuzhiyun 		inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
724*4882a593Smuzhiyun 		__mark_inode_dirty(inode, I_DIRTY_DATASYNC);
725*4882a593Smuzhiyun 	}
726*4882a593Smuzhiyun }
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun /*
729*4882a593Smuzhiyun  * Determine the number of bytes of data the page contains
730*4882a593Smuzhiyun  */
731*4882a593Smuzhiyun static inline
nfs_page_length(struct page * page)732*4882a593Smuzhiyun unsigned int nfs_page_length(struct page *page)
733*4882a593Smuzhiyun {
734*4882a593Smuzhiyun 	loff_t i_size = i_size_read(page_file_mapping(page)->host);
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 	if (i_size > 0) {
737*4882a593Smuzhiyun 		pgoff_t index = page_index(page);
738*4882a593Smuzhiyun 		pgoff_t end_index = (i_size - 1) >> PAGE_SHIFT;
739*4882a593Smuzhiyun 		if (index < end_index)
740*4882a593Smuzhiyun 			return PAGE_SIZE;
741*4882a593Smuzhiyun 		if (index == end_index)
742*4882a593Smuzhiyun 			return ((i_size - 1) & ~PAGE_MASK) + 1;
743*4882a593Smuzhiyun 	}
744*4882a593Smuzhiyun 	return 0;
745*4882a593Smuzhiyun }
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun /*
748*4882a593Smuzhiyun  * Convert a umode to a dirent->d_type
749*4882a593Smuzhiyun  */
750*4882a593Smuzhiyun static inline
nfs_umode_to_dtype(umode_t mode)751*4882a593Smuzhiyun unsigned char nfs_umode_to_dtype(umode_t mode)
752*4882a593Smuzhiyun {
753*4882a593Smuzhiyun 	return (mode >> 12) & 15;
754*4882a593Smuzhiyun }
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun /*
757*4882a593Smuzhiyun  * Determine the number of pages in an array of length 'len' and
758*4882a593Smuzhiyun  * with a base offset of 'base'
759*4882a593Smuzhiyun  */
760*4882a593Smuzhiyun static inline
nfs_page_array_len(unsigned int base,size_t len)761*4882a593Smuzhiyun unsigned int nfs_page_array_len(unsigned int base, size_t len)
762*4882a593Smuzhiyun {
763*4882a593Smuzhiyun 	return ((unsigned long)len + (unsigned long)base +
764*4882a593Smuzhiyun 		PAGE_SIZE - 1) >> PAGE_SHIFT;
765*4882a593Smuzhiyun }
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun /*
768*4882a593Smuzhiyun  * Convert a struct timespec64 into a 64-bit change attribute
769*4882a593Smuzhiyun  *
770*4882a593Smuzhiyun  * This does approximately the same thing as timespec64_to_ns(),
771*4882a593Smuzhiyun  * but for calculation efficiency, we multiply the seconds by
772*4882a593Smuzhiyun  * 1024*1024*1024.
773*4882a593Smuzhiyun  */
774*4882a593Smuzhiyun static inline
nfs_timespec_to_change_attr(const struct timespec64 * ts)775*4882a593Smuzhiyun u64 nfs_timespec_to_change_attr(const struct timespec64 *ts)
776*4882a593Smuzhiyun {
777*4882a593Smuzhiyun 	return ((u64)ts->tv_sec << 30) + ts->tv_nsec;
778*4882a593Smuzhiyun }
779*4882a593Smuzhiyun 
780*4882a593Smuzhiyun #ifdef CONFIG_CRC32
781*4882a593Smuzhiyun /**
782*4882a593Smuzhiyun  * nfs_fhandle_hash - calculate the crc32 hash for the filehandle
783*4882a593Smuzhiyun  * @fh - pointer to filehandle
784*4882a593Smuzhiyun  *
785*4882a593Smuzhiyun  * returns a crc32 hash for the filehandle that is compatible with
786*4882a593Smuzhiyun  * the one displayed by "wireshark".
787*4882a593Smuzhiyun  */
nfs_fhandle_hash(const struct nfs_fh * fh)788*4882a593Smuzhiyun static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh)
789*4882a593Smuzhiyun {
790*4882a593Smuzhiyun 	return ~crc32_le(0xFFFFFFFF, &fh->data[0], fh->size);
791*4882a593Smuzhiyun }
nfs_stateid_hash(const nfs4_stateid * stateid)792*4882a593Smuzhiyun static inline u32 nfs_stateid_hash(const nfs4_stateid *stateid)
793*4882a593Smuzhiyun {
794*4882a593Smuzhiyun 	return ~crc32_le(0xFFFFFFFF, &stateid->other[0],
795*4882a593Smuzhiyun 				NFS4_STATEID_OTHER_SIZE);
796*4882a593Smuzhiyun }
797*4882a593Smuzhiyun #else
nfs_fhandle_hash(const struct nfs_fh * fh)798*4882a593Smuzhiyun static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh)
799*4882a593Smuzhiyun {
800*4882a593Smuzhiyun 	return 0;
801*4882a593Smuzhiyun }
nfs_stateid_hash(nfs4_stateid * stateid)802*4882a593Smuzhiyun static inline u32 nfs_stateid_hash(nfs4_stateid *stateid)
803*4882a593Smuzhiyun {
804*4882a593Smuzhiyun 	return 0;
805*4882a593Smuzhiyun }
806*4882a593Smuzhiyun #endif
807*4882a593Smuzhiyun 
nfs_error_is_fatal(int err)808*4882a593Smuzhiyun static inline bool nfs_error_is_fatal(int err)
809*4882a593Smuzhiyun {
810*4882a593Smuzhiyun 	switch (err) {
811*4882a593Smuzhiyun 	case -ERESTARTSYS:
812*4882a593Smuzhiyun 	case -EINTR:
813*4882a593Smuzhiyun 	case -EACCES:
814*4882a593Smuzhiyun 	case -EDQUOT:
815*4882a593Smuzhiyun 	case -EFBIG:
816*4882a593Smuzhiyun 	case -EIO:
817*4882a593Smuzhiyun 	case -ENOSPC:
818*4882a593Smuzhiyun 	case -EROFS:
819*4882a593Smuzhiyun 	case -ESTALE:
820*4882a593Smuzhiyun 	case -E2BIG:
821*4882a593Smuzhiyun 	case -ENOMEM:
822*4882a593Smuzhiyun 	case -ETIMEDOUT:
823*4882a593Smuzhiyun 		return true;
824*4882a593Smuzhiyun 	default:
825*4882a593Smuzhiyun 		return false;
826*4882a593Smuzhiyun 	}
827*4882a593Smuzhiyun }
828*4882a593Smuzhiyun 
nfs_error_is_fatal_on_server(int err)829*4882a593Smuzhiyun static inline bool nfs_error_is_fatal_on_server(int err)
830*4882a593Smuzhiyun {
831*4882a593Smuzhiyun 	switch (err) {
832*4882a593Smuzhiyun 	case 0:
833*4882a593Smuzhiyun 	case -ERESTARTSYS:
834*4882a593Smuzhiyun 	case -EINTR:
835*4882a593Smuzhiyun 	case -ENOMEM:
836*4882a593Smuzhiyun 		return false;
837*4882a593Smuzhiyun 	}
838*4882a593Smuzhiyun 	return nfs_error_is_fatal(err);
839*4882a593Smuzhiyun }
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun /*
842*4882a593Smuzhiyun  * Select between a default port value and a user-specified port value.
843*4882a593Smuzhiyun  * If a zero value is set, then autobind will be used.
844*4882a593Smuzhiyun  */
nfs_set_port(struct sockaddr * sap,int * port,const unsigned short default_port)845*4882a593Smuzhiyun static inline void nfs_set_port(struct sockaddr *sap, int *port,
846*4882a593Smuzhiyun 				const unsigned short default_port)
847*4882a593Smuzhiyun {
848*4882a593Smuzhiyun 	if (*port == NFS_UNSPEC_PORT)
849*4882a593Smuzhiyun 		*port = default_port;
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun 	rpc_set_port(sap, *port);
852*4882a593Smuzhiyun }
853