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