1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* XDR types for nfsd. This is mainly a typing exercise. */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef LINUX_NFSD_H 5*4882a593Smuzhiyun #define LINUX_NFSD_H 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <linux/vfs.h> 8*4882a593Smuzhiyun #include "nfsd.h" 9*4882a593Smuzhiyun #include "nfsfh.h" 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun struct nfsd_fhandle { 12*4882a593Smuzhiyun struct svc_fh fh; 13*4882a593Smuzhiyun }; 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun struct nfsd_sattrargs { 16*4882a593Smuzhiyun struct svc_fh fh; 17*4882a593Smuzhiyun struct iattr attrs; 18*4882a593Smuzhiyun }; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun struct nfsd_diropargs { 21*4882a593Smuzhiyun struct svc_fh fh; 22*4882a593Smuzhiyun char * name; 23*4882a593Smuzhiyun unsigned int len; 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct nfsd_readargs { 27*4882a593Smuzhiyun struct svc_fh fh; 28*4882a593Smuzhiyun __u32 offset; 29*4882a593Smuzhiyun __u32 count; 30*4882a593Smuzhiyun int vlen; 31*4882a593Smuzhiyun }; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun struct nfsd_writeargs { 34*4882a593Smuzhiyun svc_fh fh; 35*4882a593Smuzhiyun __u32 offset; 36*4882a593Smuzhiyun __u32 len; 37*4882a593Smuzhiyun struct kvec first; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct nfsd_createargs { 41*4882a593Smuzhiyun struct svc_fh fh; 42*4882a593Smuzhiyun char * name; 43*4882a593Smuzhiyun unsigned int len; 44*4882a593Smuzhiyun struct iattr attrs; 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct nfsd_renameargs { 48*4882a593Smuzhiyun struct svc_fh ffh; 49*4882a593Smuzhiyun char * fname; 50*4882a593Smuzhiyun unsigned int flen; 51*4882a593Smuzhiyun struct svc_fh tfh; 52*4882a593Smuzhiyun char * tname; 53*4882a593Smuzhiyun unsigned int tlen; 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun struct nfsd_readlinkargs { 57*4882a593Smuzhiyun struct svc_fh fh; 58*4882a593Smuzhiyun char * buffer; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun struct nfsd_linkargs { 62*4882a593Smuzhiyun struct svc_fh ffh; 63*4882a593Smuzhiyun struct svc_fh tfh; 64*4882a593Smuzhiyun char * tname; 65*4882a593Smuzhiyun unsigned int tlen; 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun struct nfsd_symlinkargs { 69*4882a593Smuzhiyun struct svc_fh ffh; 70*4882a593Smuzhiyun char * fname; 71*4882a593Smuzhiyun unsigned int flen; 72*4882a593Smuzhiyun char * tname; 73*4882a593Smuzhiyun unsigned int tlen; 74*4882a593Smuzhiyun struct iattr attrs; 75*4882a593Smuzhiyun struct kvec first; 76*4882a593Smuzhiyun }; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun struct nfsd_readdirargs { 79*4882a593Smuzhiyun struct svc_fh fh; 80*4882a593Smuzhiyun __u32 cookie; 81*4882a593Smuzhiyun __u32 count; 82*4882a593Smuzhiyun __be32 * buffer; 83*4882a593Smuzhiyun }; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun struct nfsd_stat { 86*4882a593Smuzhiyun __be32 status; 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct nfsd_attrstat { 90*4882a593Smuzhiyun __be32 status; 91*4882a593Smuzhiyun struct svc_fh fh; 92*4882a593Smuzhiyun struct kstat stat; 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun struct nfsd_diropres { 96*4882a593Smuzhiyun __be32 status; 97*4882a593Smuzhiyun struct svc_fh fh; 98*4882a593Smuzhiyun struct kstat stat; 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun struct nfsd_readlinkres { 102*4882a593Smuzhiyun __be32 status; 103*4882a593Smuzhiyun int len; 104*4882a593Smuzhiyun }; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun struct nfsd_readres { 107*4882a593Smuzhiyun __be32 status; 108*4882a593Smuzhiyun struct svc_fh fh; 109*4882a593Smuzhiyun unsigned long count; 110*4882a593Smuzhiyun struct kstat stat; 111*4882a593Smuzhiyun }; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun struct nfsd_readdirres { 114*4882a593Smuzhiyun __be32 status; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun int count; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun struct readdir_cd common; 119*4882a593Smuzhiyun __be32 * buffer; 120*4882a593Smuzhiyun int buflen; 121*4882a593Smuzhiyun __be32 * offset; 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun struct nfsd_statfsres { 125*4882a593Smuzhiyun __be32 status; 126*4882a593Smuzhiyun struct kstatfs stats; 127*4882a593Smuzhiyun }; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* 130*4882a593Smuzhiyun * Storage requirements for XDR arguments and results. 131*4882a593Smuzhiyun */ 132*4882a593Smuzhiyun union nfsd_xdrstore { 133*4882a593Smuzhiyun struct nfsd_sattrargs sattr; 134*4882a593Smuzhiyun struct nfsd_diropargs dirop; 135*4882a593Smuzhiyun struct nfsd_readargs read; 136*4882a593Smuzhiyun struct nfsd_writeargs write; 137*4882a593Smuzhiyun struct nfsd_createargs create; 138*4882a593Smuzhiyun struct nfsd_renameargs rename; 139*4882a593Smuzhiyun struct nfsd_linkargs link; 140*4882a593Smuzhiyun struct nfsd_symlinkargs symlink; 141*4882a593Smuzhiyun struct nfsd_readdirargs readdir; 142*4882a593Smuzhiyun }; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #define NFS2_SVC_XDRSIZE sizeof(union nfsd_xdrstore) 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun int nfssvc_decode_void(struct svc_rqst *, __be32 *); 148*4882a593Smuzhiyun int nfssvc_decode_fhandle(struct svc_rqst *, __be32 *); 149*4882a593Smuzhiyun int nfssvc_decode_sattrargs(struct svc_rqst *, __be32 *); 150*4882a593Smuzhiyun int nfssvc_decode_diropargs(struct svc_rqst *, __be32 *); 151*4882a593Smuzhiyun int nfssvc_decode_readargs(struct svc_rqst *, __be32 *); 152*4882a593Smuzhiyun int nfssvc_decode_writeargs(struct svc_rqst *, __be32 *); 153*4882a593Smuzhiyun int nfssvc_decode_createargs(struct svc_rqst *, __be32 *); 154*4882a593Smuzhiyun int nfssvc_decode_renameargs(struct svc_rqst *, __be32 *); 155*4882a593Smuzhiyun int nfssvc_decode_readlinkargs(struct svc_rqst *, __be32 *); 156*4882a593Smuzhiyun int nfssvc_decode_linkargs(struct svc_rqst *, __be32 *); 157*4882a593Smuzhiyun int nfssvc_decode_symlinkargs(struct svc_rqst *, __be32 *); 158*4882a593Smuzhiyun int nfssvc_decode_readdirargs(struct svc_rqst *, __be32 *); 159*4882a593Smuzhiyun int nfssvc_encode_void(struct svc_rqst *, __be32 *); 160*4882a593Smuzhiyun int nfssvc_encode_stat(struct svc_rqst *, __be32 *); 161*4882a593Smuzhiyun int nfssvc_encode_attrstat(struct svc_rqst *, __be32 *); 162*4882a593Smuzhiyun int nfssvc_encode_diropres(struct svc_rqst *, __be32 *); 163*4882a593Smuzhiyun int nfssvc_encode_readlinkres(struct svc_rqst *, __be32 *); 164*4882a593Smuzhiyun int nfssvc_encode_readres(struct svc_rqst *, __be32 *); 165*4882a593Smuzhiyun int nfssvc_encode_statfsres(struct svc_rqst *, __be32 *); 166*4882a593Smuzhiyun int nfssvc_encode_readdirres(struct svc_rqst *, __be32 *); 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun int nfssvc_encode_entry(void *, const char *name, 169*4882a593Smuzhiyun int namlen, loff_t offset, u64 ino, unsigned int); 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun void nfssvc_release_attrstat(struct svc_rqst *rqstp); 172*4882a593Smuzhiyun void nfssvc_release_diropres(struct svc_rqst *rqstp); 173*4882a593Smuzhiyun void nfssvc_release_readres(struct svc_rqst *rqstp); 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun /* Helper functions for NFSv2 ACL code */ 176*4882a593Smuzhiyun __be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp, struct kstat *stat); 177*4882a593Smuzhiyun __be32 *nfs2svc_decode_fh(__be32 *p, struct svc_fh *fhp); 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun #endif /* LINUX_NFSD_H */ 180