1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * XDR types for NFSv3 in nfsd. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 1996-1998, Olaf Kirch <okir@monad.swb.de> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _LINUX_NFSD_XDR3_H 9*4882a593Smuzhiyun #define _LINUX_NFSD_XDR3_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include "xdr.h" 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun struct nfsd3_sattrargs { 14*4882a593Smuzhiyun struct svc_fh fh; 15*4882a593Smuzhiyun struct iattr attrs; 16*4882a593Smuzhiyun int check_guard; 17*4882a593Smuzhiyun time64_t guardtime; 18*4882a593Smuzhiyun }; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun struct nfsd3_diropargs { 21*4882a593Smuzhiyun struct svc_fh fh; 22*4882a593Smuzhiyun char * name; 23*4882a593Smuzhiyun unsigned int len; 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct nfsd3_accessargs { 27*4882a593Smuzhiyun struct svc_fh fh; 28*4882a593Smuzhiyun unsigned int access; 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun struct nfsd3_readargs { 32*4882a593Smuzhiyun struct svc_fh fh; 33*4882a593Smuzhiyun __u64 offset; 34*4882a593Smuzhiyun __u32 count; 35*4882a593Smuzhiyun int vlen; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct nfsd3_writeargs { 39*4882a593Smuzhiyun svc_fh fh; 40*4882a593Smuzhiyun __u64 offset; 41*4882a593Smuzhiyun __u32 count; 42*4882a593Smuzhiyun int stable; 43*4882a593Smuzhiyun __u32 len; 44*4882a593Smuzhiyun struct kvec first; 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct nfsd3_createargs { 48*4882a593Smuzhiyun struct svc_fh fh; 49*4882a593Smuzhiyun char * name; 50*4882a593Smuzhiyun unsigned int len; 51*4882a593Smuzhiyun int createmode; 52*4882a593Smuzhiyun struct iattr attrs; 53*4882a593Smuzhiyun __be32 * verf; 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun struct nfsd3_mknodargs { 57*4882a593Smuzhiyun struct svc_fh fh; 58*4882a593Smuzhiyun char * name; 59*4882a593Smuzhiyun unsigned int len; 60*4882a593Smuzhiyun __u32 ftype; 61*4882a593Smuzhiyun __u32 major, minor; 62*4882a593Smuzhiyun struct iattr attrs; 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun struct nfsd3_renameargs { 66*4882a593Smuzhiyun struct svc_fh ffh; 67*4882a593Smuzhiyun char * fname; 68*4882a593Smuzhiyun unsigned int flen; 69*4882a593Smuzhiyun struct svc_fh tfh; 70*4882a593Smuzhiyun char * tname; 71*4882a593Smuzhiyun unsigned int tlen; 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct nfsd3_readlinkargs { 75*4882a593Smuzhiyun struct svc_fh fh; 76*4882a593Smuzhiyun char * buffer; 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct nfsd3_linkargs { 80*4882a593Smuzhiyun struct svc_fh ffh; 81*4882a593Smuzhiyun struct svc_fh tfh; 82*4882a593Smuzhiyun char * tname; 83*4882a593Smuzhiyun unsigned int tlen; 84*4882a593Smuzhiyun }; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun struct nfsd3_symlinkargs { 87*4882a593Smuzhiyun struct svc_fh ffh; 88*4882a593Smuzhiyun char * fname; 89*4882a593Smuzhiyun unsigned int flen; 90*4882a593Smuzhiyun char * tname; 91*4882a593Smuzhiyun unsigned int tlen; 92*4882a593Smuzhiyun struct iattr attrs; 93*4882a593Smuzhiyun struct kvec first; 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun struct nfsd3_readdirargs { 97*4882a593Smuzhiyun struct svc_fh fh; 98*4882a593Smuzhiyun __u64 cookie; 99*4882a593Smuzhiyun __u32 dircount; 100*4882a593Smuzhiyun __u32 count; 101*4882a593Smuzhiyun __be32 * verf; 102*4882a593Smuzhiyun __be32 * buffer; 103*4882a593Smuzhiyun }; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun struct nfsd3_commitargs { 106*4882a593Smuzhiyun struct svc_fh fh; 107*4882a593Smuzhiyun __u64 offset; 108*4882a593Smuzhiyun __u32 count; 109*4882a593Smuzhiyun }; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun struct nfsd3_getaclargs { 112*4882a593Smuzhiyun struct svc_fh fh; 113*4882a593Smuzhiyun int mask; 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun struct posix_acl; 117*4882a593Smuzhiyun struct nfsd3_setaclargs { 118*4882a593Smuzhiyun struct svc_fh fh; 119*4882a593Smuzhiyun int mask; 120*4882a593Smuzhiyun struct posix_acl *acl_access; 121*4882a593Smuzhiyun struct posix_acl *acl_default; 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun struct nfsd3_attrstat { 125*4882a593Smuzhiyun __be32 status; 126*4882a593Smuzhiyun struct svc_fh fh; 127*4882a593Smuzhiyun struct kstat stat; 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* LOOKUP, CREATE, MKDIR, SYMLINK, MKNOD */ 131*4882a593Smuzhiyun struct nfsd3_diropres { 132*4882a593Smuzhiyun __be32 status; 133*4882a593Smuzhiyun struct svc_fh dirfh; 134*4882a593Smuzhiyun struct svc_fh fh; 135*4882a593Smuzhiyun }; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun struct nfsd3_accessres { 138*4882a593Smuzhiyun __be32 status; 139*4882a593Smuzhiyun struct svc_fh fh; 140*4882a593Smuzhiyun __u32 access; 141*4882a593Smuzhiyun struct kstat stat; 142*4882a593Smuzhiyun }; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun struct nfsd3_readlinkres { 145*4882a593Smuzhiyun __be32 status; 146*4882a593Smuzhiyun struct svc_fh fh; 147*4882a593Smuzhiyun __u32 len; 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun struct nfsd3_readres { 151*4882a593Smuzhiyun __be32 status; 152*4882a593Smuzhiyun struct svc_fh fh; 153*4882a593Smuzhiyun unsigned long count; 154*4882a593Smuzhiyun __u32 eof; 155*4882a593Smuzhiyun }; 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun struct nfsd3_writeres { 158*4882a593Smuzhiyun __be32 status; 159*4882a593Smuzhiyun struct svc_fh fh; 160*4882a593Smuzhiyun unsigned long count; 161*4882a593Smuzhiyun int committed; 162*4882a593Smuzhiyun __be32 verf[2]; 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun struct nfsd3_renameres { 166*4882a593Smuzhiyun __be32 status; 167*4882a593Smuzhiyun struct svc_fh ffh; 168*4882a593Smuzhiyun struct svc_fh tfh; 169*4882a593Smuzhiyun }; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun struct nfsd3_linkres { 172*4882a593Smuzhiyun __be32 status; 173*4882a593Smuzhiyun struct svc_fh tfh; 174*4882a593Smuzhiyun struct svc_fh fh; 175*4882a593Smuzhiyun }; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun struct nfsd3_readdirres { 178*4882a593Smuzhiyun __be32 status; 179*4882a593Smuzhiyun struct svc_fh fh; 180*4882a593Smuzhiyun /* Just to save kmalloc on every readdirplus entry (svc_fh is a 181*4882a593Smuzhiyun * little large for the stack): */ 182*4882a593Smuzhiyun struct svc_fh scratch; 183*4882a593Smuzhiyun int count; 184*4882a593Smuzhiyun __be32 verf[2]; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun struct readdir_cd common; 187*4882a593Smuzhiyun __be32 * buffer; 188*4882a593Smuzhiyun int buflen; 189*4882a593Smuzhiyun __be32 * offset; 190*4882a593Smuzhiyun __be32 * offset1; 191*4882a593Smuzhiyun struct svc_rqst * rqstp; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun struct nfsd3_fsstatres { 196*4882a593Smuzhiyun __be32 status; 197*4882a593Smuzhiyun struct kstatfs stats; 198*4882a593Smuzhiyun __u32 invarsec; 199*4882a593Smuzhiyun }; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun struct nfsd3_fsinfores { 202*4882a593Smuzhiyun __be32 status; 203*4882a593Smuzhiyun __u32 f_rtmax; 204*4882a593Smuzhiyun __u32 f_rtpref; 205*4882a593Smuzhiyun __u32 f_rtmult; 206*4882a593Smuzhiyun __u32 f_wtmax; 207*4882a593Smuzhiyun __u32 f_wtpref; 208*4882a593Smuzhiyun __u32 f_wtmult; 209*4882a593Smuzhiyun __u32 f_dtpref; 210*4882a593Smuzhiyun __u64 f_maxfilesize; 211*4882a593Smuzhiyun __u32 f_properties; 212*4882a593Smuzhiyun }; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun struct nfsd3_pathconfres { 215*4882a593Smuzhiyun __be32 status; 216*4882a593Smuzhiyun __u32 p_link_max; 217*4882a593Smuzhiyun __u32 p_name_max; 218*4882a593Smuzhiyun __u32 p_no_trunc; 219*4882a593Smuzhiyun __u32 p_chown_restricted; 220*4882a593Smuzhiyun __u32 p_case_insensitive; 221*4882a593Smuzhiyun __u32 p_case_preserving; 222*4882a593Smuzhiyun }; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun struct nfsd3_commitres { 225*4882a593Smuzhiyun __be32 status; 226*4882a593Smuzhiyun struct svc_fh fh; 227*4882a593Smuzhiyun __be32 verf[2]; 228*4882a593Smuzhiyun }; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun struct nfsd3_getaclres { 231*4882a593Smuzhiyun __be32 status; 232*4882a593Smuzhiyun struct svc_fh fh; 233*4882a593Smuzhiyun int mask; 234*4882a593Smuzhiyun struct posix_acl *acl_access; 235*4882a593Smuzhiyun struct posix_acl *acl_default; 236*4882a593Smuzhiyun struct kstat stat; 237*4882a593Smuzhiyun }; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* dummy type for release */ 240*4882a593Smuzhiyun struct nfsd3_fhandle_pair { 241*4882a593Smuzhiyun __u32 dummy; 242*4882a593Smuzhiyun struct svc_fh fh1; 243*4882a593Smuzhiyun struct svc_fh fh2; 244*4882a593Smuzhiyun }; 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun /* 247*4882a593Smuzhiyun * Storage requirements for XDR arguments and results. 248*4882a593Smuzhiyun */ 249*4882a593Smuzhiyun union nfsd3_xdrstore { 250*4882a593Smuzhiyun struct nfsd3_sattrargs sattrargs; 251*4882a593Smuzhiyun struct nfsd3_diropargs diropargs; 252*4882a593Smuzhiyun struct nfsd3_readargs readargs; 253*4882a593Smuzhiyun struct nfsd3_writeargs writeargs; 254*4882a593Smuzhiyun struct nfsd3_createargs createargs; 255*4882a593Smuzhiyun struct nfsd3_renameargs renameargs; 256*4882a593Smuzhiyun struct nfsd3_linkargs linkargs; 257*4882a593Smuzhiyun struct nfsd3_symlinkargs symlinkargs; 258*4882a593Smuzhiyun struct nfsd3_readdirargs readdirargs; 259*4882a593Smuzhiyun struct nfsd3_diropres diropres; 260*4882a593Smuzhiyun struct nfsd3_accessres accessres; 261*4882a593Smuzhiyun struct nfsd3_readlinkres readlinkres; 262*4882a593Smuzhiyun struct nfsd3_readres readres; 263*4882a593Smuzhiyun struct nfsd3_writeres writeres; 264*4882a593Smuzhiyun struct nfsd3_renameres renameres; 265*4882a593Smuzhiyun struct nfsd3_linkres linkres; 266*4882a593Smuzhiyun struct nfsd3_readdirres readdirres; 267*4882a593Smuzhiyun struct nfsd3_fsstatres fsstatres; 268*4882a593Smuzhiyun struct nfsd3_fsinfores fsinfores; 269*4882a593Smuzhiyun struct nfsd3_pathconfres pathconfres; 270*4882a593Smuzhiyun struct nfsd3_commitres commitres; 271*4882a593Smuzhiyun struct nfsd3_getaclres getaclres; 272*4882a593Smuzhiyun }; 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun #define NFS3_SVC_XDRSIZE sizeof(union nfsd3_xdrstore) 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun int nfs3svc_decode_voidarg(struct svc_rqst *, __be32 *); 277*4882a593Smuzhiyun int nfs3svc_decode_fhandle(struct svc_rqst *, __be32 *); 278*4882a593Smuzhiyun int nfs3svc_decode_sattrargs(struct svc_rqst *, __be32 *); 279*4882a593Smuzhiyun int nfs3svc_decode_diropargs(struct svc_rqst *, __be32 *); 280*4882a593Smuzhiyun int nfs3svc_decode_accessargs(struct svc_rqst *, __be32 *); 281*4882a593Smuzhiyun int nfs3svc_decode_readargs(struct svc_rqst *, __be32 *); 282*4882a593Smuzhiyun int nfs3svc_decode_writeargs(struct svc_rqst *, __be32 *); 283*4882a593Smuzhiyun int nfs3svc_decode_createargs(struct svc_rqst *, __be32 *); 284*4882a593Smuzhiyun int nfs3svc_decode_mkdirargs(struct svc_rqst *, __be32 *); 285*4882a593Smuzhiyun int nfs3svc_decode_mknodargs(struct svc_rqst *, __be32 *); 286*4882a593Smuzhiyun int nfs3svc_decode_renameargs(struct svc_rqst *, __be32 *); 287*4882a593Smuzhiyun int nfs3svc_decode_readlinkargs(struct svc_rqst *, __be32 *); 288*4882a593Smuzhiyun int nfs3svc_decode_linkargs(struct svc_rqst *, __be32 *); 289*4882a593Smuzhiyun int nfs3svc_decode_symlinkargs(struct svc_rqst *, __be32 *); 290*4882a593Smuzhiyun int nfs3svc_decode_readdirargs(struct svc_rqst *, __be32 *); 291*4882a593Smuzhiyun int nfs3svc_decode_readdirplusargs(struct svc_rqst *, __be32 *); 292*4882a593Smuzhiyun int nfs3svc_decode_commitargs(struct svc_rqst *, __be32 *); 293*4882a593Smuzhiyun int nfs3svc_encode_voidres(struct svc_rqst *, __be32 *); 294*4882a593Smuzhiyun int nfs3svc_encode_attrstat(struct svc_rqst *, __be32 *); 295*4882a593Smuzhiyun int nfs3svc_encode_wccstat(struct svc_rqst *, __be32 *); 296*4882a593Smuzhiyun int nfs3svc_encode_diropres(struct svc_rqst *, __be32 *); 297*4882a593Smuzhiyun int nfs3svc_encode_accessres(struct svc_rqst *, __be32 *); 298*4882a593Smuzhiyun int nfs3svc_encode_readlinkres(struct svc_rqst *, __be32 *); 299*4882a593Smuzhiyun int nfs3svc_encode_readres(struct svc_rqst *, __be32 *); 300*4882a593Smuzhiyun int nfs3svc_encode_writeres(struct svc_rqst *, __be32 *); 301*4882a593Smuzhiyun int nfs3svc_encode_createres(struct svc_rqst *, __be32 *); 302*4882a593Smuzhiyun int nfs3svc_encode_renameres(struct svc_rqst *, __be32 *); 303*4882a593Smuzhiyun int nfs3svc_encode_linkres(struct svc_rqst *, __be32 *); 304*4882a593Smuzhiyun int nfs3svc_encode_readdirres(struct svc_rqst *, __be32 *); 305*4882a593Smuzhiyun int nfs3svc_encode_fsstatres(struct svc_rqst *, __be32 *); 306*4882a593Smuzhiyun int nfs3svc_encode_fsinfores(struct svc_rqst *, __be32 *); 307*4882a593Smuzhiyun int nfs3svc_encode_pathconfres(struct svc_rqst *, __be32 *); 308*4882a593Smuzhiyun int nfs3svc_encode_commitres(struct svc_rqst *, __be32 *); 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun void nfs3svc_release_fhandle(struct svc_rqst *); 311*4882a593Smuzhiyun void nfs3svc_release_fhandle2(struct svc_rqst *); 312*4882a593Smuzhiyun int nfs3svc_encode_entry(void *, const char *name, 313*4882a593Smuzhiyun int namlen, loff_t offset, u64 ino, 314*4882a593Smuzhiyun unsigned int); 315*4882a593Smuzhiyun int nfs3svc_encode_entry_plus(void *, const char *name, 316*4882a593Smuzhiyun int namlen, loff_t offset, u64 ino, 317*4882a593Smuzhiyun unsigned int); 318*4882a593Smuzhiyun /* Helper functions for NFSv3 ACL code */ 319*4882a593Smuzhiyun __be32 *nfs3svc_encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p, 320*4882a593Smuzhiyun struct svc_fh *fhp); 321*4882a593Smuzhiyun __be32 *nfs3svc_decode_fh(__be32 *p, struct svc_fh *fhp); 322*4882a593Smuzhiyun 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun #endif /* _LINUX_NFSD_XDR3_H */ 325