xref: /openbmc/linux/fs/nfsd/xdr.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
27663dacdSJ. Bruce Fields /* XDR types for nfsd. This is mainly a typing exercise. */
39a74af21SBoaz Harrosh 
49a74af21SBoaz Harrosh #ifndef LINUX_NFSD_H
59a74af21SBoaz Harrosh #define LINUX_NFSD_H
69a74af21SBoaz Harrosh 
79a74af21SBoaz Harrosh #include <linux/vfs.h>
89a74af21SBoaz Harrosh #include "nfsd.h"
91557aca7SJ. Bruce Fields #include "nfsfh.h"
109a74af21SBoaz Harrosh 
119a74af21SBoaz Harrosh struct nfsd_fhandle {
129a74af21SBoaz Harrosh 	struct svc_fh		fh;
139a74af21SBoaz Harrosh };
149a74af21SBoaz Harrosh 
159a74af21SBoaz Harrosh struct nfsd_sattrargs {
169a74af21SBoaz Harrosh 	struct svc_fh		fh;
179a74af21SBoaz Harrosh 	struct iattr		attrs;
189a74af21SBoaz Harrosh };
199a74af21SBoaz Harrosh 
209a74af21SBoaz Harrosh struct nfsd_diropargs {
219a74af21SBoaz Harrosh 	struct svc_fh		fh;
229a74af21SBoaz Harrosh 	char *			name;
239a74af21SBoaz Harrosh 	unsigned int		len;
249a74af21SBoaz Harrosh };
259a74af21SBoaz Harrosh 
269a74af21SBoaz Harrosh struct nfsd_readargs {
279a74af21SBoaz Harrosh 	struct svc_fh		fh;
289a74af21SBoaz Harrosh 	__u32			offset;
299a74af21SBoaz Harrosh 	__u32			count;
309a74af21SBoaz Harrosh };
319a74af21SBoaz Harrosh 
329a74af21SBoaz Harrosh struct nfsd_writeargs {
339a74af21SBoaz Harrosh 	svc_fh			fh;
349a74af21SBoaz Harrosh 	__u32			offset;
35*184416d4SDan Carpenter 	__u32			len;
36dae9a6caSChuck Lever 	struct xdr_buf		payload;
379a74af21SBoaz Harrosh };
389a74af21SBoaz Harrosh 
399a74af21SBoaz Harrosh struct nfsd_createargs {
409a74af21SBoaz Harrosh 	struct svc_fh		fh;
419a74af21SBoaz Harrosh 	char *			name;
429a74af21SBoaz Harrosh 	unsigned int		len;
439a74af21SBoaz Harrosh 	struct iattr		attrs;
449a74af21SBoaz Harrosh };
459a74af21SBoaz Harrosh 
469a74af21SBoaz Harrosh struct nfsd_renameargs {
479a74af21SBoaz Harrosh 	struct svc_fh		ffh;
489a74af21SBoaz Harrosh 	char *			fname;
499a74af21SBoaz Harrosh 	unsigned int		flen;
509a74af21SBoaz Harrosh 	struct svc_fh		tfh;
519a74af21SBoaz Harrosh 	char *			tname;
529a74af21SBoaz Harrosh 	unsigned int		tlen;
539a74af21SBoaz Harrosh };
549a74af21SBoaz Harrosh 
559a74af21SBoaz Harrosh struct nfsd_linkargs {
569a74af21SBoaz Harrosh 	struct svc_fh		ffh;
579a74af21SBoaz Harrosh 	struct svc_fh		tfh;
589a74af21SBoaz Harrosh 	char *			tname;
599a74af21SBoaz Harrosh 	unsigned int		tlen;
609a74af21SBoaz Harrosh };
619a74af21SBoaz Harrosh 
629a74af21SBoaz Harrosh struct nfsd_symlinkargs {
639a74af21SBoaz Harrosh 	struct svc_fh		ffh;
649a74af21SBoaz Harrosh 	char *			fname;
659a74af21SBoaz Harrosh 	unsigned int		flen;
669a74af21SBoaz Harrosh 	char *			tname;
679a74af21SBoaz Harrosh 	unsigned int		tlen;
689a74af21SBoaz Harrosh 	struct iattr		attrs;
6938a70315SChuck Lever 	struct kvec		first;
709a74af21SBoaz Harrosh };
719a74af21SBoaz Harrosh 
729a74af21SBoaz Harrosh struct nfsd_readdirargs {
739a74af21SBoaz Harrosh 	struct svc_fh		fh;
749a74af21SBoaz Harrosh 	__u32			cookie;
759a74af21SBoaz Harrosh 	__u32			count;
769a74af21SBoaz Harrosh };
779a74af21SBoaz Harrosh 
78cc028a10SChuck Lever struct nfsd_stat {
79cc028a10SChuck Lever 	__be32			status;
80cc028a10SChuck Lever };
81cc028a10SChuck Lever 
829a74af21SBoaz Harrosh struct nfsd_attrstat {
83f0af2210SChuck Lever 	__be32			status;
849a74af21SBoaz Harrosh 	struct svc_fh		fh;
859a74af21SBoaz Harrosh 	struct kstat		stat;
869a74af21SBoaz Harrosh };
879a74af21SBoaz Harrosh 
889a74af21SBoaz Harrosh struct nfsd_diropres  {
89f0af2210SChuck Lever 	__be32			status;
909a74af21SBoaz Harrosh 	struct svc_fh		fh;
919a74af21SBoaz Harrosh 	struct kstat		stat;
929a74af21SBoaz Harrosh };
939a74af21SBoaz Harrosh 
949a74af21SBoaz Harrosh struct nfsd_readlinkres {
95f0af2210SChuck Lever 	__be32			status;
969a74af21SBoaz Harrosh 	int			len;
97d9014b0fSChuck Lever 	struct page		*page;
989a74af21SBoaz Harrosh };
999a74af21SBoaz Harrosh 
1009a74af21SBoaz Harrosh struct nfsd_readres {
101f0af2210SChuck Lever 	__be32			status;
1029a74af21SBoaz Harrosh 	struct svc_fh		fh;
1039a74af21SBoaz Harrosh 	unsigned long		count;
1049a74af21SBoaz Harrosh 	struct kstat		stat;
105a6f8d9dcSChuck Lever 	struct page		**pages;
1069a74af21SBoaz Harrosh };
1079a74af21SBoaz Harrosh 
1089a74af21SBoaz Harrosh struct nfsd_readdirres {
109f5dcccd6SChuck Lever 	/* Components of the reply */
110f0af2210SChuck Lever 	__be32			status;
111f0af2210SChuck Lever 
1129a74af21SBoaz Harrosh 	int			count;
1139a74af21SBoaz Harrosh 
114f5dcccd6SChuck Lever 	/* Used to encode the reply's entry list */
115f5dcccd6SChuck Lever 	struct xdr_stream	xdr;
116f5dcccd6SChuck Lever 	struct xdr_buf		dirlist;
1179a74af21SBoaz Harrosh 	struct readdir_cd	common;
118f5dcccd6SChuck Lever 	unsigned int		cookie_offset;
1199a74af21SBoaz Harrosh };
1209a74af21SBoaz Harrosh 
1219a74af21SBoaz Harrosh struct nfsd_statfsres {
122f0af2210SChuck Lever 	__be32			status;
1239a74af21SBoaz Harrosh 	struct kstatfs		stats;
1249a74af21SBoaz Harrosh };
1259a74af21SBoaz Harrosh 
1269a74af21SBoaz Harrosh /*
1279a74af21SBoaz Harrosh  * Storage requirements for XDR arguments and results.
1289a74af21SBoaz Harrosh  */
1299a74af21SBoaz Harrosh union nfsd_xdrstore {
1309a74af21SBoaz Harrosh 	struct nfsd_sattrargs	sattr;
1319a74af21SBoaz Harrosh 	struct nfsd_diropargs	dirop;
1329a74af21SBoaz Harrosh 	struct nfsd_readargs	read;
1339a74af21SBoaz Harrosh 	struct nfsd_writeargs	write;
1349a74af21SBoaz Harrosh 	struct nfsd_createargs	create;
1359a74af21SBoaz Harrosh 	struct nfsd_renameargs	rename;
1369a74af21SBoaz Harrosh 	struct nfsd_linkargs	link;
1379a74af21SBoaz Harrosh 	struct nfsd_symlinkargs	symlink;
1389a74af21SBoaz Harrosh 	struct nfsd_readdirargs	readdir;
1399a74af21SBoaz Harrosh };
1409a74af21SBoaz Harrosh 
1419a74af21SBoaz Harrosh #define NFS2_SVC_XDRSIZE	sizeof(union nfsd_xdrstore)
1429a74af21SBoaz Harrosh 
1439a74af21SBoaz Harrosh 
144c44b31c2SChuck Lever bool nfssvc_decode_fhandleargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
145c44b31c2SChuck Lever bool nfssvc_decode_sattrargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
146c44b31c2SChuck Lever bool nfssvc_decode_diropargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
147c44b31c2SChuck Lever bool nfssvc_decode_readargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
148c44b31c2SChuck Lever bool nfssvc_decode_writeargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
149c44b31c2SChuck Lever bool nfssvc_decode_createargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
150c44b31c2SChuck Lever bool nfssvc_decode_renameargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
151c44b31c2SChuck Lever bool nfssvc_decode_linkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
152c44b31c2SChuck Lever bool nfssvc_decode_symlinkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
153c44b31c2SChuck Lever bool nfssvc_decode_readdirargs(struct svc_rqst *rqstp, struct xdr_stream *xdr);
15416c66364SChuck Lever 
155130e2054SChuck Lever bool nfssvc_encode_statres(struct svc_rqst *rqstp, struct xdr_stream *xdr);
156130e2054SChuck Lever bool nfssvc_encode_attrstatres(struct svc_rqst *rqstp, struct xdr_stream *xdr);
157130e2054SChuck Lever bool nfssvc_encode_diropres(struct svc_rqst *rqstp, struct xdr_stream *xdr);
158130e2054SChuck Lever bool nfssvc_encode_readlinkres(struct svc_rqst *rqstp, struct xdr_stream *xdr);
159130e2054SChuck Lever bool nfssvc_encode_readres(struct svc_rqst *rqstp, struct xdr_stream *xdr);
160130e2054SChuck Lever bool nfssvc_encode_statfsres(struct svc_rqst *rqstp, struct xdr_stream *xdr);
161130e2054SChuck Lever bool nfssvc_encode_readdirres(struct svc_rqst *rqstp, struct xdr_stream *xdr);
1629a74af21SBoaz Harrosh 
163d5253200SChuck Lever void nfssvc_encode_nfscookie(struct nfsd_readdirres *resp, u32 offset);
1648a2cf9f5SChuck Lever int nfssvc_encode_entry(void *data, const char *name, int namlen,
165f5dcccd6SChuck Lever 			loff_t offset, u64 ino, unsigned int d_type);
1669a74af21SBoaz Harrosh 
1671841b9b6SChuck Lever void nfssvc_release_attrstat(struct svc_rqst *rqstp);
1681841b9b6SChuck Lever void nfssvc_release_diropres(struct svc_rqst *rqstp);
1691841b9b6SChuck Lever void nfssvc_release_readres(struct svc_rqst *rqstp);
1709a74af21SBoaz Harrosh 
1719a74af21SBoaz Harrosh /* Helper functions for NFSv2 ACL code */
172635a45d3SChuck Lever bool svcxdr_decode_fhandle(struct xdr_stream *xdr, struct svc_fh *fhp);
173f8cba473SChuck Lever bool svcxdr_encode_stat(struct xdr_stream *xdr, __be32 status);
174f8cba473SChuck Lever bool svcxdr_encode_fattr(struct svc_rqst *rqstp, struct xdr_stream *xdr,
175f8cba473SChuck Lever 			 const struct svc_fh *fhp, const struct kstat *stat);
1769a74af21SBoaz Harrosh 
1779a74af21SBoaz Harrosh #endif /* LINUX_NFSD_H */
178