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