| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | /* XDR types for nfsd. This is mainly a typing exercise. */ | 
 |  | 
 | #ifndef LINUX_NFSD_H | 
 | #define LINUX_NFSD_H | 
 |  | 
 | #include <linux/vfs.h> | 
 | #include "nfsd.h" | 
 | #include "nfsfh.h" | 
 |  | 
 | struct nfsd_fhandle { | 
 | 	struct svc_fh		fh; | 
 | }; | 
 |  | 
 | struct nfsd_sattrargs { | 
 | 	struct svc_fh		fh; | 
 | 	struct iattr		attrs; | 
 | }; | 
 |  | 
 | struct nfsd_diropargs { | 
 | 	struct svc_fh		fh; | 
 | 	char *			name; | 
 | 	unsigned int		len; | 
 | }; | 
 |  | 
 | struct nfsd_readargs { | 
 | 	struct svc_fh		fh; | 
 | 	__u32			offset; | 
 | 	__u32			count; | 
 | }; | 
 |  | 
 | struct nfsd_writeargs { | 
 | 	svc_fh			fh; | 
 | 	__u32			offset; | 
 | 	__u32			len; | 
 | 	struct xdr_buf		payload; | 
 | }; | 
 |  | 
 | struct nfsd_createargs { | 
 | 	struct svc_fh		fh; | 
 | 	char *			name; | 
 | 	unsigned int		len; | 
 | 	struct iattr		attrs; | 
 | }; | 
 |  | 
 | struct nfsd_renameargs { | 
 | 	struct svc_fh		ffh; | 
 | 	char *			fname; | 
 | 	unsigned int		flen; | 
 | 	struct svc_fh		tfh; | 
 | 	char *			tname; | 
 | 	unsigned int		tlen; | 
 | }; | 
 |  | 
 | struct nfsd_linkargs { | 
 | 	struct svc_fh		ffh; | 
 | 	struct svc_fh		tfh; | 
 | 	char *			tname; | 
 | 	unsigned int		tlen; | 
 | }; | 
 |  | 
 | struct nfsd_symlinkargs { | 
 | 	struct svc_fh		ffh; | 
 | 	char *			fname; | 
 | 	unsigned int		flen; | 
 | 	char *			tname; | 
 | 	unsigned int		tlen; | 
 | 	struct iattr		attrs; | 
 | 	struct kvec		first; | 
 | }; | 
 |  | 
 | struct nfsd_readdirargs { | 
 | 	struct svc_fh		fh; | 
 | 	__u32			cookie; | 
 | 	__u32			count; | 
 | }; | 
 |  | 
 | struct nfsd_stat { | 
 | 	__be32			status; | 
 | }; | 
 |  | 
 | struct nfsd_attrstat { | 
 | 	__be32			status; | 
 | 	struct svc_fh		fh; | 
 | 	struct kstat		stat; | 
 | }; | 
 |  | 
 | struct nfsd_diropres  { | 
 | 	__be32			status; | 
 | 	struct svc_fh		fh; | 
 | 	struct kstat		stat; | 
 | }; | 
 |  | 
 | struct nfsd_readlinkres { | 
 | 	__be32			status; | 
 | 	int			len; | 
 | 	struct page		*page; | 
 | }; | 
 |  | 
 | struct nfsd_readres { | 
 | 	__be32			status; | 
 | 	struct svc_fh		fh; | 
 | 	unsigned long		count; | 
 | 	struct kstat		stat; | 
 | 	struct page		**pages; | 
 | }; | 
 |  | 
 | struct nfsd_readdirres { | 
 | 	/* Components of the reply */ | 
 | 	__be32			status; | 
 |  | 
 | 	int			count; | 
 |  | 
 | 	/* Used to encode the reply's entry list */ | 
 | 	struct xdr_stream	xdr; | 
 | 	struct xdr_buf		dirlist; | 
 | 	struct readdir_cd	common; | 
 | 	unsigned int		cookie_offset; | 
 | }; | 
 |  | 
 | struct nfsd_statfsres { | 
 | 	__be32			status; | 
 | 	struct kstatfs		stats; | 
 | }; | 
 |  | 
 | /* | 
 |  * Storage requirements for XDR arguments and results. | 
 |  */ | 
 | union nfsd_xdrstore { | 
 | 	struct nfsd_sattrargs	sattr; | 
 | 	struct nfsd_diropargs	dirop; | 
 | 	struct nfsd_readargs	read; | 
 | 	struct nfsd_writeargs	write; | 
 | 	struct nfsd_createargs	create; | 
 | 	struct nfsd_renameargs	rename; | 
 | 	struct nfsd_linkargs	link; | 
 | 	struct nfsd_symlinkargs	symlink; | 
 | 	struct nfsd_readdirargs	readdir; | 
 | }; | 
 |  | 
 | #define NFS2_SVC_XDRSIZE	sizeof(union nfsd_xdrstore) | 
 |  | 
 |  | 
 | bool nfssvc_decode_fhandleargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_decode_sattrargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_decode_diropargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_decode_readargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_decode_writeargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_decode_createargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_decode_renameargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_decode_linkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_decode_symlinkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_decode_readdirargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 |  | 
 | bool nfssvc_encode_statres(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_encode_attrstatres(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_encode_diropres(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_encode_readlinkres(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_encode_readres(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_encode_statfsres(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 | bool nfssvc_encode_readdirres(struct svc_rqst *rqstp, struct xdr_stream *xdr); | 
 |  | 
 | void nfssvc_encode_nfscookie(struct nfsd_readdirres *resp, u32 offset); | 
 | int nfssvc_encode_entry(void *data, const char *name, int namlen, | 
 | 			loff_t offset, u64 ino, unsigned int d_type); | 
 |  | 
 | void nfssvc_release_attrstat(struct svc_rqst *rqstp); | 
 | void nfssvc_release_diropres(struct svc_rqst *rqstp); | 
 | void nfssvc_release_readres(struct svc_rqst *rqstp); | 
 |  | 
 | /* Helper functions for NFSv2 ACL code */ | 
 | bool svcxdr_decode_fhandle(struct xdr_stream *xdr, struct svc_fh *fhp); | 
 | bool svcxdr_encode_stat(struct xdr_stream *xdr, __be32 status); | 
 | bool svcxdr_encode_fattr(struct svc_rqst *rqstp, struct xdr_stream *xdr, | 
 | 			 const struct svc_fh *fhp, const struct kstat *stat); | 
 |  | 
 | #endif /* LINUX_NFSD_H */ |