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