diff options
Diffstat (limited to 'fs/nfs/internal.h')
| -rw-r--r-- | fs/nfs/internal.h | 143 | 
1 files changed, 78 insertions, 65 deletions
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 24a65da58aa9..f80c47d5ff27 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -4,17 +4,19 @@   */  #include "nfs4_fs.h" -#include <linux/mount.h> +#include <linux/fs_context.h>  #include <linux/security.h>  #include <linux/crc32.h> +#include <linux/sunrpc/addr.h>  #include <linux/nfs_page.h>  #include <linux/wait_bit.h> -#define NFS_MS_MASK (SB_RDONLY|SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS) +#define NFS_SB_MASK (SB_RDONLY|SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS)  extern const struct export_operations nfs_export_ops;  struct nfs_string; +struct nfs_pageio_descriptor;  static inline void nfs_attr_check_mountpoint(struct super_block *parent, struct nfs_fattr *fattr)  { @@ -31,17 +33,14 @@ static inline int nfs_attr_use_mounted_on_fileid(struct nfs_fattr *fattr)  	return 1;  } -struct nfs_clone_mount { -	const struct super_block *sb; -	const struct dentry *dentry; -	struct nfs_fh *fh; -	struct nfs_fattr *fattr; -	char *hostname; -	char *mnt_path; -	struct sockaddr *addr; -	size_t addrlen; -	rpc_authflavor_t authflavor; -}; +static inline bool nfs_lookup_is_soft_revalidate(const struct dentry *dentry) +{ +	if (!(NFS_SB(dentry->d_sb)->flags & NFS_MOUNT_SOFTREVAL)) +		return false; +	if (!d_is_positive(dentry) || !NFS_FH(d_inode(dentry))->size) +		return false; +	return true; +}  /*   * Note: RFC 1813 doesn't limit the number of auth flavors that @@ -82,12 +81,16 @@ struct nfs_client_initdata {  /*   * In-kernel mount arguments   */ -struct nfs_parsed_mount_data { -	int			flags; +struct nfs_fs_context { +	bool			internal; +	bool			skip_reconfig_option_check; +	bool			need_mount; +	bool			sloppy; +	unsigned int		flags;		/* NFS{,4}_MOUNT_* flags */  	unsigned int		rsize, wsize;  	unsigned int		timeo, retrans; -	unsigned int		acregmin, acregmax, -				acdirmin, acdirmax; +	unsigned int		acregmin, acregmax; +	unsigned int		acdirmin, acdirmax;  	unsigned int		namlen;  	unsigned int		options;  	unsigned int		bsize; @@ -97,10 +100,14 @@ struct nfs_parsed_mount_data {  	unsigned int		version;  	unsigned int		minorversion;  	char			*fscache_uniq; -	bool			need_mount; +	unsigned short		protofamily; +	unsigned short		mountfamily;  	struct { -		struct sockaddr_storage	address; +		union { +			struct sockaddr	address; +			struct sockaddr_storage	_address; +		};  		size_t			addrlen;  		char			*hostname;  		u32			version; @@ -109,19 +116,41 @@ struct nfs_parsed_mount_data {  	} mount_server;  	struct { -		struct sockaddr_storage	address; +		union { +			struct sockaddr	address; +			struct sockaddr_storage	_address; +		};  		size_t			addrlen;  		char			*hostname;  		char			*export_path;  		int			port;  		unsigned short		protocol;  		unsigned short		nconnect; +		unsigned short		export_path_len;  	} nfs_server; -	void			*lsm_opts; -	struct net		*net; +	struct nfs_fh		*mntfh; +	struct nfs_server	*server; +	struct nfs_subversion	*nfs_mod; + +	/* Information for a cloned mount. */ +	struct nfs_clone_mount { +		struct super_block	*sb; +		struct dentry		*dentry; +		struct nfs_fattr	*fattr; +		unsigned int		inherited_bsize; +	} clone_data;  }; +#define nfs_errorf(fc, fmt, ...) errorf(fc, fmt, ## __VA_ARGS__) +#define nfs_invalf(fc, fmt, ...) invalf(fc, fmt, ## __VA_ARGS__) +#define nfs_warnf(fc, fmt, ...) warnf(fc, fmt, ## __VA_ARGS__) + +static inline struct nfs_fs_context *nfs_fc2context(const struct fs_context *fc) +{ +	return fc->fs_private; +} +  /* mount_clnt.c */  struct nfs_mount_request {  	struct sockaddr		*sap; @@ -137,14 +166,6 @@ struct nfs_mount_request {  	struct net		*net;  }; -struct nfs_mount_info { -	void (*fill_super)(struct super_block *, struct nfs_mount_info *); -	int (*set_security)(struct super_block *, struct dentry *, struct nfs_mount_info *); -	struct nfs_parsed_mount_data *parsed; -	struct nfs_clone_mount *cloned; -	struct nfs_fh *mntfh; -}; -  extern int nfs_mount(struct nfs_mount_request *info);  extern void nfs_umount(const struct nfs_mount_request *info); @@ -170,13 +191,9 @@ extern struct nfs_client *nfs4_find_client_ident(struct net *, int);  extern struct nfs_client *  nfs4_find_client_sessionid(struct net *, const struct sockaddr *,  				struct nfs4_sessionid *, u32); -extern struct nfs_server *nfs_create_server(struct nfs_mount_info *, -					struct nfs_subversion *); -extern struct nfs_server *nfs4_create_server( -					struct nfs_mount_info *, -					struct nfs_subversion *); -extern struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *, -						      struct nfs_fh *); +extern struct nfs_server *nfs_create_server(struct fs_context *); +extern struct nfs_server *nfs4_create_server(struct fs_context *); +extern struct nfs_server *nfs4_create_referral_server(struct fs_context *);  extern int nfs4_update_server(struct nfs_server *server, const char *hostname,  					struct sockaddr *sap, size_t salen,  					struct net *net); @@ -227,7 +244,9 @@ static inline void nfs_fs_proc_exit(void)  extern const struct svc_version nfs4_callback_version1;  extern const struct svc_version nfs4_callback_version4; -struct nfs_pageio_descriptor; +/* fs_context.c */ +extern struct file_system_type nfs_fs_type; +  /* pagelist.c */  extern int __init nfs_init_nfspagecache(void);  extern void nfs_destroy_nfspagecache(void); @@ -387,23 +406,10 @@ extern int nfs_wait_atomic_killable(atomic_t *p, unsigned int mode);  /* super.c */  extern const struct super_operations nfs_sops; -extern struct file_system_type nfs_fs_type; -extern struct file_system_type nfs_xdev_fs_type; -#if IS_ENABLED(CONFIG_NFS_V4) -extern struct file_system_type nfs4_referral_fs_type; -#endif  bool nfs_auth_info_match(const struct nfs_auth_info *, rpc_authflavor_t); -struct dentry *nfs_try_mount(int, const char *, struct nfs_mount_info *, -			struct nfs_subversion *); -int nfs_set_sb_security(struct super_block *, struct dentry *, struct nfs_mount_info *); -int nfs_clone_sb_security(struct super_block *, struct dentry *, struct nfs_mount_info *); -struct dentry *nfs_fs_mount_common(struct nfs_server *, int, const char *, -				   struct nfs_mount_info *, struct nfs_subversion *); -struct dentry *nfs_fs_mount(struct file_system_type *, int, const char *, void *); -struct dentry * nfs_xdev_mount_common(struct file_system_type *, int, -		const char *, struct nfs_mount_info *); +int nfs_try_get_tree(struct fs_context *); +int nfs_get_tree_common(struct fs_context *);  void nfs_kill_super(struct super_block *); -void nfs_fill_super(struct super_block *, struct nfs_mount_info *);  extern struct rpc_stat nfs_rpcstat; @@ -430,18 +436,12 @@ static inline bool nfs_file_io_is_buffered(struct nfs_inode *nfsi)  extern char *nfs_path(char **p, struct dentry *dentry,  		      char *buffer, ssize_t buflen, unsigned flags);  extern struct vfsmount *nfs_d_automount(struct path *path); -struct vfsmount *nfs_submount(struct nfs_server *, struct dentry *, -			      struct nfs_fh *, struct nfs_fattr *); -struct vfsmount *nfs_do_submount(struct dentry *, struct nfs_fh *, -				 struct nfs_fattr *, rpc_authflavor_t); +int nfs_submount(struct fs_context *, struct nfs_server *); +int nfs_do_submount(struct fs_context *);  /* getroot.c */ -extern struct dentry *nfs_get_root(struct super_block *, struct nfs_fh *, -				   const char *); +extern int nfs_get_root(struct super_block *s, struct fs_context *fc);  #if IS_ENABLED(CONFIG_NFS_V4) -extern struct dentry *nfs4_get_root(struct super_block *, struct nfs_fh *, -				    const char *); -  extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool);  #endif @@ -460,7 +460,7 @@ int  nfs_show_options(struct seq_file *, struct dentry *);  int  nfs_show_devname(struct seq_file *, struct dentry *);  int  nfs_show_path(struct seq_file *, struct dentry *);  int  nfs_show_stats(struct seq_file *, struct dentry *); -int nfs_remount(struct super_block *sb, int *flags, char *raw_data); +int  nfs_reconfigure(struct fs_context *);  /* write.c */  extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio, @@ -706,9 +706,9 @@ unsigned int nfs_page_array_len(unsigned int base, size_t len)  }  /* - * Convert a struct timespec into a 64-bit change attribute + * Convert a struct timespec64 into a 64-bit change attribute   * - * This does approximately the same thing as timespec_to_ns(), + * This does approximately the same thing as timespec64_to_ns(),   * but for calculation efficiency, we multiply the seconds by   * 1024*1024*1024.   */ @@ -777,3 +777,16 @@ static inline bool nfs_error_is_fatal_on_server(int err)  	}  	return nfs_error_is_fatal(err);  } + +/* + * Select between a default port value and a user-specified port value. + * If a zero value is set, then autobind will be used. + */ +static inline void nfs_set_port(struct sockaddr *sap, int *port, +				const unsigned short default_port) +{ +	if (*port == NFS_UNSPEC_PORT) +		*port = default_port; + +	rpc_set_port(sap, *port); +}  |