File Index
Files and directories
Sign in
FILE

nfs_fs.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/nfs_fs.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 *  linux/include/linux/nfs_fs.h
  4 *
  5 *  Copyright (C) 1992  Rick Sladkey
  6 *
  7 *  OS-specific nfs filesystem definitions and declarations
  8 */
  9#ifndef _LINUX_NFS_FS_H
 10#define _LINUX_NFS_FS_H
 11
 12#include <uapi/linux/nfs_fs.h>
 13
 14
 15/*
 16 * Enable dprintk() debugging support for nfs client.
 17 */
 18#ifdef CONFIG_NFS_DEBUG
 19# define NFS_DEBUG
 20#endif
 21
 22#include <linux/in.h>
 23#include <linux/mm.h>
 24#include <linux/pagemap.h>
 25#include <linux/rbtree.h>
 26#include <linux/refcount.h>
 27#include <linux/rwsem.h>
 28#include <linux/wait.h>
 29
 30#include <linux/sunrpc/debug.h>
 31#include <linux/sunrpc/auth.h>
 32#include <linux/sunrpc/clnt.h>
 33
 34#ifdef CONFIG_NFS_FSCACHE
 35#include <linux/netfs.h>
 36#endif
 37
 38#include <linux/nfs.h>
 39#include <linux/nfs2.h>
 40#include <linux/nfs3.h>
 41#include <linux/nfs4.h>
 42#include <linux/nfs_xdr.h>
 43#include <linux/nfs_fs_sb.h>
 44
 45#include <linux/mempool.h>
 46
 47/*
 48 * These are the default for number of transports to different server IPs
 49 */
 50#define NFS_MAX_TRANSPORTS 16
 51
 52/*
 53 * Size of the NFS directory verifier
 54 */
 55#define NFS_DIR_VERIFIER_SIZE		2
 56
 57/*
 58 * NFSv3/v4 Access mode cache entry
 59 */
 60struct nfs_access_entry {
 61	struct rb_node		rb_node;
 62	struct list_head	lru;
 63	kuid_t			fsuid;
 64	kgid_t			fsgid;
 65	struct group_info	*group_info;
 66	u64			timestamp;
 67	__u32			mask;
 68	struct rcu_head		rcu_head;
 69};
 70
 71struct nfs_lock_context {
 72	refcount_t count;
 73	struct list_head list;
 74	struct nfs_open_context *open_context;
 75	fl_owner_t lockowner;
 76	atomic_t io_count;
 77	struct rcu_head	rcu_head;
 78};
 79
 80struct nfs_file_localio {
 81	struct nfsd_file __rcu *ro_file;
 82	struct nfsd_file __rcu *rw_file;
 83	struct list_head list;
 84	void __rcu *nfs_uuid; /* opaque pointer to 'nfs_uuid_t' */
 85};
 86
 87static inline void nfs_localio_file_init(struct nfs_file_localio *nfl)
 88{
 89#if IS_ENABLED(CONFIG_NFS_LOCALIO)
 90	nfl->ro_file = NULL;
 91	nfl->rw_file = NULL;
 92	INIT_LIST_HEAD(&nfl->list);
 93	nfl->nfs_uuid = NULL;
 94#endif
 95}
 96
 97struct nfs4_state;
 98struct nfs_open_context {
 99	struct nfs_lock_context lock_context;
100	fl_owner_t flock_owner;
101	struct dentry *dentry;
102	const struct cred *cred;
103	struct rpc_cred __rcu *ll_cred;	/* low-level cred - use to check for expiry */
104	struct nfs4_state *state;
105	fmode_t mode;
106
107	int error;
108	unsigned long flags;
109#define NFS_CONTEXT_BAD			(2)
110#define NFS_CONTEXT_UNLOCK	(3)
111#define NFS_CONTEXT_FILE_OPEN		(4)
112
113	struct nfs4_threshold	*mdsthreshold;
114	struct list_head list;
115	struct rcu_head	rcu_head;
116	struct nfs_file_localio nfl;
117};
118
119struct nfs_open_dir_context {
120	struct list_head list;
121	atomic_t cache_hits;
122	atomic_t cache_misses;
123	unsigned long attr_gencount;
124	__be32	verf[NFS_DIR_VERIFIER_SIZE];
125	__u64 dir_cookie;
126	__u64 last_cookie;
127	pgoff_t page_index;
128	unsigned int dtsize;
129	bool force_clear;
130	bool eof;
131	struct rcu_head rcu_head;
132};
133
134/*
135 * NFSv4 delegation
136 */
137struct nfs_delegation;
138
139struct posix_acl;
140
141struct nfs4_xattr_cache;
142
143/*
144 * nfs fs inode data in memory
145 */
146struct nfs_inode {
147	/*
148	 * The 64bit 'inode number'
149	 */
150	__u64 fileid;
151
152	/*
153	 * NFS file handle
154	 */
155	struct nfs_fh		fh;
156
157	/*
158	 * Various flags
159	 */
160	unsigned long		flags;			/* atomic bit ops */
161	unsigned long		cache_validity;		/* bit mask */
162
163	/*
164	 * NFS Attributes not included in struct inode
165	 */
166
167	struct timespec64	btime;
168
169	/*
170	 * read_cache_jiffies is when we started read-caching this inode.
171	 * attrtimeo is for how long the cached information is assumed
172	 * to be valid. A successful attribute revalidation doubles
173	 * attrtimeo (up to acregmax/acdirmax), a failure resets it to
174	 * acregmin/acdirmin.
175	 *
176	 * We need to revalidate the cached attrs for this inode if
177	 *
178	 *	jiffies - read_cache_jiffies >= attrtimeo
179	 *
180	 * Please note the comparison is greater than or equal
181	 * so that zero timeout values can be specified.
182	 */
183	unsigned long		read_cache_jiffies;
184	unsigned long		attrtimeo;
185	unsigned long		attrtimeo_timestamp;
186
187	unsigned long		attr_gencount;
188
189	struct rb_root		access_cache;
190	struct list_head	access_cache_entry_lru;
191	struct list_head	access_cache_inode_lru;
192
193	union {
194		/* Directory */
195		struct {
196			/* "Generation counter" for the attribute cache.
197			 * This is bumped whenever we update the metadata
198			 * on the server.
199			 */
200			unsigned long	cache_change_attribute;
201			/*
202			 * This is the cookie verifier used for NFSv3 readdir
203			 * operations
204			 */
205			__be32		cookieverf[NFS_DIR_VERIFIER_SIZE];
206			/* Readers: in-flight sillydelete RPC calls */
207			/* Writers: rmdir */
208			struct rw_semaphore	rmdir_sem;
209		};
210		/* Regular file */
211		struct {
212			atomic_long_t	nrequests;
213			atomic_long_t	redirtied_pages;
214			struct nfs_mds_commit_info commit_info;
215			struct mutex	commit_mutex;
216		};
217	};
218
219	/* Open contexts for shared mmap writes */
220	struct list_head	open_files;
221
222	/* Keep track of out-of-order replies.
223	 * The ooo array contains start/end pairs of
224	 * numbers from the changeid sequence when
225	 * the inode's iversion has been updated.
226	 * It also contains end/start pair (i.e. reverse order)
227	 * of sections of the changeid sequence that have
228	 * been seen in replies from the server.
229	 * Normally these should match and when both
230	 * A:B and B:A are found in ooo, they are both removed.
231	 * And if a reply with A:B causes an iversion update
232	 * of A:B, then neither are added.
233	 * When a reply has pre_change that doesn't match
234	 * iversion, then the changeid pair and any consequent
235	 * change in iversion ARE added.  Later replies
236	 * might fill in the gaps, or possibly a gap is caused
237	 * by a change from another client.
238	 * When a file or directory is opened, if the ooo table
239	 * is not empty, then we assume the gaps were due to
240	 * another client and we invalidate the cached data.
241	 *
242	 * We can only track a limited number of concurrent gaps.
243	 * Currently that limit is 16.
244	 * We allocate the table on demand.  If there is insufficient
245	 * memory, then we probably cannot cache the file anyway
246	 * so there is no loss.
247	 */
248	struct {
249		int cnt;
250		struct {
251			u64 start, end;
252		} gap[16];
253	} *ooo;
254
255#if IS_ENABLED(CONFIG_NFS_V4)
256	struct nfs4_cached_acl	*nfs4_acl;
257        /* NFSv4 state */
258	struct list_head	open_states;
259	struct nfs_delegation __rcu *delegation;
260	struct rw_semaphore	rwsem;
261
262	/* pNFS layout information */
263	struct pnfs_layout_hdr *layout;
264#endif /* CONFIG_NFS_V4*/
265	/* how many bytes have been written/read and how many bytes queued up */
266	__u64 write_io;
267	__u64 read_io;
268#ifdef CONFIG_NFS_V4_2
269	struct nfs4_xattr_cache *xattr_cache;
270#endif
271	union {
272		struct inode		vfs_inode;
273#ifdef CONFIG_NFS_FSCACHE
274		struct netfs_inode	netfs; /* netfs context and VFS inode */
275#endif
276	};
277};
278
279struct nfs4_copy_state {
280	struct list_head	copies;
281	struct list_head	src_copies;
282	nfs4_stateid		stateid;
283	struct completion	completion;
284	uint64_t		count;
285	struct nfs_writeverf	verf;
286	int			error;
287	int			flags;
288	struct nfs4_state	*parent_src_state;
289	struct nfs4_state	*parent_dst_state;
290};
291
292/*
293 * Access bit flags
294 */
295#define NFS_ACCESS_READ        0x0001
296#define NFS_ACCESS_LOOKUP      0x0002
297#define NFS_ACCESS_MODIFY      0x0004
298#define NFS_ACCESS_EXTEND      0x0008
299#define NFS_ACCESS_DELETE      0x0010
300#define NFS_ACCESS_EXECUTE     0x0020
301#define NFS_ACCESS_XAREAD      0x0040
302#define NFS_ACCESS_XAWRITE     0x0080
303#define NFS_ACCESS_XALIST      0x0100
304
305/*
306 * Cache validity bit flags
307 */
308#define NFS_INO_INVALID_DATA	BIT(1)		/* cached data is invalid */
309#define NFS_INO_INVALID_ATIME	BIT(2)		/* cached atime is invalid */
310#define NFS_INO_INVALID_ACCESS	BIT(3)		/* cached access cred invalid */
311#define NFS_INO_INVALID_ACL	BIT(4)		/* cached acls are invalid */
312#define NFS_INO_REVAL_FORCED	BIT(6)		/* force revalidation ignoring a delegation */
313#define NFS_INO_INVALID_LABEL	BIT(7)		/* cached label is invalid */
314#define NFS_INO_INVALID_CHANGE	BIT(8)		/* cached change is invalid */
315#define NFS_INO_INVALID_CTIME	BIT(9)		/* cached ctime is invalid */
316#define NFS_INO_INVALID_MTIME	BIT(10)		/* cached mtime is invalid */
317#define NFS_INO_INVALID_SIZE	BIT(11)		/* cached size is invalid */
318#define NFS_INO_INVALID_OTHER	BIT(12)		/* other attrs are invalid */
319#define NFS_INO_DATA_INVAL_DEFER	\
320				BIT(13)		/* Deferred cache invalidation */
321#define NFS_INO_INVALID_BLOCKS	BIT(14)         /* cached blocks are invalid */
322#define NFS_INO_INVALID_XATTR	BIT(15)		/* xattrs are invalid */
323#define NFS_INO_INVALID_NLINK	BIT(16)		/* cached nlinks is invalid */
324#define NFS_INO_INVALID_MODE	BIT(17)		/* cached mode is invalid */
325#define NFS_INO_INVALID_BTIME	BIT(18)		/* cached btime is invalid */
326
327#define NFS_INO_INVALID_ATTR	(NFS_INO_INVALID_CHANGE \
328		| NFS_INO_INVALID_CTIME \
329		| NFS_INO_INVALID_MTIME \
330		| NFS_INO_INVALID_BTIME \
331		| NFS_INO_INVALID_SIZE \
332		| NFS_INO_INVALID_NLINK \
333		| NFS_INO_INVALID_MODE \
334		| NFS_INO_INVALID_OTHER)	/* inode metadata is invalid */
335
336/*
337 * Bit offsets in flags field
338 */
339#define NFS_INO_STALE		(1)		/* possible stale inode */
340#define NFS_INO_ACL_LRU_SET	(2)		/* Inode is on the LRU list */
341#define NFS_INO_INVALIDATING	(3)		/* inode is being invalidated */
342#define NFS_INO_PRESERVE_UNLINKED (4)		/* preserve file if removed while open */
343#define NFS_INO_LAYOUTCOMMIT	(9)		/* layoutcommit required */
344#define NFS_INO_LAYOUTCOMMITTING (10)		/* layoutcommit inflight */
345#define NFS_INO_LAYOUTSTATS	(11)		/* layoutstats inflight */
346#define NFS_INO_ODIRECT		(12)		/* I/O setting is O_DIRECT */
347#define NFS_INO_REQ_DIR_DELEG	(13)		/* Request a directory delegation */
348
349static inline struct nfs_inode *NFS_I(const struct inode *inode)
350{
351	return container_of(inode, struct nfs_inode, vfs_inode);
352}
353
354static inline struct nfs_server *NFS_SB(const struct super_block *s)
355{
356	return (struct nfs_server *)(s->s_fs_info);
357}
358
359static inline struct nfs_fh *NFS_FH(const struct inode *inode)
360{
361	return &NFS_I(inode)->fh;
362}
363
364static inline struct nfs_server *NFS_SERVER(const struct inode *inode)
365{
366	return NFS_SB(inode->i_sb);
367}
368
369static inline struct rpc_clnt *NFS_CLIENT(const struct inode *inode)
370{
371	return NFS_SERVER(inode)->client;
372}
373
374static inline const struct nfs_rpc_ops *NFS_PROTO(const struct inode *inode)
375{
376	return NFS_SERVER(inode)->nfs_client->rpc_ops;
377}
378
379static inline unsigned NFS_MINATTRTIMEO(const struct inode *inode)
380{
381	struct nfs_server *nfss = NFS_SERVER(inode);
382	return S_ISDIR(inode->i_mode) ? nfss->acdirmin : nfss->acregmin;
383}
384
385static inline unsigned NFS_MAXATTRTIMEO(const struct inode *inode)
386{
387	struct nfs_server *nfss = NFS_SERVER(inode);
388	return S_ISDIR(inode->i_mode) ? nfss->acdirmax : nfss->acregmax;
389}
390
391static inline int NFS_STALE(const struct inode *inode)
392{
393	return test_bit(NFS_INO_STALE, &NFS_I(inode)->flags);
394}
395
396static inline __u64 NFS_FILEID(const struct inode *inode)
397{
398	return NFS_I(inode)->fileid;
399}
400
401static inline void set_nfs_fileid(struct inode *inode, __u64 fileid)
402{
403	NFS_I(inode)->fileid = fileid;
404}
405
406static inline void nfs_mark_for_revalidate(struct inode *inode)
407{
408	struct nfs_inode *nfsi = NFS_I(inode);
409
410	spin_lock(&inode->i_lock);
411	nfsi->cache_validity |= NFS_INO_INVALID_ACCESS | NFS_INO_INVALID_ACL |
412				NFS_INO_INVALID_CHANGE | NFS_INO_INVALID_CTIME |
413				NFS_INO_INVALID_SIZE;
414	if (S_ISDIR(inode->i_mode))
415		nfsi->cache_validity |= NFS_INO_INVALID_DATA;
416	spin_unlock(&inode->i_lock);
417}
418
419static inline int nfs_server_capable(const struct inode *inode, int cap)
420{
421	return NFS_SERVER(inode)->caps & cap;
422}
423
424/**
425 * nfs_save_change_attribute - Returns the inode attribute change cookie
426 * @dir - pointer to parent directory inode
427 * The "cache change attribute" is updated when we need to revalidate
428 * our dentry cache after a directory was seen to change on the server.
429 */
430static inline unsigned long nfs_save_change_attribute(struct inode *dir)
431{
432	return NFS_I(dir)->cache_change_attribute;
433}
434
435/*
436 * linux/fs/nfs/inode.c
437 */
438extern int nfs_sync_mapping(struct address_space *mapping);
439extern void nfs_zap_mapping(struct inode *inode, struct address_space *mapping);
440extern void nfs_zap_caches(struct inode *);
441extern void nfs_set_inode_stale(struct inode *inode);
442extern void nfs_invalidate_atime(struct inode *);
443extern struct inode *nfs_fhget(struct super_block *, struct nfs_fh *,
444				struct nfs_fattr *);
445struct inode *nfs_ilookup(struct super_block *sb, struct nfs_fattr *, struct nfs_fh *);
446extern int nfs_refresh_inode(struct inode *, struct nfs_fattr *);
447extern int nfs_post_op_update_inode(struct inode *inode, struct nfs_fattr *fattr);
448extern int nfs_post_op_update_inode_force_wcc(struct inode *inode, struct nfs_fattr *fattr);
449extern int nfs_post_op_update_inode_force_wcc_locked(struct inode *inode, struct nfs_fattr *fattr);
450extern int nfs_getattr(struct mnt_idmap *, const struct path *,
451		       struct kstat *, u32, unsigned int);
452extern void nfs_access_add_cache(struct inode *, struct nfs_access_entry *, const struct cred *);
453extern void nfs_access_set_mask(struct nfs_access_entry *, u32);
454extern int nfs_permission(struct mnt_idmap *, struct inode *, int);
455extern int nfs_open(struct inode *, struct file *);
456extern int nfs_attribute_cache_expired(struct inode *inode);
457extern int nfs_revalidate_inode(struct inode *inode, unsigned long flags);
458extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *);
459extern int nfs_clear_invalid_mapping(struct address_space *mapping);
460extern bool nfs_mapping_need_revalidate_inode(struct inode *inode);
461extern int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping);
462extern int nfs_revalidate_mapping_rcu(struct inode *inode);
463extern int nfs_setattr(struct mnt_idmap *, struct dentry *, struct iattr *);
464extern void nfs_setattr_update_inode(struct inode *inode, struct iattr *attr, struct nfs_fattr *);
465extern void nfs_setsecurity(struct inode *inode, struct nfs_fattr *fattr);
466extern struct nfs_open_context *get_nfs_open_context(struct nfs_open_context *ctx);
467extern void put_nfs_open_context(struct nfs_open_context *ctx);
468extern struct nfs_open_context *nfs_find_open_context(struct inode *inode, const struct cred *cred, fmode_t mode);
469extern struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, fmode_t f_mode, struct file *filp);
470extern void nfs_inode_attach_open_context(struct nfs_open_context *ctx);
471extern void nfs_file_set_open_context(struct file *filp, struct nfs_open_context *ctx);
472extern void nfs_file_clear_open_context(struct file *flip);
473extern struct nfs_lock_context *nfs_get_lock_context(struct nfs_open_context *ctx);
474extern void nfs_put_lock_context(struct nfs_lock_context *l_ctx);
475extern u64 nfs_compat_user_ino64(u64 fileid);
476extern void nfs_fattr_init(struct nfs_fattr *fattr);
477extern void nfs_fattr_set_barrier(struct nfs_fattr *fattr);
478extern unsigned long nfs_inc_attr_generation_counter(void);
479
480extern struct nfs_fattr *nfs_alloc_fattr(void);
481extern struct nfs_fattr *nfs_alloc_fattr_with_label(struct nfs_server *server);
482
483static inline void nfs4_label_free(struct nfs4_label *label)
484{
485#ifdef CONFIG_NFS_V4_SECURITY_LABEL
486	if (label) {
487		kfree(label->label);
488		kfree(label);
489	}
490#endif
491}
492
493static inline void nfs_free_fattr(const struct nfs_fattr *fattr)
494{
495	if (fattr)
496		nfs4_label_free(fattr->label);
497	kfree(fattr);
498}
499
500extern struct nfs_fh *nfs_alloc_fhandle(void);
501
502static inline void nfs_free_fhandle(const struct nfs_fh *fh)
503{
504	kfree(fh);
505}
506
507#ifdef NFS_DEBUG
508extern u32 _nfs_display_fhandle_hash(const struct nfs_fh *fh);
509static inline u32 nfs_display_fhandle_hash(const struct nfs_fh *fh)
510{
511	return _nfs_display_fhandle_hash(fh);
512}
513extern void _nfs_display_fhandle(const struct nfs_fh *fh, const char *caption);
514#define nfs_display_fhandle(fh, caption)			\
515	do {							\
516		if (unlikely(nfs_debug & NFSDBG_FACILITY))	\
517			_nfs_display_fhandle(fh, caption);	\
518	} while (0)
519#else
520static inline u32 nfs_display_fhandle_hash(const struct nfs_fh *fh)
521{
522	return 0;
523}
524static inline void nfs_display_fhandle(const struct nfs_fh *fh,
525				       const char *caption)
526{
527}
528#endif
529
530/*
531 * linux/fs/nfs/nfsroot.c
532 */
533extern int  nfs_root_data(char **root_device, char **root_data); /*__init*/
534/* linux/net/ipv4/ipconfig.c: trims ip addr off front of name, too. */
535extern __be32 root_nfs_parse_addr(char *name); /*__init*/
536
537/*
538 * linux/fs/nfs/file.c
539 */
540extern const struct file_operations nfs_file_operations;
541#if IS_ENABLED(CONFIG_NFS_V4)
542extern const struct file_operations nfs4_file_operations;
543#endif /* CONFIG_NFS_V4 */
544extern const struct address_space_operations nfs_file_aops;
545extern const struct address_space_operations nfs_dir_aops;
546
547static inline struct nfs_open_context *nfs_file_open_context(struct file *filp)
548{
549	return filp->private_data;
550}
551
552static inline const struct cred *nfs_file_cred(struct file *file)
553{
554	if (file != NULL) {
555		struct nfs_open_context *ctx =
556			nfs_file_open_context(file);
557		if (ctx)
558			return ctx->cred;
559	}
560	return NULL;
561}
562
563/*
564 * linux/fs/nfs/direct.c
565 */
566int nfs_swap_rw(struct kiocb *iocb, struct iov_iter *iter);
567ssize_t nfs_file_direct_read(struct kiocb *iocb,
568			     struct iov_iter *iter, bool swap);
569ssize_t nfs_file_direct_write(struct kiocb *iocb,
570			      struct iov_iter *iter, bool swap);
571
572/*
573 * linux/fs/nfs/dir.c
574 */
575extern const struct file_operations nfs_dir_operations;
576extern const struct dentry_operations nfs_dentry_operations;
577
578extern void nfs_force_lookup_revalidate(struct inode *dir);
579extern void nfs_set_verifier(struct dentry * dentry, unsigned long verf);
580#if IS_ENABLED(CONFIG_NFS_V4)
581extern void nfs_clear_verifier_delegated(struct inode *inode);
582#endif /* IS_ENABLED(CONFIG_NFS_V4) */
583extern struct dentry *nfs_add_or_obtain(struct dentry *dentry,
584			struct nfs_fh *fh, struct nfs_fattr *fattr);
585extern int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fh,
586			struct nfs_fattr *fattr);
587extern int nfs_may_open(struct inode *inode, const struct cred *cred, int openflags);
588extern void nfs_access_zap_cache(struct inode *inode);
589extern int nfs_access_get_cached(struct inode *inode, const struct cred *cred,
590				 u32 *mask, bool may_block);
591extern int nfs_atomic_open_v23(struct inode *dir, struct dentry *dentry,
592			       struct file *file, unsigned int open_flags,
593			       umode_t mode);
594
595/*
596 * linux/fs/nfs/symlink.c
597 */
598extern const struct inode_operations nfs_symlink_inode_operations;
599
600/*
601 * linux/fs/nfs/sysctl.c
602 */
603#ifdef CONFIG_SYSCTL
604extern int nfs_register_sysctl(void);
605extern void nfs_unregister_sysctl(void);
606#else
607#define nfs_register_sysctl() 0
608#define nfs_unregister_sysctl() do { } while(0)
609#endif
610
611/*
612 * linux/fs/nfs/namespace.c
613 */
614extern const struct inode_operations nfs_mountpoint_inode_operations;
615extern const struct inode_operations nfs_referral_inode_operations;
616extern int nfs_mountpoint_expiry_timeout;
617extern void nfs_release_automount_timer(void);
618
619/*
620 * linux/fs/nfs/unlink.c
621 */
622extern void nfs_complete_unlink(struct dentry *dentry, struct inode *);
623
624/*
625 * linux/fs/nfs/write.c
626 */
627extern int  nfs_congestion_kb;
628extern int  nfs_writepages(struct address_space *, struct writeback_control *);
629extern int  nfs_flush_incompatible(struct file *file, struct folio *folio);
630extern int  nfs_update_folio(struct file *file, struct folio *folio,
631			     unsigned int offset, unsigned int count);
632
633/*
634 * Try to write back everything synchronously (but check the
635 * return value!)
636 */
637extern int nfs_sync_inode(struct inode *inode);
638extern int nfs_wb_all(struct inode *inode);
639extern int nfs_wb_folio(struct inode *inode, struct folio *folio);
640extern int nfs_wb_folio_reclaim(struct inode *inode, struct folio *folio);
641int nfs_wb_folio_cancel(struct inode *inode, struct folio *folio);
642extern int  nfs_commit_inode(struct inode *, int);
643extern struct nfs_commit_data *nfs_commitdata_alloc(void);
644extern void nfs_commit_free(struct nfs_commit_data *data);
645void nfs_commit_begin(struct nfs_mds_commit_info *cinfo);
646bool nfs_commit_end(struct nfs_mds_commit_info *cinfo);
647
648static inline bool nfs_have_writebacks(const struct inode *inode)
649{
650	if (S_ISREG(inode->i_mode))
651		return atomic_long_read(&NFS_I(inode)->nrequests) != 0;
652	return false;
653}
654
655/*
656 * linux/fs/nfs/read.c
657 */
658int  nfs_read_folio(struct file *, struct folio *);
659void nfs_readahead(struct readahead_control *);
660
661/*
662 * inline functions
663 */
664
665static inline loff_t nfs_size_to_loff_t(__u64 size)
666{
667	return min_t(u64, size, OFFSET_MAX);
668}
669
670static inline ino_t
671nfs_fileid_to_ino_t(u64 fileid)
672{
673	ino_t ino = (ino_t) fileid;
674	if (sizeof(ino_t) < sizeof(u64))
675		ino ^= fileid >> (sizeof(u64)-sizeof(ino_t)) * 8;
676	return ino;
677}
678
679static inline void nfs_ooo_clear(struct nfs_inode *nfsi)
680{
681	nfsi->cache_validity &= ~NFS_INO_DATA_INVAL_DEFER;
682	kfree(nfsi->ooo);
683	nfsi->ooo = NULL;
684}
685
686static inline bool nfs_ooo_test(struct nfs_inode *nfsi)
687{
688	return (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER) ||
689		(nfsi->ooo && nfsi->ooo->cnt > 0);
690
691}
692
693#define NFS_JUKEBOX_RETRY_TIME (5 * HZ)
694
695/* We need to block new opens while a file is being unlinked.
696 * If it is opened *before* we decide to unlink, we will silly-rename
697 * instead. If it is opened *after*, then we need to create or will fail.
698 * If we allow the two to race, we could end up with a file that is open
699 * but deleted on the server resulting in ESTALE.
700 * So use ->d_fsdata to record when the unlink is happening
701 * and block dentry revalidation while it is set.
702 */
703#define NFS_FSDATA_BLOCKED ((void*)1)
704
705# undef ifdebug
706# ifdef NFS_DEBUG
707#  define ifdebug(fac)		if (unlikely(nfs_debug & NFSDBG_##fac))
708#  define NFS_IFDEBUG(x)	x
709# else
710#  define ifdebug(fac)		if (0)
711#  define NFS_IFDEBUG(x)
712# endif
713#endif
~/ Read-only file preview.