162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * XDR types for NFSv3 in nfsd. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1996-1998, Olaf Kirch <okir@monad.swb.de> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _LINUX_NFSD_XDR3_H 962306a36Sopenharmony_ci#define _LINUX_NFSD_XDR3_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "xdr.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistruct nfsd3_sattrargs { 1462306a36Sopenharmony_ci struct svc_fh fh; 1562306a36Sopenharmony_ci struct iattr attrs; 1662306a36Sopenharmony_ci int check_guard; 1762306a36Sopenharmony_ci time64_t guardtime; 1862306a36Sopenharmony_ci}; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistruct nfsd3_diropargs { 2162306a36Sopenharmony_ci struct svc_fh fh; 2262306a36Sopenharmony_ci char * name; 2362306a36Sopenharmony_ci unsigned int len; 2462306a36Sopenharmony_ci}; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistruct nfsd3_accessargs { 2762306a36Sopenharmony_ci struct svc_fh fh; 2862306a36Sopenharmony_ci __u32 access; 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistruct nfsd3_readargs { 3262306a36Sopenharmony_ci struct svc_fh fh; 3362306a36Sopenharmony_ci __u64 offset; 3462306a36Sopenharmony_ci __u32 count; 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistruct nfsd3_writeargs { 3862306a36Sopenharmony_ci svc_fh fh; 3962306a36Sopenharmony_ci __u64 offset; 4062306a36Sopenharmony_ci __u32 count; 4162306a36Sopenharmony_ci int stable; 4262306a36Sopenharmony_ci __u32 len; 4362306a36Sopenharmony_ci struct xdr_buf payload; 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistruct nfsd3_createargs { 4762306a36Sopenharmony_ci struct svc_fh fh; 4862306a36Sopenharmony_ci char * name; 4962306a36Sopenharmony_ci unsigned int len; 5062306a36Sopenharmony_ci int createmode; 5162306a36Sopenharmony_ci struct iattr attrs; 5262306a36Sopenharmony_ci __be32 * verf; 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistruct nfsd3_mknodargs { 5662306a36Sopenharmony_ci struct svc_fh fh; 5762306a36Sopenharmony_ci char * name; 5862306a36Sopenharmony_ci unsigned int len; 5962306a36Sopenharmony_ci __u32 ftype; 6062306a36Sopenharmony_ci __u32 major, minor; 6162306a36Sopenharmony_ci struct iattr attrs; 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistruct nfsd3_renameargs { 6562306a36Sopenharmony_ci struct svc_fh ffh; 6662306a36Sopenharmony_ci char * fname; 6762306a36Sopenharmony_ci unsigned int flen; 6862306a36Sopenharmony_ci struct svc_fh tfh; 6962306a36Sopenharmony_ci char * tname; 7062306a36Sopenharmony_ci unsigned int tlen; 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistruct nfsd3_linkargs { 7462306a36Sopenharmony_ci struct svc_fh ffh; 7562306a36Sopenharmony_ci struct svc_fh tfh; 7662306a36Sopenharmony_ci char * tname; 7762306a36Sopenharmony_ci unsigned int tlen; 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cistruct nfsd3_symlinkargs { 8162306a36Sopenharmony_ci struct svc_fh ffh; 8262306a36Sopenharmony_ci char * fname; 8362306a36Sopenharmony_ci unsigned int flen; 8462306a36Sopenharmony_ci char * tname; 8562306a36Sopenharmony_ci unsigned int tlen; 8662306a36Sopenharmony_ci struct iattr attrs; 8762306a36Sopenharmony_ci struct kvec first; 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistruct nfsd3_readdirargs { 9162306a36Sopenharmony_ci struct svc_fh fh; 9262306a36Sopenharmony_ci __u64 cookie; 9362306a36Sopenharmony_ci __u32 count; 9462306a36Sopenharmony_ci __be32 * verf; 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistruct nfsd3_commitargs { 9862306a36Sopenharmony_ci struct svc_fh fh; 9962306a36Sopenharmony_ci __u64 offset; 10062306a36Sopenharmony_ci __u32 count; 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistruct nfsd3_getaclargs { 10462306a36Sopenharmony_ci struct svc_fh fh; 10562306a36Sopenharmony_ci __u32 mask; 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistruct posix_acl; 10962306a36Sopenharmony_cistruct nfsd3_setaclargs { 11062306a36Sopenharmony_ci struct svc_fh fh; 11162306a36Sopenharmony_ci __u32 mask; 11262306a36Sopenharmony_ci struct posix_acl *acl_access; 11362306a36Sopenharmony_ci struct posix_acl *acl_default; 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistruct nfsd3_attrstat { 11762306a36Sopenharmony_ci __be32 status; 11862306a36Sopenharmony_ci struct svc_fh fh; 11962306a36Sopenharmony_ci struct kstat stat; 12062306a36Sopenharmony_ci}; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci/* LOOKUP, CREATE, MKDIR, SYMLINK, MKNOD */ 12362306a36Sopenharmony_cistruct nfsd3_diropres { 12462306a36Sopenharmony_ci __be32 status; 12562306a36Sopenharmony_ci struct svc_fh dirfh; 12662306a36Sopenharmony_ci struct svc_fh fh; 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cistruct nfsd3_accessres { 13062306a36Sopenharmony_ci __be32 status; 13162306a36Sopenharmony_ci struct svc_fh fh; 13262306a36Sopenharmony_ci __u32 access; 13362306a36Sopenharmony_ci struct kstat stat; 13462306a36Sopenharmony_ci}; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistruct nfsd3_readlinkres { 13762306a36Sopenharmony_ci __be32 status; 13862306a36Sopenharmony_ci struct svc_fh fh; 13962306a36Sopenharmony_ci __u32 len; 14062306a36Sopenharmony_ci struct page **pages; 14162306a36Sopenharmony_ci}; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_cistruct nfsd3_readres { 14462306a36Sopenharmony_ci __be32 status; 14562306a36Sopenharmony_ci struct svc_fh fh; 14662306a36Sopenharmony_ci unsigned long count; 14762306a36Sopenharmony_ci __u32 eof; 14862306a36Sopenharmony_ci struct page **pages; 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistruct nfsd3_writeres { 15262306a36Sopenharmony_ci __be32 status; 15362306a36Sopenharmony_ci struct svc_fh fh; 15462306a36Sopenharmony_ci unsigned long count; 15562306a36Sopenharmony_ci int committed; 15662306a36Sopenharmony_ci __be32 verf[2]; 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistruct nfsd3_renameres { 16062306a36Sopenharmony_ci __be32 status; 16162306a36Sopenharmony_ci struct svc_fh ffh; 16262306a36Sopenharmony_ci struct svc_fh tfh; 16362306a36Sopenharmony_ci}; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistruct nfsd3_linkres { 16662306a36Sopenharmony_ci __be32 status; 16762306a36Sopenharmony_ci struct svc_fh tfh; 16862306a36Sopenharmony_ci struct svc_fh fh; 16962306a36Sopenharmony_ci}; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_cistruct nfsd3_readdirres { 17262306a36Sopenharmony_ci /* Components of the reply */ 17362306a36Sopenharmony_ci __be32 status; 17462306a36Sopenharmony_ci struct svc_fh fh; 17562306a36Sopenharmony_ci __be32 verf[2]; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* Used to encode the reply's entry list */ 17862306a36Sopenharmony_ci struct xdr_stream xdr; 17962306a36Sopenharmony_ci struct xdr_buf dirlist; 18062306a36Sopenharmony_ci struct svc_fh scratch; 18162306a36Sopenharmony_ci struct readdir_cd common; 18262306a36Sopenharmony_ci unsigned int cookie_offset; 18362306a36Sopenharmony_ci struct svc_rqst * rqstp; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci}; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cistruct nfsd3_fsstatres { 18862306a36Sopenharmony_ci __be32 status; 18962306a36Sopenharmony_ci struct kstatfs stats; 19062306a36Sopenharmony_ci __u32 invarsec; 19162306a36Sopenharmony_ci}; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_cistruct nfsd3_fsinfores { 19462306a36Sopenharmony_ci __be32 status; 19562306a36Sopenharmony_ci __u32 f_rtmax; 19662306a36Sopenharmony_ci __u32 f_rtpref; 19762306a36Sopenharmony_ci __u32 f_rtmult; 19862306a36Sopenharmony_ci __u32 f_wtmax; 19962306a36Sopenharmony_ci __u32 f_wtpref; 20062306a36Sopenharmony_ci __u32 f_wtmult; 20162306a36Sopenharmony_ci __u32 f_dtpref; 20262306a36Sopenharmony_ci __u64 f_maxfilesize; 20362306a36Sopenharmony_ci __u32 f_properties; 20462306a36Sopenharmony_ci}; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_cistruct nfsd3_pathconfres { 20762306a36Sopenharmony_ci __be32 status; 20862306a36Sopenharmony_ci __u32 p_link_max; 20962306a36Sopenharmony_ci __u32 p_name_max; 21062306a36Sopenharmony_ci __u32 p_no_trunc; 21162306a36Sopenharmony_ci __u32 p_chown_restricted; 21262306a36Sopenharmony_ci __u32 p_case_insensitive; 21362306a36Sopenharmony_ci __u32 p_case_preserving; 21462306a36Sopenharmony_ci}; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistruct nfsd3_commitres { 21762306a36Sopenharmony_ci __be32 status; 21862306a36Sopenharmony_ci struct svc_fh fh; 21962306a36Sopenharmony_ci __be32 verf[2]; 22062306a36Sopenharmony_ci}; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_cistruct nfsd3_getaclres { 22362306a36Sopenharmony_ci __be32 status; 22462306a36Sopenharmony_ci struct svc_fh fh; 22562306a36Sopenharmony_ci int mask; 22662306a36Sopenharmony_ci struct posix_acl *acl_access; 22762306a36Sopenharmony_ci struct posix_acl *acl_default; 22862306a36Sopenharmony_ci struct kstat stat; 22962306a36Sopenharmony_ci}; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci/* dummy type for release */ 23262306a36Sopenharmony_cistruct nfsd3_fhandle_pair { 23362306a36Sopenharmony_ci __u32 dummy; 23462306a36Sopenharmony_ci struct svc_fh fh1; 23562306a36Sopenharmony_ci struct svc_fh fh2; 23662306a36Sopenharmony_ci}; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci/* 23962306a36Sopenharmony_ci * Storage requirements for XDR arguments and results. 24062306a36Sopenharmony_ci */ 24162306a36Sopenharmony_ciunion nfsd3_xdrstore { 24262306a36Sopenharmony_ci struct nfsd3_sattrargs sattrargs; 24362306a36Sopenharmony_ci struct nfsd3_diropargs diropargs; 24462306a36Sopenharmony_ci struct nfsd3_readargs readargs; 24562306a36Sopenharmony_ci struct nfsd3_writeargs writeargs; 24662306a36Sopenharmony_ci struct nfsd3_createargs createargs; 24762306a36Sopenharmony_ci struct nfsd3_renameargs renameargs; 24862306a36Sopenharmony_ci struct nfsd3_linkargs linkargs; 24962306a36Sopenharmony_ci struct nfsd3_symlinkargs symlinkargs; 25062306a36Sopenharmony_ci struct nfsd3_readdirargs readdirargs; 25162306a36Sopenharmony_ci struct nfsd3_diropres diropres; 25262306a36Sopenharmony_ci struct nfsd3_accessres accessres; 25362306a36Sopenharmony_ci struct nfsd3_readlinkres readlinkres; 25462306a36Sopenharmony_ci struct nfsd3_readres readres; 25562306a36Sopenharmony_ci struct nfsd3_writeres writeres; 25662306a36Sopenharmony_ci struct nfsd3_renameres renameres; 25762306a36Sopenharmony_ci struct nfsd3_linkres linkres; 25862306a36Sopenharmony_ci struct nfsd3_readdirres readdirres; 25962306a36Sopenharmony_ci struct nfsd3_fsstatres fsstatres; 26062306a36Sopenharmony_ci struct nfsd3_fsinfores fsinfores; 26162306a36Sopenharmony_ci struct nfsd3_pathconfres pathconfres; 26262306a36Sopenharmony_ci struct nfsd3_commitres commitres; 26362306a36Sopenharmony_ci struct nfsd3_getaclres getaclres; 26462306a36Sopenharmony_ci}; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci#define NFS3_SVC_XDRSIZE sizeof(union nfsd3_xdrstore) 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_cibool nfs3svc_decode_fhandleargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 26962306a36Sopenharmony_cibool nfs3svc_decode_sattrargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 27062306a36Sopenharmony_cibool nfs3svc_decode_diropargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 27162306a36Sopenharmony_cibool nfs3svc_decode_accessargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 27262306a36Sopenharmony_cibool nfs3svc_decode_readargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 27362306a36Sopenharmony_cibool nfs3svc_decode_writeargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 27462306a36Sopenharmony_cibool nfs3svc_decode_createargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 27562306a36Sopenharmony_cibool nfs3svc_decode_mkdirargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 27662306a36Sopenharmony_cibool nfs3svc_decode_mknodargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 27762306a36Sopenharmony_cibool nfs3svc_decode_renameargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 27862306a36Sopenharmony_cibool nfs3svc_decode_linkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 27962306a36Sopenharmony_cibool nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 28062306a36Sopenharmony_cibool nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 28162306a36Sopenharmony_cibool nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 28262306a36Sopenharmony_cibool nfs3svc_decode_commitargs(struct svc_rqst *rqstp, struct xdr_stream *xdr); 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cibool nfs3svc_encode_getattrres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 28562306a36Sopenharmony_cibool nfs3svc_encode_wccstat(struct svc_rqst *rqstp, struct xdr_stream *xdr); 28662306a36Sopenharmony_cibool nfs3svc_encode_lookupres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 28762306a36Sopenharmony_cibool nfs3svc_encode_accessres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 28862306a36Sopenharmony_cibool nfs3svc_encode_readlinkres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 28962306a36Sopenharmony_cibool nfs3svc_encode_readres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 29062306a36Sopenharmony_cibool nfs3svc_encode_writeres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 29162306a36Sopenharmony_cibool nfs3svc_encode_createres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 29262306a36Sopenharmony_cibool nfs3svc_encode_renameres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 29362306a36Sopenharmony_cibool nfs3svc_encode_linkres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 29462306a36Sopenharmony_cibool nfs3svc_encode_readdirres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 29562306a36Sopenharmony_cibool nfs3svc_encode_fsstatres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 29662306a36Sopenharmony_cibool nfs3svc_encode_fsinfores(struct svc_rqst *rqstp, struct xdr_stream *xdr); 29762306a36Sopenharmony_cibool nfs3svc_encode_pathconfres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 29862306a36Sopenharmony_cibool nfs3svc_encode_commitres(struct svc_rqst *rqstp, struct xdr_stream *xdr); 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_civoid nfs3svc_release_fhandle(struct svc_rqst *); 30162306a36Sopenharmony_civoid nfs3svc_release_fhandle2(struct svc_rqst *); 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_civoid nfs3svc_encode_cookie3(struct nfsd3_readdirres *resp, u64 offset); 30462306a36Sopenharmony_ciint nfs3svc_encode_entry3(void *data, const char *name, int namlen, 30562306a36Sopenharmony_ci loff_t offset, u64 ino, unsigned int d_type); 30662306a36Sopenharmony_ciint nfs3svc_encode_entryplus3(void *data, const char *name, int namlen, 30762306a36Sopenharmony_ci loff_t offset, u64 ino, unsigned int d_type); 30862306a36Sopenharmony_ci/* Helper functions for NFSv3 ACL code */ 30962306a36Sopenharmony_cibool svcxdr_decode_nfs_fh3(struct xdr_stream *xdr, struct svc_fh *fhp); 31062306a36Sopenharmony_cibool svcxdr_encode_nfsstat3(struct xdr_stream *xdr, __be32 status); 31162306a36Sopenharmony_cibool svcxdr_encode_post_op_attr(struct svc_rqst *rqstp, struct xdr_stream *xdr, 31262306a36Sopenharmony_ci const struct svc_fh *fhp); 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci#endif /* _LINUX_NFSD_XDR3_H */ 315