1*0Sstevel@tonic-gate /* 2*0Sstevel@tonic-gate * CDDL HEADER START 3*0Sstevel@tonic-gate * 4*0Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*0Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*0Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*0Sstevel@tonic-gate * with the License. 8*0Sstevel@tonic-gate * 9*0Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*0Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*0Sstevel@tonic-gate * See the License for the specific language governing permissions 12*0Sstevel@tonic-gate * and limitations under the License. 13*0Sstevel@tonic-gate * 14*0Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*0Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*0Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*0Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*0Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*0Sstevel@tonic-gate * 20*0Sstevel@tonic-gate * CDDL HEADER END 21*0Sstevel@tonic-gate */ 22*0Sstevel@tonic-gate /* 23*0Sstevel@tonic-gate * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24*0Sstevel@tonic-gate * Use is subject to license terms. 25*0Sstevel@tonic-gate */ 26*0Sstevel@tonic-gate 27*0Sstevel@tonic-gate /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ 28*0Sstevel@tonic-gate /* All Rights Reserved */ 29*0Sstevel@tonic-gate 30*0Sstevel@tonic-gate #ifndef _NFS_NFS_H 31*0Sstevel@tonic-gate #define _NFS_NFS_H 32*0Sstevel@tonic-gate 33*0Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 34*0Sstevel@tonic-gate /* nfs.h 2.38 88/08/19 SMI */ 35*0Sstevel@tonic-gate 36*0Sstevel@tonic-gate #include <sys/isa_defs.h> 37*0Sstevel@tonic-gate #include <sys/vfs.h> 38*0Sstevel@tonic-gate #include <sys/stream.h> 39*0Sstevel@tonic-gate #include <rpc/types.h> 40*0Sstevel@tonic-gate #include <sys/types32.h> 41*0Sstevel@tonic-gate #ifdef _KERNEL 42*0Sstevel@tonic-gate #include <rpc/xdr.h> 43*0Sstevel@tonic-gate #include <sys/fcntl.h> 44*0Sstevel@tonic-gate #include <sys/kstat.h> 45*0Sstevel@tonic-gate #include <sys/dirent.h> 46*0Sstevel@tonic-gate #include <nfs/mount.h> 47*0Sstevel@tonic-gate #endif 48*0Sstevel@tonic-gate #include <vm/page.h> 49*0Sstevel@tonic-gate #include <rpc/rpc_sztypes.h> 50*0Sstevel@tonic-gate #include <sys/sysmacros.h> 51*0Sstevel@tonic-gate 52*0Sstevel@tonic-gate #ifdef __cplusplus 53*0Sstevel@tonic-gate extern "C" { 54*0Sstevel@tonic-gate #endif 55*0Sstevel@tonic-gate 56*0Sstevel@tonic-gate /* 57*0Sstevel@tonic-gate * Solaris NFS daemons configuration file location 58*0Sstevel@tonic-gate */ 59*0Sstevel@tonic-gate #define NFSADMIN "/etc/default/nfs" 60*0Sstevel@tonic-gate 61*0Sstevel@tonic-gate /* 62*0Sstevel@tonic-gate * remote file service numbers 63*0Sstevel@tonic-gate */ 64*0Sstevel@tonic-gate #define NFS_PROGRAM ((rpcprog_t)100003) 65*0Sstevel@tonic-gate #define NFS_VERSMIN ((rpcvers_t)2) 66*0Sstevel@tonic-gate #define NFS_VERSMAX ((rpcvers_t)4) 67*0Sstevel@tonic-gate #define NFS_VERSION ((rpcvers_t)2) 68*0Sstevel@tonic-gate #define NFS_PORT 2049 69*0Sstevel@tonic-gate 70*0Sstevel@tonic-gate /* 71*0Sstevel@tonic-gate * Used to determine registration and service handling of versions 72*0Sstevel@tonic-gate */ 73*0Sstevel@tonic-gate #define NFS_VERSMIN_DEFAULT ((rpcvers_t)2) 74*0Sstevel@tonic-gate #define NFS_VERSMAX_DEFAULT ((rpcvers_t)4) 75*0Sstevel@tonic-gate 76*0Sstevel@tonic-gate extern rpcvers_t nfs_versmin; 77*0Sstevel@tonic-gate extern rpcvers_t nfs_versmax; 78*0Sstevel@tonic-gate 79*0Sstevel@tonic-gate /* 80*0Sstevel@tonic-gate * Default delegation setting for the server ==> "on" 81*0Sstevel@tonic-gate */ 82*0Sstevel@tonic-gate #define NFS_SERVER_DELEGATION_DEFAULT (TRUE) 83*0Sstevel@tonic-gate 84*0Sstevel@tonic-gate /* Maximum size of data portion of a remote request */ 85*0Sstevel@tonic-gate #define NFS_MAXDATA 8192 86*0Sstevel@tonic-gate #define NFS_MAXNAMLEN 255 87*0Sstevel@tonic-gate #define NFS_MAXPATHLEN 1024 88*0Sstevel@tonic-gate 89*0Sstevel@tonic-gate /* 90*0Sstevel@tonic-gate * Rpc retransmission parameters 91*0Sstevel@tonic-gate */ 92*0Sstevel@tonic-gate #define NFS_TIMEO 11 /* initial timeout for clts in 10th of a sec */ 93*0Sstevel@tonic-gate #define NFS_RETRIES 5 /* times to retry request */ 94*0Sstevel@tonic-gate #define NFS_COTS_TIMEO 600 /* initial timeout for cots in 10th of a sec */ 95*0Sstevel@tonic-gate 96*0Sstevel@tonic-gate /* 97*0Sstevel@tonic-gate * The value of UID_NOBODY/GID_NOBODY presented to the world via NFS. 98*0Sstevel@tonic-gate * UID_NOBODY/GID_NOBODY is translated to NFS_UID_NOBODY/NFS_GID_NOBODY 99*0Sstevel@tonic-gate * when being sent out over the network and NFS_UID_NOBODY/NFS_GID_NOBODY 100*0Sstevel@tonic-gate * is translated to UID_NOBODY/GID_NOBODY when received. 101*0Sstevel@tonic-gate */ 102*0Sstevel@tonic-gate #define NFS_UID_NOBODY -2 103*0Sstevel@tonic-gate #define NFS_GID_NOBODY -2 104*0Sstevel@tonic-gate 105*0Sstevel@tonic-gate /* 106*0Sstevel@tonic-gate * maximum transfer size for different interfaces 107*0Sstevel@tonic-gate */ 108*0Sstevel@tonic-gate #define ECTSIZE 2048 109*0Sstevel@tonic-gate #define IETSIZE 8192 110*0Sstevel@tonic-gate 111*0Sstevel@tonic-gate /* 112*0Sstevel@tonic-gate * WebNFS error status 113*0Sstevel@tonic-gate */ 114*0Sstevel@tonic-gate enum wnfsstat { 115*0Sstevel@tonic-gate WNFSERR_CLNT_FLAVOR = 20001 /* invalid client sec flavor */ 116*0Sstevel@tonic-gate }; 117*0Sstevel@tonic-gate 118*0Sstevel@tonic-gate /* 119*0Sstevel@tonic-gate * Error status 120*0Sstevel@tonic-gate * Should include all possible net errors. 121*0Sstevel@tonic-gate * For now we just cast errno into an enum nfsstat. 122*0Sstevel@tonic-gate */ 123*0Sstevel@tonic-gate enum nfsstat { 124*0Sstevel@tonic-gate NFS_OK = 0, /* no error */ 125*0Sstevel@tonic-gate NFSERR_PERM = 1, /* Not owner */ 126*0Sstevel@tonic-gate NFSERR_NOENT = 2, /* No such file or directory */ 127*0Sstevel@tonic-gate NFSERR_IO = 5, /* I/O error */ 128*0Sstevel@tonic-gate NFSERR_NXIO = 6, /* No such device or address */ 129*0Sstevel@tonic-gate NFSERR_ACCES = 13, /* Permission denied */ 130*0Sstevel@tonic-gate NFSERR_EXIST = 17, /* File exists */ 131*0Sstevel@tonic-gate NFSERR_XDEV = 18, /* Cross-device link */ 132*0Sstevel@tonic-gate NFSERR_NODEV = 19, /* No such device */ 133*0Sstevel@tonic-gate NFSERR_NOTDIR = 20, /* Not a directory */ 134*0Sstevel@tonic-gate NFSERR_ISDIR = 21, /* Is a directory */ 135*0Sstevel@tonic-gate NFSERR_INVAL = 22, /* Invalid argument */ 136*0Sstevel@tonic-gate NFSERR_FBIG = 27, /* File too large */ 137*0Sstevel@tonic-gate NFSERR_NOSPC = 28, /* No space left on device */ 138*0Sstevel@tonic-gate NFSERR_ROFS = 30, /* Read-only file system */ 139*0Sstevel@tonic-gate NFSERR_OPNOTSUPP = 45, /* Operation not supported */ 140*0Sstevel@tonic-gate NFSERR_NAMETOOLONG = 63, /* File name too long */ 141*0Sstevel@tonic-gate NFSERR_NOTEMPTY = 66, /* Directory not empty */ 142*0Sstevel@tonic-gate NFSERR_DQUOT = 69, /* Disc quota exceeded */ 143*0Sstevel@tonic-gate NFSERR_STALE = 70, /* Stale NFS file handle */ 144*0Sstevel@tonic-gate NFSERR_REMOTE = 71, /* Object is remote */ 145*0Sstevel@tonic-gate NFSERR_WFLUSH = 99 /* write cache flushed */ 146*0Sstevel@tonic-gate }; 147*0Sstevel@tonic-gate 148*0Sstevel@tonic-gate typedef enum nfsstat nfsstat; 149*0Sstevel@tonic-gate 150*0Sstevel@tonic-gate /* 151*0Sstevel@tonic-gate * File types 152*0Sstevel@tonic-gate */ 153*0Sstevel@tonic-gate enum nfsftype { 154*0Sstevel@tonic-gate NFNON, 155*0Sstevel@tonic-gate NFREG, /* regular file */ 156*0Sstevel@tonic-gate NFDIR, /* directory */ 157*0Sstevel@tonic-gate NFBLK, /* block special */ 158*0Sstevel@tonic-gate NFCHR, /* character special */ 159*0Sstevel@tonic-gate NFLNK, /* symbolic link */ 160*0Sstevel@tonic-gate NFSOC /* socket */ 161*0Sstevel@tonic-gate }; 162*0Sstevel@tonic-gate 163*0Sstevel@tonic-gate /* 164*0Sstevel@tonic-gate * Macros for converting device numbers to and from the format 165*0Sstevel@tonic-gate * SunOS 4.x used. SVR4 uses 14 bit majors and 18 bits minors, 166*0Sstevel@tonic-gate * SunOS 4.x used 8 bit majors and 8 bit minors. It isn't sufficient 167*0Sstevel@tonic-gate * to use the cmpdev() and expdev() macros because they only compress 168*0Sstevel@tonic-gate * 7 bit (and smaller) majors. We must compress 8 bit majors too. 169*0Sstevel@tonic-gate * If the major or minor exceeds 8 bits, then we send it out in 170*0Sstevel@tonic-gate * full 32 bit format and hope that the peer can deal with it. 171*0Sstevel@tonic-gate */ 172*0Sstevel@tonic-gate 173*0Sstevel@tonic-gate #define SO4_BITSMAJOR 8 /* # of SunOS 4.x major device bits */ 174*0Sstevel@tonic-gate #define SO4_BITSMINOR 8 /* # of SunOS 4.x minor device bits */ 175*0Sstevel@tonic-gate #define SO4_MAXMAJ 0xff /* SunOS 4.x max major value */ 176*0Sstevel@tonic-gate #define SO4_MAXMIN 0xff /* SunOS 4.x max minor value */ 177*0Sstevel@tonic-gate 178*0Sstevel@tonic-gate /* 179*0Sstevel@tonic-gate * Convert to over-the-wire device number format 180*0Sstevel@tonic-gate */ 181*0Sstevel@tonic-gate #define nfsv2_cmpdev(x) \ 182*0Sstevel@tonic-gate ((uint32_t) \ 183*0Sstevel@tonic-gate ((getmajor(x) > SO4_MAXMAJ || getminor(x) > SO4_MAXMIN) ? NODEV : \ 184*0Sstevel@tonic-gate ((getmajor(x) << SO4_BITSMINOR) | (getminor(x) & SO4_MAXMIN)))) 185*0Sstevel@tonic-gate 186*0Sstevel@tonic-gate /* 187*0Sstevel@tonic-gate * Convert from over-the-wire format to SVR4 device number format 188*0Sstevel@tonic-gate */ 189*0Sstevel@tonic-gate #define nfsv2_expdev(x) \ 190*0Sstevel@tonic-gate makedevice((((x) >> SO4_BITSMINOR) & SO4_MAXMAJ), (x) & SO4_MAXMIN) 191*0Sstevel@tonic-gate 192*0Sstevel@tonic-gate /* 193*0Sstevel@tonic-gate * Special kludge for fifos (named pipes) [to adhere to NFS Protocol Spec] 194*0Sstevel@tonic-gate * 195*0Sstevel@tonic-gate * VFIFO is not in the protocol spec (VNON will be replaced by VFIFO) 196*0Sstevel@tonic-gate * so the over-the-wire representation is VCHR with a '-1' device number. 197*0Sstevel@tonic-gate * 198*0Sstevel@tonic-gate * NOTE: This kludge becomes unnecessary with the Protocol Revision, 199*0Sstevel@tonic-gate * but it may be necessary to support it (backwards compatibility). 200*0Sstevel@tonic-gate */ 201*0Sstevel@tonic-gate #define NFS_FIFO_TYPE NFCHR 202*0Sstevel@tonic-gate #define NFS_FIFO_MODE S_IFCHR 203*0Sstevel@tonic-gate #define NFS_FIFO_DEV ((uint32_t)-1) 204*0Sstevel@tonic-gate 205*0Sstevel@tonic-gate /* identify fifo in nfs attributes */ 206*0Sstevel@tonic-gate #define NA_ISFIFO(NA) (((NA)->na_type == NFS_FIFO_TYPE) && \ 207*0Sstevel@tonic-gate ((NA)->na_rdev == NFS_FIFO_DEV)) 208*0Sstevel@tonic-gate 209*0Sstevel@tonic-gate /* set fifo in nfs attributes */ 210*0Sstevel@tonic-gate #define NA_SETFIFO(NA) { \ 211*0Sstevel@tonic-gate (NA)->na_type = NFS_FIFO_TYPE; \ 212*0Sstevel@tonic-gate (NA)->na_rdev = NFS_FIFO_DEV; \ 213*0Sstevel@tonic-gate (NA)->na_mode = ((NA)->na_mode & ~S_IFMT) | NFS_FIFO_MODE; \ 214*0Sstevel@tonic-gate } 215*0Sstevel@tonic-gate 216*0Sstevel@tonic-gate /* 217*0Sstevel@tonic-gate * Check for time overflow using a kernel tunable to determine whether 218*0Sstevel@tonic-gate * we should accept or reject an unsigned 32-bit time value. Time value in NFS 219*0Sstevel@tonic-gate * v2/3 protocol is unsigned 32 bit, but ILP32 kernel only allows 31 bits. 220*0Sstevel@tonic-gate * In nfsv4, time value is a signed 64 bit, so needs to be checked for 221*0Sstevel@tonic-gate * overflow as well (e.g. for setattr). So define the tunable as follows: 222*0Sstevel@tonic-gate * nfs_allow_preepoch_time is TRUE if pre-epoch (negative) times are allowed 223*0Sstevel@tonic-gate * and is FALSE (the default) otherwise. For nfsv2/3 this means that 224*0Sstevel@tonic-gate * if negative times are allowed, the uint32_t time value is interpreted 225*0Sstevel@tonic-gate * as a signed int, otherwise as a large positive number. For nfsv4, 226*0Sstevel@tonic-gate * we use the value as is - except that if negative times are not allowed, 227*0Sstevel@tonic-gate * we will not accept a negative value otw. 228*0Sstevel@tonic-gate * 229*0Sstevel@tonic-gate * So for nfsv2/3 (uint32_t): 230*0Sstevel@tonic-gate * 231*0Sstevel@tonic-gate * If nfs_allow_preepoch_time is 232*0Sstevel@tonic-gate * FALSE, the maximum time value is INT32_MAX for 32-bit kernels and 233*0Sstevel@tonic-gate * UINT32_MAX for 64-bit kernels (to allow times larger than 2038) 234*0Sstevel@tonic-gate * and the minimum is zero. Note that in that case, a 32-bit application 235*0Sstevel@tonic-gate * running on a 64-bit kernel will not be able to access files with 236*0Sstevel@tonic-gate * the larger time values. 237*0Sstevel@tonic-gate * If nfs_allow_preepoch_time is TRUE, the maximum time value is INT32_MAX 238*0Sstevel@tonic-gate * for both kernel configurations and the minimum is INT32_MIN. 239*0Sstevel@tonic-gate * 240*0Sstevel@tonic-gate * And for nfsv4 (int64_t): 241*0Sstevel@tonic-gate * 242*0Sstevel@tonic-gate * nfsv4 allows for negative values in the protocol, and has a 64-bit 243*0Sstevel@tonic-gate * time field, so nfs_allow_preepoch_time can be ignored. 244*0Sstevel@tonic-gate */ 245*0Sstevel@tonic-gate #ifdef _KERNEL 246*0Sstevel@tonic-gate 247*0Sstevel@tonic-gate extern bool_t nfs_allow_preepoch_time; 248*0Sstevel@tonic-gate 249*0Sstevel@tonic-gate #ifdef _LP64 250*0Sstevel@tonic-gate 251*0Sstevel@tonic-gate /* 252*0Sstevel@tonic-gate * If no negative otw values are allowed, may use the full 32-bits of the 253*0Sstevel@tonic-gate * time to represent time later than 2038, by presenting the value as an 254*0Sstevel@tonic-gate * unsigned (but this can only be used by 64-bit apps due to cstat32 255*0Sstevel@tonic-gate * retrictions). If negative values are allowed, cannot represent times 256*0Sstevel@tonic-gate * after 2038. Either way, all 32 bits have a valid representation. 257*0Sstevel@tonic-gate */ 258*0Sstevel@tonic-gate 259*0Sstevel@tonic-gate /* Check if nfstime4 seconds (int64_t) can be stored in the system time */ 260*0Sstevel@tonic-gate #define NFS4_TIME_OK(tt) TRUE 261*0Sstevel@tonic-gate 262*0Sstevel@tonic-gate 263*0Sstevel@tonic-gate #define NFS3_TIME_OVERFLOW(tt) (FALSE) 264*0Sstevel@tonic-gate #define NFS2_TIME_OVERFLOW(tt) (FALSE) 265*0Sstevel@tonic-gate 266*0Sstevel@tonic-gate /* 267*0Sstevel@tonic-gate * check if a time_t (int64_t) is ok when preepoch times are allowed - 268*0Sstevel@tonic-gate * nfsv2/3: every 32-bit value is accepted, but can't overflow 64->32. 269*0Sstevel@tonic-gate * nfsv4: every value is valid. 270*0Sstevel@tonic-gate */ 271*0Sstevel@tonic-gate #define NFS_PREEPOCH_TIME_T_OK(tt) \ 272*0Sstevel@tonic-gate (((tt) >= (time_t)INT32_MIN) && ((tt) <= (time_t)INT32_MAX)) 273*0Sstevel@tonic-gate 274*0Sstevel@tonic-gate /* 275*0Sstevel@tonic-gate * check if a time_t (int64_t) is ok when preepoch times are not allowed - 276*0Sstevel@tonic-gate * nfsv2/3: every positive 32-bit value is accepted, but can't overflow 64->32. 277*0Sstevel@tonic-gate * nfsv4: every value is valid. 278*0Sstevel@tonic-gate */ 279*0Sstevel@tonic-gate #define NFS_NO_PREEPOCH_TIME_T_OK(tt) \ 280*0Sstevel@tonic-gate (((tt) >= 0) && ((tt) <= (time_t)(ulong_t)UINT32_MAX)) 281*0Sstevel@tonic-gate 282*0Sstevel@tonic-gate #else /* not _LP64 */ 283*0Sstevel@tonic-gate 284*0Sstevel@tonic-gate /* 285*0Sstevel@tonic-gate * Cannot represent times after 2038 in a 32-bit kernel, but we may wish to 286*0Sstevel@tonic-gate * restrict the use of negative values (which violate the protocol). 287*0Sstevel@tonic-gate * So if negative times allowed, all uint32 time values are valid. Otherwise 288*0Sstevel@tonic-gate * only those which are less than INT32_MAX (msb=0). 289*0Sstevel@tonic-gate * 290*0Sstevel@tonic-gate * NFSv4 uses int64_t for the time, so in a 32-bit kernel the nfsv4 value 291*0Sstevel@tonic-gate * must fit in an int32_t. 292*0Sstevel@tonic-gate */ 293*0Sstevel@tonic-gate 294*0Sstevel@tonic-gate /* Only allow signed 32-bit time values */ 295*0Sstevel@tonic-gate 296*0Sstevel@tonic-gate /* Check if an nfstime4 (int64_t) can be stored in the system time */ 297*0Sstevel@tonic-gate #define NFS4_TIME_OK(tt) \ 298*0Sstevel@tonic-gate (((tt) <= INT32_MAX) && ((tt) >= INT32_MIN)) 299*0Sstevel@tonic-gate 300*0Sstevel@tonic-gate #define NFS3_TIME_OVERFLOW(tt) ((tt) > INT32_MAX) 301*0Sstevel@tonic-gate #define NFS2_TIME_OVERFLOW(tt) ((tt) > INT32_MAX) 302*0Sstevel@tonic-gate 303*0Sstevel@tonic-gate /* 304*0Sstevel@tonic-gate * check if a time_t (int32_t) is ok when preepoch times are allowed - 305*0Sstevel@tonic-gate * every 32-bit value is accepted 306*0Sstevel@tonic-gate */ 307*0Sstevel@tonic-gate #define NFS_PREEPOCH_TIME_T_OK(tt) TRUE 308*0Sstevel@tonic-gate 309*0Sstevel@tonic-gate /* 310*0Sstevel@tonic-gate * check if a time_t (int32_t) is ok when preepoch times are not allowed - 311*0Sstevel@tonic-gate * only positive values are accepted. 312*0Sstevel@tonic-gate */ 313*0Sstevel@tonic-gate #define NFS_NO_PREEPOCH_TIME_T_OK(tt) ((tt) >= 0) 314*0Sstevel@tonic-gate 315*0Sstevel@tonic-gate #endif /* _LP64 */ 316*0Sstevel@tonic-gate 317*0Sstevel@tonic-gate /* Check if an nfstime3 (uint32_t) can be stored in the system time */ 318*0Sstevel@tonic-gate #define NFS3_TIME_OK(tt) \ 319*0Sstevel@tonic-gate (nfs_allow_preepoch_time || (!NFS3_TIME_OVERFLOW(tt))) 320*0Sstevel@tonic-gate 321*0Sstevel@tonic-gate /* Check if an nfs2_timeval (uint32_t) can be stored in the system time. */ 322*0Sstevel@tonic-gate #define NFS2_TIME_OK(tt) \ 323*0Sstevel@tonic-gate (nfs_allow_preepoch_time || (!NFS2_TIME_OVERFLOW(tt))) 324*0Sstevel@tonic-gate 325*0Sstevel@tonic-gate /* 326*0Sstevel@tonic-gate * Test if time_t (signed long) can be sent over the wire - for v2/3 only if: 327*0Sstevel@tonic-gate * 1. The time value can fit in a uint32_t; and 328*0Sstevel@tonic-gate * 2. Either the time value is positive or allow preepoch times. 329*0Sstevel@tonic-gate * No restrictions for nfsv4. 330*0Sstevel@tonic-gate */ 331*0Sstevel@tonic-gate #define NFS_TIME_T_OK(tt) \ 332*0Sstevel@tonic-gate (nfs_allow_preepoch_time ? \ 333*0Sstevel@tonic-gate NFS_PREEPOCH_TIME_T_OK(tt) : NFS_NO_PREEPOCH_TIME_T_OK(tt)) 334*0Sstevel@tonic-gate 335*0Sstevel@tonic-gate #define NFS4_TIME_T_OK(tt) TRUE 336*0Sstevel@tonic-gate 337*0Sstevel@tonic-gate /* Test if all attr times are valid */ 338*0Sstevel@tonic-gate #define NFS_VAP_TIME_OK(vap) \ 339*0Sstevel@tonic-gate (nfs_allow_preepoch_time ? \ 340*0Sstevel@tonic-gate (NFS_PREEPOCH_TIME_T_OK((vap)->va_atime.tv_sec) && \ 341*0Sstevel@tonic-gate NFS_PREEPOCH_TIME_T_OK((vap)->va_mtime.tv_sec) && \ 342*0Sstevel@tonic-gate NFS_PREEPOCH_TIME_T_OK((vap)->va_ctime.tv_sec)) : \ 343*0Sstevel@tonic-gate (NFS_NO_PREEPOCH_TIME_T_OK((vap)->va_atime.tv_sec) && \ 344*0Sstevel@tonic-gate NFS_NO_PREEPOCH_TIME_T_OK((vap)->va_mtime.tv_sec) && \ 345*0Sstevel@tonic-gate NFS_NO_PREEPOCH_TIME_T_OK((vap)->va_ctime.tv_sec))) 346*0Sstevel@tonic-gate 347*0Sstevel@tonic-gate #define NFS4_VAP_TIME_OK(vap) TRUE 348*0Sstevel@tonic-gate 349*0Sstevel@tonic-gate /* 350*0Sstevel@tonic-gate * To extend the sign or not extend the sign, that is the question. 351*0Sstevel@tonic-gate * Note: The correct way is to code a macro: 352*0Sstevel@tonic-gate * #define NFS_TIME_T_CONVERT(tt) \ 353*0Sstevel@tonic-gate * (nfs_allow_preepoch_time ? (int32_t)(tt) : (uint32_t)(tt)) 354*0Sstevel@tonic-gate * But the 64-bit compiler does not extend the sign in that case (why?) 355*0Sstevel@tonic-gate * so we'll do it the ugly way... 356*0Sstevel@tonic-gate */ 357*0Sstevel@tonic-gate #define NFS_TIME_T_CONVERT(systt, tt) \ 358*0Sstevel@tonic-gate if (nfs_allow_preepoch_time) { \ 359*0Sstevel@tonic-gate systt = (int32_t)(tt); \ 360*0Sstevel@tonic-gate } else { \ 361*0Sstevel@tonic-gate systt = (uint32_t)(tt); \ 362*0Sstevel@tonic-gate } 363*0Sstevel@tonic-gate 364*0Sstevel@tonic-gate /* macro to check for overflowed time attribute fields - version 3 */ 365*0Sstevel@tonic-gate #define NFS3_FATTR_TIME_OK(attrs) \ 366*0Sstevel@tonic-gate (NFS3_TIME_OK((attrs)->atime.seconds) && \ 367*0Sstevel@tonic-gate NFS3_TIME_OK((attrs)->mtime.seconds) && \ 368*0Sstevel@tonic-gate NFS3_TIME_OK((attrs)->ctime.seconds)) 369*0Sstevel@tonic-gate 370*0Sstevel@tonic-gate /* macro to check for overflowed time attribute fields - version 2 */ 371*0Sstevel@tonic-gate #define NFS2_FATTR_TIME_OK(attrs) \ 372*0Sstevel@tonic-gate (NFS2_TIME_OK((attrs)->na_atime.tv_sec) && \ 373*0Sstevel@tonic-gate NFS2_TIME_OK((attrs)->na_mtime.tv_sec) && \ 374*0Sstevel@tonic-gate NFS2_TIME_OK((attrs)->na_ctime.tv_sec)) 375*0Sstevel@tonic-gate 376*0Sstevel@tonic-gate /* Check that a size3 value is not overflowed */ 377*0Sstevel@tonic-gate #define NFS3_SIZE_OK(size) ((size) <= MAXOFFSET_T) 378*0Sstevel@tonic-gate 379*0Sstevel@tonic-gate #endif /* _KERNEL */ 380*0Sstevel@tonic-gate 381*0Sstevel@tonic-gate /* 382*0Sstevel@tonic-gate * Size of an fhandle in bytes 383*0Sstevel@tonic-gate */ 384*0Sstevel@tonic-gate #define NFS_FHSIZE 32 385*0Sstevel@tonic-gate 386*0Sstevel@tonic-gate struct nfs_fid { 387*0Sstevel@tonic-gate ushort_t nf_len; 388*0Sstevel@tonic-gate ushort_t nf_pad; 389*0Sstevel@tonic-gate char nf_data[NFS_FHSIZE]; 390*0Sstevel@tonic-gate }; 391*0Sstevel@tonic-gate 392*0Sstevel@tonic-gate /* 393*0Sstevel@tonic-gate * File access handle 394*0Sstevel@tonic-gate * This structure is the Sun server representation of a file. 395*0Sstevel@tonic-gate * It is handed out by a server for the client to use in further 396*0Sstevel@tonic-gate * file transactions. 397*0Sstevel@tonic-gate */ 398*0Sstevel@tonic-gate 399*0Sstevel@tonic-gate /* 400*0Sstevel@tonic-gate * This struct is only used to find the size of the data field in the 401*0Sstevel@tonic-gate * fhandle structure below. 402*0Sstevel@tonic-gate */ 403*0Sstevel@tonic-gate struct fhsize { 404*0Sstevel@tonic-gate fsid_t f1; 405*0Sstevel@tonic-gate ushort_t f2; 406*0Sstevel@tonic-gate char f3[4]; 407*0Sstevel@tonic-gate ushort_t f4; 408*0Sstevel@tonic-gate char f5[4]; 409*0Sstevel@tonic-gate }; 410*0Sstevel@tonic-gate #define NFS_FHMAXDATA ((NFS_FHSIZE - sizeof (struct fhsize) + 8) / 2) 411*0Sstevel@tonic-gate 412*0Sstevel@tonic-gate /* 413*0Sstevel@tonic-gate * The current nfs file handle size for version 3 is currently 32 which is 414*0Sstevel@tonic-gate * the same in version 2. It is the object returned from makefh 415*0Sstevel@tonic-gate * (fhandle_t) which is size of struct svcfh. 416*0Sstevel@tonic-gate * Thus, if the size of struct svcfh changes or if Version 3 uses some other 417*0Sstevel@tonic-gate * filehandle format, this constant may need to change. 418*0Sstevel@tonic-gate */ 419*0Sstevel@tonic-gate 420*0Sstevel@tonic-gate #define NFS3_CURFHSIZE 32 421*0Sstevel@tonic-gate 422*0Sstevel@tonic-gate /* 423*0Sstevel@tonic-gate * This is the actual definition of a filehandle. There is some dependence 424*0Sstevel@tonic-gate * on this layout in NFS-related code, particularly in the user-level lock 425*0Sstevel@tonic-gate * manager, so be careful about changing it. 426*0Sstevel@tonic-gate */ 427*0Sstevel@tonic-gate 428*0Sstevel@tonic-gate struct svcfh { 429*0Sstevel@tonic-gate fsid_t fh_fsid; /* filesystem id */ 430*0Sstevel@tonic-gate ushort_t fh_len; /* file number length */ 431*0Sstevel@tonic-gate char fh_data[NFS_FHMAXDATA]; /* and data */ 432*0Sstevel@tonic-gate ushort_t fh_xlen; /* export file number length */ 433*0Sstevel@tonic-gate char fh_xdata[NFS_FHMAXDATA]; /* and data */ 434*0Sstevel@tonic-gate }; 435*0Sstevel@tonic-gate 436*0Sstevel@tonic-gate typedef struct svcfh fhandle_t; 437*0Sstevel@tonic-gate 438*0Sstevel@tonic-gate /* 439*0Sstevel@tonic-gate * Arguments to remote write and writecache 440*0Sstevel@tonic-gate */ 441*0Sstevel@tonic-gate /* 442*0Sstevel@tonic-gate * The `over the wire' representation of the first four arguments. 443*0Sstevel@tonic-gate */ 444*0Sstevel@tonic-gate struct otw_nfswriteargs { 445*0Sstevel@tonic-gate fhandle_t otw_wa_fhandle; 446*0Sstevel@tonic-gate uint32_t otw_wa_begoff; 447*0Sstevel@tonic-gate uint32_t otw_wa_offset; 448*0Sstevel@tonic-gate uint32_t otw_wa_totcount; 449*0Sstevel@tonic-gate }; 450*0Sstevel@tonic-gate 451*0Sstevel@tonic-gate struct nfswriteargs { 452*0Sstevel@tonic-gate struct otw_nfswriteargs *wa_args; /* ptr to the otw arguments */ 453*0Sstevel@tonic-gate struct otw_nfswriteargs wa_args_buf; /* space for otw arguments */ 454*0Sstevel@tonic-gate uint32_t wa_count; 455*0Sstevel@tonic-gate char *wa_data; /* data to write (up to NFS_MAXDATA) */ 456*0Sstevel@tonic-gate mblk_t *wa_mblk; /* pointer to mblks containing data */ 457*0Sstevel@tonic-gate }; 458*0Sstevel@tonic-gate #define wa_fhandle wa_args->otw_wa_fhandle 459*0Sstevel@tonic-gate #define wa_begoff wa_args->otw_wa_begoff 460*0Sstevel@tonic-gate #define wa_offset wa_args->otw_wa_offset 461*0Sstevel@tonic-gate #define wa_totcount wa_args->otw_wa_totcount 462*0Sstevel@tonic-gate 463*0Sstevel@tonic-gate /* 464*0Sstevel@tonic-gate * NFS timeval struct using unsigned int as specified in V2 protocol. 465*0Sstevel@tonic-gate * tv_sec and tv_usec used to match existing code. 466*0Sstevel@tonic-gate */ 467*0Sstevel@tonic-gate struct nfs2_timeval { 468*0Sstevel@tonic-gate uint32_t tv_sec; 469*0Sstevel@tonic-gate uint32_t tv_usec; 470*0Sstevel@tonic-gate }; 471*0Sstevel@tonic-gate typedef struct nfs2_timeval nfs2_timeval; 472*0Sstevel@tonic-gate 473*0Sstevel@tonic-gate /* 474*0Sstevel@tonic-gate * File attributes 475*0Sstevel@tonic-gate */ 476*0Sstevel@tonic-gate struct nfsfattr { 477*0Sstevel@tonic-gate enum nfsftype na_type; /* file type */ 478*0Sstevel@tonic-gate uint32_t na_mode; /* protection mode bits */ 479*0Sstevel@tonic-gate uint32_t na_nlink; /* # hard links */ 480*0Sstevel@tonic-gate uint32_t na_uid; /* owner user id */ 481*0Sstevel@tonic-gate uint32_t na_gid; /* owner group id */ 482*0Sstevel@tonic-gate uint32_t na_size; /* file size in bytes */ 483*0Sstevel@tonic-gate uint32_t na_blocksize; /* prefered block size */ 484*0Sstevel@tonic-gate uint32_t na_rdev; /* special device # */ 485*0Sstevel@tonic-gate uint32_t na_blocks; /* Kb of disk used by file */ 486*0Sstevel@tonic-gate uint32_t na_fsid; /* device # */ 487*0Sstevel@tonic-gate uint32_t na_nodeid; /* inode # */ 488*0Sstevel@tonic-gate struct nfs2_timeval na_atime; /* time of last access */ 489*0Sstevel@tonic-gate struct nfs2_timeval na_mtime; /* time of last modification */ 490*0Sstevel@tonic-gate struct nfs2_timeval na_ctime; /* time of last change */ 491*0Sstevel@tonic-gate }; 492*0Sstevel@tonic-gate 493*0Sstevel@tonic-gate #define n2v_type(x) (NA_ISFIFO(x) ? VFIFO : nf_to_vt[(x)->na_type]) 494*0Sstevel@tonic-gate #define n2v_rdev(x) (NA_ISFIFO(x) ? 0 : (x)->na_rdev) 495*0Sstevel@tonic-gate 496*0Sstevel@tonic-gate /* 497*0Sstevel@tonic-gate * Arguments to remote read 498*0Sstevel@tonic-gate */ 499*0Sstevel@tonic-gate struct nfsreadargs { 500*0Sstevel@tonic-gate fhandle_t ra_fhandle; /* handle for file */ 501*0Sstevel@tonic-gate uint32_t ra_offset; /* byte offset in file */ 502*0Sstevel@tonic-gate uint32_t ra_count; /* immediate read count */ 503*0Sstevel@tonic-gate uint32_t ra_totcount; /* total read cnt (from this offset) */ 504*0Sstevel@tonic-gate }; 505*0Sstevel@tonic-gate 506*0Sstevel@tonic-gate /* 507*0Sstevel@tonic-gate * Status OK portion of remote read reply 508*0Sstevel@tonic-gate */ 509*0Sstevel@tonic-gate struct nfsrrok { 510*0Sstevel@tonic-gate struct nfsfattr rrok_attr; /* attributes, need for pagin */ 511*0Sstevel@tonic-gate uint32_t rrok_count; /* bytes of data */ 512*0Sstevel@tonic-gate char *rrok_data; /* data (up to NFS_MAXDATA bytes) */ 513*0Sstevel@tonic-gate uint_t rrok_bufsize; /* size of kmem_alloc'd buffer */ 514*0Sstevel@tonic-gate mblk_t *rrok_mp; /* mblk_t contains data for reply */ 515*0Sstevel@tonic-gate }; 516*0Sstevel@tonic-gate 517*0Sstevel@tonic-gate /* 518*0Sstevel@tonic-gate * Reply from remote read 519*0Sstevel@tonic-gate */ 520*0Sstevel@tonic-gate struct nfsrdresult { 521*0Sstevel@tonic-gate nfsstat rr_status; /* status of read */ 522*0Sstevel@tonic-gate union { 523*0Sstevel@tonic-gate struct nfsrrok rr_ok_u; /* attributes, need for pagin */ 524*0Sstevel@tonic-gate } rr_u; 525*0Sstevel@tonic-gate }; 526*0Sstevel@tonic-gate #define rr_ok rr_u.rr_ok_u 527*0Sstevel@tonic-gate #define rr_attr rr_u.rr_ok_u.rrok_attr 528*0Sstevel@tonic-gate #define rr_count rr_u.rr_ok_u.rrok_count 529*0Sstevel@tonic-gate #define rr_bufsize rr_u.rr_ok_u.rrok_bufsize 530*0Sstevel@tonic-gate #define rr_data rr_u.rr_ok_u.rrok_data 531*0Sstevel@tonic-gate #define rr_mp rr_u.rr_ok_u.rrok_mp 532*0Sstevel@tonic-gate 533*0Sstevel@tonic-gate /* 534*0Sstevel@tonic-gate * File attributes which can be set 535*0Sstevel@tonic-gate */ 536*0Sstevel@tonic-gate struct nfssattr { 537*0Sstevel@tonic-gate uint32_t sa_mode; /* protection mode bits */ 538*0Sstevel@tonic-gate uint32_t sa_uid; /* owner user id */ 539*0Sstevel@tonic-gate uint32_t sa_gid; /* owner group id */ 540*0Sstevel@tonic-gate uint32_t sa_size; /* file size in bytes */ 541*0Sstevel@tonic-gate struct nfs2_timeval sa_atime; /* time of last access */ 542*0Sstevel@tonic-gate struct nfs2_timeval sa_mtime; /* time of last modification */ 543*0Sstevel@tonic-gate }; 544*0Sstevel@tonic-gate 545*0Sstevel@tonic-gate 546*0Sstevel@tonic-gate /* 547*0Sstevel@tonic-gate * Reply status with file attributes 548*0Sstevel@tonic-gate */ 549*0Sstevel@tonic-gate struct nfsattrstat { 550*0Sstevel@tonic-gate nfsstat ns_status; /* reply status */ 551*0Sstevel@tonic-gate union { 552*0Sstevel@tonic-gate struct nfsfattr ns_attr_u; /* NFS_OK: file attributes */ 553*0Sstevel@tonic-gate } ns_u; 554*0Sstevel@tonic-gate }; 555*0Sstevel@tonic-gate #define ns_attr ns_u.ns_attr_u 556*0Sstevel@tonic-gate 557*0Sstevel@tonic-gate 558*0Sstevel@tonic-gate /* 559*0Sstevel@tonic-gate * NFS_OK part of read sym link reply union 560*0Sstevel@tonic-gate */ 561*0Sstevel@tonic-gate struct nfssrok { 562*0Sstevel@tonic-gate uint32_t srok_count; /* size of string */ 563*0Sstevel@tonic-gate char *srok_data; /* string (up to NFS_MAXPATHLEN bytes) */ 564*0Sstevel@tonic-gate }; 565*0Sstevel@tonic-gate 566*0Sstevel@tonic-gate /* 567*0Sstevel@tonic-gate * Result of reading symbolic link 568*0Sstevel@tonic-gate */ 569*0Sstevel@tonic-gate struct nfsrdlnres { 570*0Sstevel@tonic-gate nfsstat rl_status; /* status of symlink read */ 571*0Sstevel@tonic-gate union { 572*0Sstevel@tonic-gate struct nfssrok rl_srok_u; /* name of linked to */ 573*0Sstevel@tonic-gate } rl_u; 574*0Sstevel@tonic-gate }; 575*0Sstevel@tonic-gate #define rl_srok rl_u.rl_srok_u 576*0Sstevel@tonic-gate #define rl_count rl_u.rl_srok_u.srok_count 577*0Sstevel@tonic-gate #define rl_data rl_u.rl_srok_u.srok_data 578*0Sstevel@tonic-gate 579*0Sstevel@tonic-gate 580*0Sstevel@tonic-gate /* 581*0Sstevel@tonic-gate * Arguments to readdir 582*0Sstevel@tonic-gate */ 583*0Sstevel@tonic-gate struct nfsrddirargs { 584*0Sstevel@tonic-gate fhandle_t rda_fh; /* directory handle */ 585*0Sstevel@tonic-gate uint32_t rda_offset; /* offset in directory (opaque) */ 586*0Sstevel@tonic-gate uint32_t rda_count; /* number of directory bytes to read */ 587*0Sstevel@tonic-gate }; 588*0Sstevel@tonic-gate 589*0Sstevel@tonic-gate /* 590*0Sstevel@tonic-gate * NFS_OK part of readdir result 591*0Sstevel@tonic-gate */ 592*0Sstevel@tonic-gate struct nfsrdok { 593*0Sstevel@tonic-gate uint32_t rdok_offset; /* next offset (opaque) */ 594*0Sstevel@tonic-gate uint32_t rdok_size; /* size in bytes of entries */ 595*0Sstevel@tonic-gate bool_t rdok_eof; /* true if last entry is in result */ 596*0Sstevel@tonic-gate struct dirent64 *rdok_entries; /* variable number of entries */ 597*0Sstevel@tonic-gate }; 598*0Sstevel@tonic-gate 599*0Sstevel@tonic-gate /* 600*0Sstevel@tonic-gate * Readdir result 601*0Sstevel@tonic-gate */ 602*0Sstevel@tonic-gate struct nfsrddirres { 603*0Sstevel@tonic-gate nfsstat rd_status; 604*0Sstevel@tonic-gate uint_t rd_bufsize; /* client request size (not xdr'ed) */ 605*0Sstevel@tonic-gate union { 606*0Sstevel@tonic-gate struct nfsrdok rd_rdok_u; 607*0Sstevel@tonic-gate } rd_u; 608*0Sstevel@tonic-gate }; 609*0Sstevel@tonic-gate #define rd_rdok rd_u.rd_rdok_u 610*0Sstevel@tonic-gate #define rd_offset rd_u.rd_rdok_u.rdok_offset 611*0Sstevel@tonic-gate #define rd_size rd_u.rd_rdok_u.rdok_size 612*0Sstevel@tonic-gate #define rd_eof rd_u.rd_rdok_u.rdok_eof 613*0Sstevel@tonic-gate #define rd_entries rd_u.rd_rdok_u.rdok_entries 614*0Sstevel@tonic-gate 615*0Sstevel@tonic-gate 616*0Sstevel@tonic-gate /* 617*0Sstevel@tonic-gate * Arguments for directory operations 618*0Sstevel@tonic-gate */ 619*0Sstevel@tonic-gate struct nfsdiropargs { 620*0Sstevel@tonic-gate fhandle_t *da_fhandle; /* pointer to directory file handle */ 621*0Sstevel@tonic-gate char *da_name; /* name (up to NFS_MAXNAMLEN bytes) */ 622*0Sstevel@tonic-gate fhandle_t da_fhandle_buf; /* directory file handle */ 623*0Sstevel@tonic-gate int da_flags; /* flags, see below */ 624*0Sstevel@tonic-gate }; 625*0Sstevel@tonic-gate #define DA_FREENAME 1 626*0Sstevel@tonic-gate 627*0Sstevel@tonic-gate /* 628*0Sstevel@tonic-gate * NFS_OK part of directory operation result 629*0Sstevel@tonic-gate */ 630*0Sstevel@tonic-gate struct nfsdrok { 631*0Sstevel@tonic-gate fhandle_t drok_fhandle; /* result file handle */ 632*0Sstevel@tonic-gate struct nfsfattr drok_attr; /* result file attributes */ 633*0Sstevel@tonic-gate }; 634*0Sstevel@tonic-gate 635*0Sstevel@tonic-gate /* 636*0Sstevel@tonic-gate * Results from directory operation 637*0Sstevel@tonic-gate */ 638*0Sstevel@tonic-gate struct nfsdiropres { 639*0Sstevel@tonic-gate nfsstat dr_status; /* result status */ 640*0Sstevel@tonic-gate union { 641*0Sstevel@tonic-gate struct nfsdrok dr_drok_u; /* NFS_OK result */ 642*0Sstevel@tonic-gate } dr_u; 643*0Sstevel@tonic-gate }; 644*0Sstevel@tonic-gate #define dr_drok dr_u.dr_drok_u 645*0Sstevel@tonic-gate #define dr_fhandle dr_u.dr_drok_u.drok_fhandle 646*0Sstevel@tonic-gate #define dr_attr dr_u.dr_drok_u.drok_attr 647*0Sstevel@tonic-gate 648*0Sstevel@tonic-gate /* 649*0Sstevel@tonic-gate * arguments to setattr 650*0Sstevel@tonic-gate */ 651*0Sstevel@tonic-gate struct nfssaargs { 652*0Sstevel@tonic-gate fhandle_t saa_fh; /* fhandle of file to be set */ 653*0Sstevel@tonic-gate struct nfssattr saa_sa; /* new attributes */ 654*0Sstevel@tonic-gate }; 655*0Sstevel@tonic-gate 656*0Sstevel@tonic-gate /* 657*0Sstevel@tonic-gate * arguments to create and mkdir 658*0Sstevel@tonic-gate */ 659*0Sstevel@tonic-gate struct nfscreatargs { 660*0Sstevel@tonic-gate struct nfsdiropargs ca_da; /* file name to create and parent dir */ 661*0Sstevel@tonic-gate struct nfssattr *ca_sa; /* initial attributes */ 662*0Sstevel@tonic-gate struct nfssattr ca_sa_buf; /* space to store attributes */ 663*0Sstevel@tonic-gate }; 664*0Sstevel@tonic-gate 665*0Sstevel@tonic-gate /* 666*0Sstevel@tonic-gate * arguments to link 667*0Sstevel@tonic-gate */ 668*0Sstevel@tonic-gate struct nfslinkargs { 669*0Sstevel@tonic-gate fhandle_t *la_from; /* old file */ 670*0Sstevel@tonic-gate fhandle_t la_from_buf; /* old file */ 671*0Sstevel@tonic-gate struct nfsdiropargs la_to; /* new file and parent dir */ 672*0Sstevel@tonic-gate }; 673*0Sstevel@tonic-gate 674*0Sstevel@tonic-gate /* 675*0Sstevel@tonic-gate * arguments to rename 676*0Sstevel@tonic-gate */ 677*0Sstevel@tonic-gate struct nfsrnmargs { 678*0Sstevel@tonic-gate struct nfsdiropargs rna_from; /* old file and parent dir */ 679*0Sstevel@tonic-gate struct nfsdiropargs rna_to; /* new file and parent dir */ 680*0Sstevel@tonic-gate }; 681*0Sstevel@tonic-gate 682*0Sstevel@tonic-gate /* 683*0Sstevel@tonic-gate * arguments to symlink 684*0Sstevel@tonic-gate */ 685*0Sstevel@tonic-gate struct nfsslargs { 686*0Sstevel@tonic-gate struct nfsdiropargs sla_from; /* old file and parent dir */ 687*0Sstevel@tonic-gate char *sla_tnm; /* new name */ 688*0Sstevel@tonic-gate int sla_tnm_flags; /* flags for name */ 689*0Sstevel@tonic-gate struct nfssattr *sla_sa; /* attributes */ 690*0Sstevel@tonic-gate struct nfssattr sla_sa_buf; /* attributes buffer */ 691*0Sstevel@tonic-gate }; 692*0Sstevel@tonic-gate #define SLA_FREETNM 1 693*0Sstevel@tonic-gate 694*0Sstevel@tonic-gate /* 695*0Sstevel@tonic-gate * NFS_OK part of statfs operation 696*0Sstevel@tonic-gate */ 697*0Sstevel@tonic-gate struct nfsstatfsok { 698*0Sstevel@tonic-gate uint32_t fsok_tsize; /* preferred transfer size in bytes */ 699*0Sstevel@tonic-gate uint32_t fsok_bsize; /* fundamental file system block size */ 700*0Sstevel@tonic-gate uint32_t fsok_blocks; /* total blocks in file system */ 701*0Sstevel@tonic-gate uint32_t fsok_bfree; /* free blocks in fs */ 702*0Sstevel@tonic-gate uint32_t fsok_bavail; /* free blocks avail to non-superuser */ 703*0Sstevel@tonic-gate }; 704*0Sstevel@tonic-gate 705*0Sstevel@tonic-gate /* 706*0Sstevel@tonic-gate * Results of statfs operation 707*0Sstevel@tonic-gate */ 708*0Sstevel@tonic-gate struct nfsstatfs { 709*0Sstevel@tonic-gate nfsstat fs_status; /* result status */ 710*0Sstevel@tonic-gate union { 711*0Sstevel@tonic-gate struct nfsstatfsok fs_fsok_u; /* NFS_OK result */ 712*0Sstevel@tonic-gate } fs_u; 713*0Sstevel@tonic-gate }; 714*0Sstevel@tonic-gate #define fs_fsok fs_u.fs_fsok_u 715*0Sstevel@tonic-gate #define fs_tsize fs_u.fs_fsok_u.fsok_tsize 716*0Sstevel@tonic-gate #define fs_bsize fs_u.fs_fsok_u.fsok_bsize 717*0Sstevel@tonic-gate #define fs_blocks fs_u.fs_fsok_u.fsok_blocks 718*0Sstevel@tonic-gate #define fs_bfree fs_u.fs_fsok_u.fsok_bfree 719*0Sstevel@tonic-gate #define fs_bavail fs_u.fs_fsok_u.fsok_bavail 720*0Sstevel@tonic-gate 721*0Sstevel@tonic-gate #ifdef _KERNEL 722*0Sstevel@tonic-gate /* 723*0Sstevel@tonic-gate * XDR routines for handling structures defined above 724*0Sstevel@tonic-gate */ 725*0Sstevel@tonic-gate extern bool_t xdr_attrstat(XDR *, struct nfsattrstat *); 726*0Sstevel@tonic-gate extern bool_t xdr_fastattrstat(XDR *, struct nfsattrstat *); 727*0Sstevel@tonic-gate extern bool_t xdr_creatargs(XDR *, struct nfscreatargs *); 728*0Sstevel@tonic-gate extern bool_t xdr_diropargs(XDR *, struct nfsdiropargs *); 729*0Sstevel@tonic-gate extern bool_t xdr_diropres(XDR *, struct nfsdiropres *); 730*0Sstevel@tonic-gate extern bool_t xdr_fastdiropres(XDR *, struct nfsdiropres *); 731*0Sstevel@tonic-gate extern bool_t xdr_drok(XDR *, struct nfsdrok *); 732*0Sstevel@tonic-gate #ifdef _LITTLE_ENDIAN 733*0Sstevel@tonic-gate extern bool_t xdr_fastdrok(XDR *, struct nfsdrok *); 734*0Sstevel@tonic-gate extern bool_t xdr_fastfattr(XDR *, struct nfsfattr *); 735*0Sstevel@tonic-gate #endif 736*0Sstevel@tonic-gate extern bool_t xdr_fattr(XDR *, struct nfsfattr *); 737*0Sstevel@tonic-gate extern bool_t xdr_fhandle(XDR *, fhandle_t *); 738*0Sstevel@tonic-gate extern bool_t xdr_fastfhandle(XDR *, fhandle_t **); 739*0Sstevel@tonic-gate extern bool_t xdr_linkargs(XDR *, struct nfslinkargs *); 740*0Sstevel@tonic-gate extern bool_t xdr_rddirargs(XDR *, struct nfsrddirargs *); 741*0Sstevel@tonic-gate extern bool_t xdr_putrddirres(XDR *, struct nfsrddirres *); 742*0Sstevel@tonic-gate extern bool_t xdr_getrddirres(XDR *, struct nfsrddirres *); 743*0Sstevel@tonic-gate extern bool_t xdr_rdlnres(XDR *, struct nfsrdlnres *); 744*0Sstevel@tonic-gate extern bool_t xdr_rdresult(XDR *, struct nfsrdresult *); 745*0Sstevel@tonic-gate extern bool_t xdr_readargs(XDR *, struct nfsreadargs *); 746*0Sstevel@tonic-gate extern bool_t xdr_rnmargs(XDR *, struct nfsrnmargs *); 747*0Sstevel@tonic-gate extern bool_t xdr_rrok(XDR *, struct nfsrrok *); 748*0Sstevel@tonic-gate extern bool_t xdr_saargs(XDR *, struct nfssaargs *); 749*0Sstevel@tonic-gate extern bool_t xdr_sattr(XDR *, struct nfssattr *); 750*0Sstevel@tonic-gate extern bool_t xdr_slargs(XDR *, struct nfsslargs *); 751*0Sstevel@tonic-gate extern bool_t xdr_srok(XDR *, struct nfssrok *); 752*0Sstevel@tonic-gate extern bool_t xdr_nfs2_timeval(XDR *, struct nfs2_timeval *); 753*0Sstevel@tonic-gate extern bool_t xdr_writeargs(XDR *, struct nfswriteargs *); 754*0Sstevel@tonic-gate extern bool_t xdr_fsok(XDR *, struct nfsstatfsok *); 755*0Sstevel@tonic-gate #ifdef _LITTLE_ENDIAN 756*0Sstevel@tonic-gate extern bool_t xdr_fastfsok(XDR *, struct nfsstatfsok *); 757*0Sstevel@tonic-gate extern bool_t xdr_fastenum(XDR *, enum_t *); 758*0Sstevel@tonic-gate #endif 759*0Sstevel@tonic-gate extern bool_t xdr_statfs(XDR *, struct nfsstatfs *); 760*0Sstevel@tonic-gate extern bool_t xdr_faststatfs(XDR *, struct nfsstatfs *); 761*0Sstevel@tonic-gate #endif 762*0Sstevel@tonic-gate 763*0Sstevel@tonic-gate /* 764*0Sstevel@tonic-gate * Remote file service routines 765*0Sstevel@tonic-gate */ 766*0Sstevel@tonic-gate #define RFS_NULL 0 767*0Sstevel@tonic-gate #define RFS_GETATTR 1 768*0Sstevel@tonic-gate #define RFS_SETATTR 2 769*0Sstevel@tonic-gate #define RFS_ROOT 3 770*0Sstevel@tonic-gate #define RFS_LOOKUP 4 771*0Sstevel@tonic-gate #define RFS_READLINK 5 772*0Sstevel@tonic-gate #define RFS_READ 6 773*0Sstevel@tonic-gate #define RFS_WRITECACHE 7 774*0Sstevel@tonic-gate #define RFS_WRITE 8 775*0Sstevel@tonic-gate #define RFS_CREATE 9 776*0Sstevel@tonic-gate #define RFS_REMOVE 10 777*0Sstevel@tonic-gate #define RFS_RENAME 11 778*0Sstevel@tonic-gate #define RFS_LINK 12 779*0Sstevel@tonic-gate #define RFS_SYMLINK 13 780*0Sstevel@tonic-gate #define RFS_MKDIR 14 781*0Sstevel@tonic-gate #define RFS_RMDIR 15 782*0Sstevel@tonic-gate #define RFS_READDIR 16 783*0Sstevel@tonic-gate #define RFS_STATFS 17 784*0Sstevel@tonic-gate #define RFS_NPROC 18 785*0Sstevel@tonic-gate 786*0Sstevel@tonic-gate #ifdef _KERNEL 787*0Sstevel@tonic-gate /* 788*0Sstevel@tonic-gate * The NFS Version 2 service procedures 789*0Sstevel@tonic-gate */ 790*0Sstevel@tonic-gate struct exportinfo; /* defined in nfs/export.h */ 791*0Sstevel@tonic-gate struct servinfo; /* defined in nfs/nfs_clnt.h */ 792*0Sstevel@tonic-gate struct mntinfo; /* defined in nfs/nfs_clnt.h */ 793*0Sstevel@tonic-gate 794*0Sstevel@tonic-gate extern void rfs_getattr(fhandle_t *, struct nfsattrstat *, 795*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 796*0Sstevel@tonic-gate extern fhandle_t *rfs_getattr_getfh(fhandle_t *); 797*0Sstevel@tonic-gate extern void rfs_setattr(struct nfssaargs *, struct nfsattrstat *, 798*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 799*0Sstevel@tonic-gate extern fhandle_t *rfs_setattr_getfh(struct nfssaargs *); 800*0Sstevel@tonic-gate extern void rfs_lookup(struct nfsdiropargs *, struct nfsdiropres *, 801*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 802*0Sstevel@tonic-gate extern fhandle_t *rfs_lookup_getfh(struct nfsdiropargs *); 803*0Sstevel@tonic-gate extern void rfs_readlink(fhandle_t *, struct nfsrdlnres *, 804*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 805*0Sstevel@tonic-gate extern fhandle_t *rfs_readlink_getfh(fhandle_t *); 806*0Sstevel@tonic-gate extern void rfs_rlfree(struct nfsrdlnres *); 807*0Sstevel@tonic-gate extern void rfs_read(struct nfsreadargs *, struct nfsrdresult *, 808*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 809*0Sstevel@tonic-gate extern fhandle_t *rfs_read_getfh(struct nfsreadargs *); 810*0Sstevel@tonic-gate extern void rfs_rdfree(struct nfsrdresult *); 811*0Sstevel@tonic-gate extern void rfs_write_sync(struct nfswriteargs *, struct nfsattrstat *, 812*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 813*0Sstevel@tonic-gate extern void rfs_write(struct nfswriteargs *, struct nfsattrstat *, 814*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 815*0Sstevel@tonic-gate extern fhandle_t *rfs_write_getfh(struct nfswriteargs *); 816*0Sstevel@tonic-gate extern void rfs_create(struct nfscreatargs *, struct nfsdiropres *, 817*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 818*0Sstevel@tonic-gate extern fhandle_t *rfs_create_getfh(struct nfscreatargs *); 819*0Sstevel@tonic-gate extern void rfs_remove(struct nfsdiropargs *, enum nfsstat *, 820*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 821*0Sstevel@tonic-gate extern fhandle_t *rfs_remove_getfh(struct nfsdiropargs *); 822*0Sstevel@tonic-gate extern void rfs_rename(struct nfsrnmargs *, enum nfsstat *, 823*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 824*0Sstevel@tonic-gate extern fhandle_t *rfs_rename_getfh(struct nfsrnmargs *); 825*0Sstevel@tonic-gate extern void rfs_link(struct nfslinkargs *, enum nfsstat *, 826*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 827*0Sstevel@tonic-gate extern fhandle_t *rfs_link_getfh(struct nfslinkargs *); 828*0Sstevel@tonic-gate extern void rfs_symlink(struct nfsslargs *, enum nfsstat *, 829*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 830*0Sstevel@tonic-gate extern fhandle_t *rfs_symlink_getfh(struct nfsslargs *); 831*0Sstevel@tonic-gate extern void rfs_mkdir(struct nfscreatargs *, struct nfsdiropres *, 832*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 833*0Sstevel@tonic-gate extern fhandle_t *rfs_mkdir_getfh(struct nfscreatargs *); 834*0Sstevel@tonic-gate extern void rfs_rmdir(struct nfsdiropargs *, enum nfsstat *, 835*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 836*0Sstevel@tonic-gate extern fhandle_t *rfs_rmdir_getfh(struct nfsdiropargs *); 837*0Sstevel@tonic-gate extern void rfs_readdir(struct nfsrddirargs *, struct nfsrddirres *, 838*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 839*0Sstevel@tonic-gate extern fhandle_t *rfs_readdir_getfh(struct nfsrddirargs *); 840*0Sstevel@tonic-gate extern void rfs_rddirfree(struct nfsrddirres *); 841*0Sstevel@tonic-gate extern void rfs_statfs(fhandle_t *, struct nfsstatfs *, 842*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 843*0Sstevel@tonic-gate extern fhandle_t *rfs_statfs_getfh(fhandle_t *); 844*0Sstevel@tonic-gate extern void rfs_srvrinit(void); 845*0Sstevel@tonic-gate extern void rfs_srvrfini(void); 846*0Sstevel@tonic-gate 847*0Sstevel@tonic-gate /* 848*0Sstevel@tonic-gate * flags to define path types during Multi Component Lookups 849*0Sstevel@tonic-gate * using the public filehandle 850*0Sstevel@tonic-gate */ 851*0Sstevel@tonic-gate #define URLPATH 0x01 /* Universal Resource Locator path */ 852*0Sstevel@tonic-gate #define NATIVEPATH 0x02 /* Native path, i.e., via mount protocol */ 853*0Sstevel@tonic-gate #define SECURITY_QUERY 0x04 /* Security query */ 854*0Sstevel@tonic-gate 855*0Sstevel@tonic-gate enum nfs_svccounts {NFS_CALLS, NFS_BADCALLS}; /* index for svstat_ptr */ 856*0Sstevel@tonic-gate 857*0Sstevel@tonic-gate /* function defs for NFS kernel */ 858*0Sstevel@tonic-gate extern int nfs_waitfor_purge_complete(vnode_t *); 859*0Sstevel@tonic-gate extern int nfs_validate_caches(vnode_t *, cred_t *); 860*0Sstevel@tonic-gate extern void nfs_purge_caches(vnode_t *, int, cred_t *); 861*0Sstevel@tonic-gate extern void nfs_purge_rddir_cache(vnode_t *); 862*0Sstevel@tonic-gate extern void nfs_attrcache(vnode_t *, struct nfsfattr *, hrtime_t); 863*0Sstevel@tonic-gate extern int nfs_cache_fattr(vnode_t *, struct nfsfattr *, vattr_t *, 864*0Sstevel@tonic-gate hrtime_t, cred_t *); 865*0Sstevel@tonic-gate extern void nfs_attr_cache(vnode_t *, vattr_t *, hrtime_t, cred_t *); 866*0Sstevel@tonic-gate extern void nfs_attrcache_va(vnode_t *, struct vattr *); 867*0Sstevel@tonic-gate extern int nfs_getattr_otw(vnode_t *, struct vattr *, cred_t *); 868*0Sstevel@tonic-gate extern int nfsgetattr(vnode_t *, struct vattr *, cred_t *); 869*0Sstevel@tonic-gate extern int nattr_to_vattr(vnode_t *, struct nfsfattr *, struct vattr *); 870*0Sstevel@tonic-gate extern void nfs_async_manager(struct vfs *); 871*0Sstevel@tonic-gate extern void nfs_async_manager_stop(struct vfs *); 872*0Sstevel@tonic-gate extern void nfs_async_stop(struct vfs *); 873*0Sstevel@tonic-gate extern int nfs_async_stop_sig(struct vfs *); 874*0Sstevel@tonic-gate extern int nfs_clntinit(void); 875*0Sstevel@tonic-gate extern void nfs_clntfini(void); 876*0Sstevel@tonic-gate extern int nfstsize(void); 877*0Sstevel@tonic-gate extern int nfs_srvinit(void); 878*0Sstevel@tonic-gate extern void nfs_srvfini(void); 879*0Sstevel@tonic-gate extern int vattr_to_sattr(struct vattr *, struct nfssattr *); 880*0Sstevel@tonic-gate extern void setdiropargs(struct nfsdiropargs *, char *, vnode_t *); 881*0Sstevel@tonic-gate extern int setdirgid(vnode_t *, gid_t *, cred_t *); 882*0Sstevel@tonic-gate extern int setdirmode(vnode_t *, mode_t *, cred_t *); 883*0Sstevel@tonic-gate extern int newnum(void); 884*0Sstevel@tonic-gate extern char *newname(void); 885*0Sstevel@tonic-gate extern int nfs_atoi(char *); 886*0Sstevel@tonic-gate extern int nfs_subrinit(void); 887*0Sstevel@tonic-gate extern void nfs_subrfini(void); 888*0Sstevel@tonic-gate extern enum nfsstat puterrno(int); 889*0Sstevel@tonic-gate extern int geterrno(enum nfsstat); 890*0Sstevel@tonic-gate extern int nfsinit(int, char *); 891*0Sstevel@tonic-gate extern void nfsfini(void); 892*0Sstevel@tonic-gate extern int nfs_vfsinit(void); 893*0Sstevel@tonic-gate extern void nfs_vfsfini(void); 894*0Sstevel@tonic-gate extern int nfs_dump(vnode_t *, caddr_t, int, int); 895*0Sstevel@tonic-gate extern void nfs_perror(int error, char *fmt, ...); 896*0Sstevel@tonic-gate extern void nfs_cmn_err(int error, int level, char *fmt, ...); 897*0Sstevel@tonic-gate extern int nfs_addcllock(vnode_t *vp, struct flock64 *bfp); 898*0Sstevel@tonic-gate extern void nfs_rmcllock(vnode_t *vp, struct flock64 *bfp); 899*0Sstevel@tonic-gate extern void nfs_lockrelease(vnode_t *vp, int flag, 900*0Sstevel@tonic-gate offset_t offset, cred_t *credp); 901*0Sstevel@tonic-gate extern int vattr_to_nattr(struct vattr *, struct nfsfattr *); 902*0Sstevel@tonic-gate extern int mount_root(char *, char *, int, struct nfs_args *, int *); 903*0Sstevel@tonic-gate extern void nfs_lockcompletion(vnode_t *vp, int cmd); 904*0Sstevel@tonic-gate extern void nfs_add_locking_id(vnode_t *, pid_t, int, char *, int); 905*0Sstevel@tonic-gate extern void nfs3copyfh(caddr_t, vnode_t *); 906*0Sstevel@tonic-gate extern void nfscopyfh(caddr_t, vnode_t *); 907*0Sstevel@tonic-gate extern int nfs3lookup(vnode_t *, char *, vnode_t **, struct pathname *, 908*0Sstevel@tonic-gate int, vnode_t *, cred_t *, int); 909*0Sstevel@tonic-gate extern int nfslookup(vnode_t *, char *, vnode_t **, struct pathname *, 910*0Sstevel@tonic-gate int, vnode_t *, cred_t *, int); 911*0Sstevel@tonic-gate extern void sv_free(struct servinfo *); 912*0Sstevel@tonic-gate extern int nfsauth_access(struct exportinfo *exi, struct svc_req *req); 913*0Sstevel@tonic-gate extern void nfsauth_init(); 914*0Sstevel@tonic-gate extern void nfsauth_fini(); 915*0Sstevel@tonic-gate extern int nfs_setopts(vnode_t *vp, model_t model, struct nfs_args *args); 916*0Sstevel@tonic-gate extern void nfs_srv_stop_all(void); 917*0Sstevel@tonic-gate extern void nfs_srv_quiesce_all(void); 918*0Sstevel@tonic-gate extern void (*nfs_srv_quiesce_func)(void); 919*0Sstevel@tonic-gate extern time_t rfs4_lease_time; 920*0Sstevel@tonic-gate extern time_t rfs4_grace_period; 921*0Sstevel@tonic-gate 922*0Sstevel@tonic-gate extern kstat_named_t *global_svstat_ptr[]; 923*0Sstevel@tonic-gate 924*0Sstevel@tonic-gate extern krwlock_t rroklock; 925*0Sstevel@tonic-gate extern vtype_t nf_to_vt[]; 926*0Sstevel@tonic-gate extern kstat_named_t *rfsproccnt_v2_ptr; 927*0Sstevel@tonic-gate extern kmutex_t nfs_minor_lock; 928*0Sstevel@tonic-gate extern int nfs_major; 929*0Sstevel@tonic-gate extern int nfs_minor; 930*0Sstevel@tonic-gate extern vfsops_t *nfs_vfsops; 931*0Sstevel@tonic-gate extern struct vnodeops *nfs_vnodeops; 932*0Sstevel@tonic-gate extern const struct fs_operation_def nfs_vnodeops_template[]; 933*0Sstevel@tonic-gate extern int nfsfstyp; 934*0Sstevel@tonic-gate 935*0Sstevel@tonic-gate /* 936*0Sstevel@tonic-gate * Per-zone stats as consumed by nfsstat(1m) 937*0Sstevel@tonic-gate */ 938*0Sstevel@tonic-gate struct nfs_version_stats { 939*0Sstevel@tonic-gate kstat_named_t *aclreqcnt_ptr; /* nfs_acl:0:aclreqcnt_v? */ 940*0Sstevel@tonic-gate kstat_named_t *aclproccnt_ptr; /* nfs_acl:0:aclproccnt_v? */ 941*0Sstevel@tonic-gate kstat_named_t *rfsreqcnt_ptr; /* nfs:0:rfsreqcnt_v? */ 942*0Sstevel@tonic-gate kstat_named_t *rfsproccnt_ptr; /* nfs:0:rfsproccnt_v? */ 943*0Sstevel@tonic-gate }; 944*0Sstevel@tonic-gate 945*0Sstevel@tonic-gate /* 946*0Sstevel@tonic-gate * A bit of asymmetry: nfs:0:nfs_client isn't part of this structure. 947*0Sstevel@tonic-gate */ 948*0Sstevel@tonic-gate struct nfs_stats { 949*0Sstevel@tonic-gate kstat_named_t *nfs_stats_svstat_ptr[NFS_VERSMAX + 1]; 950*0Sstevel@tonic-gate struct nfs_version_stats nfs_stats_v2; 951*0Sstevel@tonic-gate struct nfs_version_stats nfs_stats_v3; 952*0Sstevel@tonic-gate struct nfs_version_stats nfs_stats_v4; 953*0Sstevel@tonic-gate }; 954*0Sstevel@tonic-gate 955*0Sstevel@tonic-gate /* 956*0Sstevel@tonic-gate * Key used to retrieve counters. 957*0Sstevel@tonic-gate */ 958*0Sstevel@tonic-gate extern zone_key_t nfsstat_zone_key; 959*0Sstevel@tonic-gate 960*0Sstevel@tonic-gate /* 961*0Sstevel@tonic-gate * Zone callback functions. 962*0Sstevel@tonic-gate */ 963*0Sstevel@tonic-gate extern void *nfsstat_zone_init(zoneid_t); 964*0Sstevel@tonic-gate extern void nfsstat_zone_fini(zoneid_t, void *); 965*0Sstevel@tonic-gate 966*0Sstevel@tonic-gate #endif /* _KERNEL */ 967*0Sstevel@tonic-gate 968*0Sstevel@tonic-gate /* 969*0Sstevel@tonic-gate * Version 3 declarations and definitions. 970*0Sstevel@tonic-gate */ 971*0Sstevel@tonic-gate 972*0Sstevel@tonic-gate #define NFS3_FHSIZE 64 973*0Sstevel@tonic-gate #define NFS3_COOKIEVERFSIZE 8 974*0Sstevel@tonic-gate #define NFS3_CREATEVERFSIZE 8 975*0Sstevel@tonic-gate #define NFS3_WRITEVERFSIZE 8 976*0Sstevel@tonic-gate 977*0Sstevel@tonic-gate typedef char *filename3; 978*0Sstevel@tonic-gate 979*0Sstevel@tonic-gate typedef char *nfspath3; 980*0Sstevel@tonic-gate 981*0Sstevel@tonic-gate #define nfs3nametoolong ((char *)-1) 982*0Sstevel@tonic-gate 983*0Sstevel@tonic-gate typedef uint64 fileid3; 984*0Sstevel@tonic-gate 985*0Sstevel@tonic-gate typedef uint64 cookie3; 986*0Sstevel@tonic-gate 987*0Sstevel@tonic-gate typedef uint32 uid3; 988*0Sstevel@tonic-gate 989*0Sstevel@tonic-gate typedef uint32 gid3; 990*0Sstevel@tonic-gate 991*0Sstevel@tonic-gate typedef uint64 size3; 992*0Sstevel@tonic-gate 993*0Sstevel@tonic-gate typedef uint64 offset3; 994*0Sstevel@tonic-gate 995*0Sstevel@tonic-gate typedef uint32 mode3; 996*0Sstevel@tonic-gate 997*0Sstevel@tonic-gate typedef uint32 count3; 998*0Sstevel@tonic-gate 999*0Sstevel@tonic-gate /* 1000*0Sstevel@tonic-gate * These three are really opaque arrays, but we treat them as 1001*0Sstevel@tonic-gate * uint64 for efficiency sake 1002*0Sstevel@tonic-gate */ 1003*0Sstevel@tonic-gate typedef uint64 cookieverf3; 1004*0Sstevel@tonic-gate 1005*0Sstevel@tonic-gate typedef uint64 createverf3; 1006*0Sstevel@tonic-gate 1007*0Sstevel@tonic-gate typedef uint64 writeverf3; 1008*0Sstevel@tonic-gate 1009*0Sstevel@tonic-gate struct nfs_fh3 { 1010*0Sstevel@tonic-gate uint_t fh3_length; 1011*0Sstevel@tonic-gate union nfs_fh3_u { 1012*0Sstevel@tonic-gate struct nfs_fh3_i { 1013*0Sstevel@tonic-gate fhandle_t fh3_i; 1014*0Sstevel@tonic-gate } nfs_fh3_i; 1015*0Sstevel@tonic-gate char data[NFS3_FHSIZE]; 1016*0Sstevel@tonic-gate } fh3_u; 1017*0Sstevel@tonic-gate }; 1018*0Sstevel@tonic-gate #define fh3_fsid fh3_u.nfs_fh3_i.fh3_i.fh_fsid 1019*0Sstevel@tonic-gate #define fh3_len fh3_u.nfs_fh3_i.fh3_i.fh_len /* fid length */ 1020*0Sstevel@tonic-gate #define fh3_data fh3_u.nfs_fh3_i.fh3_i.fh_data /* fid bytes */ 1021*0Sstevel@tonic-gate #define fh3_xlen fh3_u.nfs_fh3_i.fh3_i.fh_xlen 1022*0Sstevel@tonic-gate #define fh3_xdata fh3_u.nfs_fh3_i.fh3_i.fh_xdata 1023*0Sstevel@tonic-gate typedef struct nfs_fh3 nfs_fh3; 1024*0Sstevel@tonic-gate 1025*0Sstevel@tonic-gate /* 1026*0Sstevel@tonic-gate * Two elements were added to the 1027*0Sstevel@tonic-gate * diropargs3 structure for performance (xdr-inlining). 1028*0Sstevel@tonic-gate * They are not included as part of the args 1029*0Sstevel@tonic-gate * that are encoded or decoded: 1030*0Sstevel@tonic-gate * dirp - ptr to the nfs_fh3 1031*0Sstevel@tonic-gate * flag indicating when to free the name that was 1032*0Sstevel@tonic-gate * allocated during decode. 1033*0Sstevel@tonic-gate */ 1034*0Sstevel@tonic-gate struct diropargs3 { 1035*0Sstevel@tonic-gate nfs_fh3 *dirp; 1036*0Sstevel@tonic-gate nfs_fh3 dir; 1037*0Sstevel@tonic-gate filename3 name; 1038*0Sstevel@tonic-gate int flags; 1039*0Sstevel@tonic-gate }; 1040*0Sstevel@tonic-gate typedef struct diropargs3 diropargs3; 1041*0Sstevel@tonic-gate 1042*0Sstevel@tonic-gate struct nfstime3 { 1043*0Sstevel@tonic-gate uint32 seconds; 1044*0Sstevel@tonic-gate uint32 nseconds; 1045*0Sstevel@tonic-gate }; 1046*0Sstevel@tonic-gate typedef struct nfstime3 nfstime3; 1047*0Sstevel@tonic-gate 1048*0Sstevel@tonic-gate struct specdata3 { 1049*0Sstevel@tonic-gate uint32 specdata1; 1050*0Sstevel@tonic-gate uint32 specdata2; 1051*0Sstevel@tonic-gate }; 1052*0Sstevel@tonic-gate typedef struct specdata3 specdata3; 1053*0Sstevel@tonic-gate 1054*0Sstevel@tonic-gate enum nfsstat3 { 1055*0Sstevel@tonic-gate NFS3_OK = 0, 1056*0Sstevel@tonic-gate NFS3ERR_PERM = 1, 1057*0Sstevel@tonic-gate NFS3ERR_NOENT = 2, 1058*0Sstevel@tonic-gate NFS3ERR_IO = 5, 1059*0Sstevel@tonic-gate NFS3ERR_NXIO = 6, 1060*0Sstevel@tonic-gate NFS3ERR_ACCES = 13, 1061*0Sstevel@tonic-gate NFS3ERR_EXIST = 17, 1062*0Sstevel@tonic-gate NFS3ERR_XDEV = 18, 1063*0Sstevel@tonic-gate NFS3ERR_NODEV = 19, 1064*0Sstevel@tonic-gate NFS3ERR_NOTDIR = 20, 1065*0Sstevel@tonic-gate NFS3ERR_ISDIR = 21, 1066*0Sstevel@tonic-gate NFS3ERR_INVAL = 22, 1067*0Sstevel@tonic-gate NFS3ERR_FBIG = 27, 1068*0Sstevel@tonic-gate NFS3ERR_NOSPC = 28, 1069*0Sstevel@tonic-gate NFS3ERR_ROFS = 30, 1070*0Sstevel@tonic-gate NFS3ERR_MLINK = 31, 1071*0Sstevel@tonic-gate NFS3ERR_NAMETOOLONG = 63, 1072*0Sstevel@tonic-gate NFS3ERR_NOTEMPTY = 66, 1073*0Sstevel@tonic-gate NFS3ERR_DQUOT = 69, 1074*0Sstevel@tonic-gate NFS3ERR_STALE = 70, 1075*0Sstevel@tonic-gate NFS3ERR_REMOTE = 71, 1076*0Sstevel@tonic-gate NFS3ERR_BADHANDLE = 10001, 1077*0Sstevel@tonic-gate NFS3ERR_NOT_SYNC = 10002, 1078*0Sstevel@tonic-gate NFS3ERR_BAD_COOKIE = 10003, 1079*0Sstevel@tonic-gate NFS3ERR_NOTSUPP = 10004, 1080*0Sstevel@tonic-gate NFS3ERR_TOOSMALL = 10005, 1081*0Sstevel@tonic-gate NFS3ERR_SERVERFAULT = 10006, 1082*0Sstevel@tonic-gate NFS3ERR_BADTYPE = 10007, 1083*0Sstevel@tonic-gate NFS3ERR_JUKEBOX = 10008 1084*0Sstevel@tonic-gate }; 1085*0Sstevel@tonic-gate typedef enum nfsstat3 nfsstat3; 1086*0Sstevel@tonic-gate 1087*0Sstevel@tonic-gate enum ftype3 { 1088*0Sstevel@tonic-gate NF3REG = 1, 1089*0Sstevel@tonic-gate NF3DIR = 2, 1090*0Sstevel@tonic-gate NF3BLK = 3, 1091*0Sstevel@tonic-gate NF3CHR = 4, 1092*0Sstevel@tonic-gate NF3LNK = 5, 1093*0Sstevel@tonic-gate NF3SOCK = 6, 1094*0Sstevel@tonic-gate NF3FIFO = 7 1095*0Sstevel@tonic-gate }; 1096*0Sstevel@tonic-gate typedef enum ftype3 ftype3; 1097*0Sstevel@tonic-gate 1098*0Sstevel@tonic-gate struct fattr3 { 1099*0Sstevel@tonic-gate ftype3 type; 1100*0Sstevel@tonic-gate mode3 mode; 1101*0Sstevel@tonic-gate uint32 nlink; 1102*0Sstevel@tonic-gate uid3 uid; 1103*0Sstevel@tonic-gate gid3 gid; 1104*0Sstevel@tonic-gate size3 size; 1105*0Sstevel@tonic-gate size3 used; 1106*0Sstevel@tonic-gate specdata3 rdev; 1107*0Sstevel@tonic-gate uint64 fsid; 1108*0Sstevel@tonic-gate fileid3 fileid; 1109*0Sstevel@tonic-gate nfstime3 atime; 1110*0Sstevel@tonic-gate nfstime3 mtime; 1111*0Sstevel@tonic-gate nfstime3 ctime; 1112*0Sstevel@tonic-gate }; 1113*0Sstevel@tonic-gate typedef struct fattr3 fattr3; 1114*0Sstevel@tonic-gate 1115*0Sstevel@tonic-gate #define NFS3_SIZEOF_FATTR3 (21) 1116*0Sstevel@tonic-gate 1117*0Sstevel@tonic-gate #ifdef _KERNEL 1118*0Sstevel@tonic-gate struct fattr3_res { 1119*0Sstevel@tonic-gate nfsstat3 status; 1120*0Sstevel@tonic-gate vattr_t *vap; 1121*0Sstevel@tonic-gate vnode_t *vp; 1122*0Sstevel@tonic-gate }; 1123*0Sstevel@tonic-gate typedef struct fattr3_res fattr3_res; 1124*0Sstevel@tonic-gate #endif /* _KERNEL */ 1125*0Sstevel@tonic-gate 1126*0Sstevel@tonic-gate struct post_op_attr { 1127*0Sstevel@tonic-gate bool_t attributes; 1128*0Sstevel@tonic-gate fattr3 attr; 1129*0Sstevel@tonic-gate }; 1130*0Sstevel@tonic-gate typedef struct post_op_attr post_op_attr; 1131*0Sstevel@tonic-gate 1132*0Sstevel@tonic-gate #ifdef _KERNEL 1133*0Sstevel@tonic-gate struct post_op_vattr { 1134*0Sstevel@tonic-gate bool_t attributes; 1135*0Sstevel@tonic-gate fattr3_res fres; 1136*0Sstevel@tonic-gate }; 1137*0Sstevel@tonic-gate typedef struct post_op_vattr post_op_vattr; 1138*0Sstevel@tonic-gate #endif /* _KERNEL */ 1139*0Sstevel@tonic-gate 1140*0Sstevel@tonic-gate struct wcc_attr { 1141*0Sstevel@tonic-gate size3 size; 1142*0Sstevel@tonic-gate nfstime3 mtime; 1143*0Sstevel@tonic-gate nfstime3 ctime; 1144*0Sstevel@tonic-gate }; 1145*0Sstevel@tonic-gate typedef struct wcc_attr wcc_attr; 1146*0Sstevel@tonic-gate 1147*0Sstevel@tonic-gate struct pre_op_attr { 1148*0Sstevel@tonic-gate bool_t attributes; 1149*0Sstevel@tonic-gate wcc_attr attr; 1150*0Sstevel@tonic-gate }; 1151*0Sstevel@tonic-gate typedef struct pre_op_attr pre_op_attr; 1152*0Sstevel@tonic-gate 1153*0Sstevel@tonic-gate struct wcc_data { 1154*0Sstevel@tonic-gate pre_op_attr before; 1155*0Sstevel@tonic-gate post_op_attr after; 1156*0Sstevel@tonic-gate }; 1157*0Sstevel@tonic-gate typedef struct wcc_data wcc_data; 1158*0Sstevel@tonic-gate 1159*0Sstevel@tonic-gate struct post_op_fh3 { 1160*0Sstevel@tonic-gate bool_t handle_follows; 1161*0Sstevel@tonic-gate nfs_fh3 handle; 1162*0Sstevel@tonic-gate }; 1163*0Sstevel@tonic-gate typedef struct post_op_fh3 post_op_fh3; 1164*0Sstevel@tonic-gate 1165*0Sstevel@tonic-gate enum time_how { 1166*0Sstevel@tonic-gate DONT_CHANGE = 0, 1167*0Sstevel@tonic-gate SET_TO_SERVER_TIME = 1, 1168*0Sstevel@tonic-gate SET_TO_CLIENT_TIME = 2 1169*0Sstevel@tonic-gate }; 1170*0Sstevel@tonic-gate typedef enum time_how time_how; 1171*0Sstevel@tonic-gate 1172*0Sstevel@tonic-gate struct set_mode3 { 1173*0Sstevel@tonic-gate bool_t set_it; 1174*0Sstevel@tonic-gate mode3 mode; 1175*0Sstevel@tonic-gate }; 1176*0Sstevel@tonic-gate typedef struct set_mode3 set_mode3; 1177*0Sstevel@tonic-gate 1178*0Sstevel@tonic-gate struct set_uid3 { 1179*0Sstevel@tonic-gate bool_t set_it; 1180*0Sstevel@tonic-gate uid3 uid; 1181*0Sstevel@tonic-gate }; 1182*0Sstevel@tonic-gate typedef struct set_uid3 set_uid3; 1183*0Sstevel@tonic-gate 1184*0Sstevel@tonic-gate struct set_gid3 { 1185*0Sstevel@tonic-gate bool_t set_it; 1186*0Sstevel@tonic-gate gid3 gid; 1187*0Sstevel@tonic-gate }; 1188*0Sstevel@tonic-gate typedef struct set_gid3 set_gid3; 1189*0Sstevel@tonic-gate 1190*0Sstevel@tonic-gate struct set_size3 { 1191*0Sstevel@tonic-gate bool_t set_it; 1192*0Sstevel@tonic-gate size3 size; 1193*0Sstevel@tonic-gate }; 1194*0Sstevel@tonic-gate typedef struct set_size3 set_size3; 1195*0Sstevel@tonic-gate 1196*0Sstevel@tonic-gate struct set_atime { 1197*0Sstevel@tonic-gate time_how set_it; 1198*0Sstevel@tonic-gate nfstime3 atime; 1199*0Sstevel@tonic-gate }; 1200*0Sstevel@tonic-gate typedef struct set_atime set_atime; 1201*0Sstevel@tonic-gate 1202*0Sstevel@tonic-gate struct set_mtime { 1203*0Sstevel@tonic-gate time_how set_it; 1204*0Sstevel@tonic-gate nfstime3 mtime; 1205*0Sstevel@tonic-gate }; 1206*0Sstevel@tonic-gate typedef struct set_mtime set_mtime; 1207*0Sstevel@tonic-gate 1208*0Sstevel@tonic-gate struct sattr3 { 1209*0Sstevel@tonic-gate set_mode3 mode; 1210*0Sstevel@tonic-gate set_uid3 uid; 1211*0Sstevel@tonic-gate set_gid3 gid; 1212*0Sstevel@tonic-gate set_size3 size; 1213*0Sstevel@tonic-gate set_atime atime; 1214*0Sstevel@tonic-gate set_mtime mtime; 1215*0Sstevel@tonic-gate }; 1216*0Sstevel@tonic-gate typedef struct sattr3 sattr3; 1217*0Sstevel@tonic-gate 1218*0Sstevel@tonic-gate /* 1219*0Sstevel@tonic-gate * A couple of defines to make resok and resfail look like the 1220*0Sstevel@tonic-gate * correct things in a response type independent manner. 1221*0Sstevel@tonic-gate */ 1222*0Sstevel@tonic-gate #define resok res_u.ok 1223*0Sstevel@tonic-gate #define resfail res_u.fail 1224*0Sstevel@tonic-gate 1225*0Sstevel@tonic-gate struct GETATTR3args { 1226*0Sstevel@tonic-gate nfs_fh3 object; 1227*0Sstevel@tonic-gate }; 1228*0Sstevel@tonic-gate typedef struct GETATTR3args GETATTR3args; 1229*0Sstevel@tonic-gate 1230*0Sstevel@tonic-gate struct GETATTR3resok { 1231*0Sstevel@tonic-gate fattr3 obj_attributes; 1232*0Sstevel@tonic-gate }; 1233*0Sstevel@tonic-gate typedef struct GETATTR3resok GETATTR3resok; 1234*0Sstevel@tonic-gate 1235*0Sstevel@tonic-gate struct GETATTR3res { 1236*0Sstevel@tonic-gate nfsstat3 status; 1237*0Sstevel@tonic-gate union { 1238*0Sstevel@tonic-gate GETATTR3resok ok; 1239*0Sstevel@tonic-gate } res_u; 1240*0Sstevel@tonic-gate }; 1241*0Sstevel@tonic-gate typedef struct GETATTR3res GETATTR3res; 1242*0Sstevel@tonic-gate 1243*0Sstevel@tonic-gate #ifdef _KERNEL 1244*0Sstevel@tonic-gate struct GETATTR3vres { 1245*0Sstevel@tonic-gate nfsstat3 status; 1246*0Sstevel@tonic-gate fattr3_res fres; 1247*0Sstevel@tonic-gate }; 1248*0Sstevel@tonic-gate typedef struct GETATTR3vres GETATTR3vres; 1249*0Sstevel@tonic-gate #endif /* _KERNEL */ 1250*0Sstevel@tonic-gate 1251*0Sstevel@tonic-gate struct sattrguard3 { 1252*0Sstevel@tonic-gate bool_t check; 1253*0Sstevel@tonic-gate nfstime3 obj_ctime; 1254*0Sstevel@tonic-gate }; 1255*0Sstevel@tonic-gate typedef struct sattrguard3 sattrguard3; 1256*0Sstevel@tonic-gate 1257*0Sstevel@tonic-gate struct SETATTR3args { 1258*0Sstevel@tonic-gate nfs_fh3 object; 1259*0Sstevel@tonic-gate sattr3 new_attributes; 1260*0Sstevel@tonic-gate sattrguard3 guard; 1261*0Sstevel@tonic-gate }; 1262*0Sstevel@tonic-gate typedef struct SETATTR3args SETATTR3args; 1263*0Sstevel@tonic-gate 1264*0Sstevel@tonic-gate struct SETATTR3resok { 1265*0Sstevel@tonic-gate wcc_data obj_wcc; 1266*0Sstevel@tonic-gate }; 1267*0Sstevel@tonic-gate typedef struct SETATTR3resok SETATTR3resok; 1268*0Sstevel@tonic-gate 1269*0Sstevel@tonic-gate struct SETATTR3resfail { 1270*0Sstevel@tonic-gate wcc_data obj_wcc; 1271*0Sstevel@tonic-gate }; 1272*0Sstevel@tonic-gate typedef struct SETATTR3resfail SETATTR3resfail; 1273*0Sstevel@tonic-gate 1274*0Sstevel@tonic-gate struct SETATTR3res { 1275*0Sstevel@tonic-gate nfsstat3 status; 1276*0Sstevel@tonic-gate union { 1277*0Sstevel@tonic-gate SETATTR3resok ok; 1278*0Sstevel@tonic-gate SETATTR3resfail fail; 1279*0Sstevel@tonic-gate } res_u; 1280*0Sstevel@tonic-gate }; 1281*0Sstevel@tonic-gate typedef struct SETATTR3res SETATTR3res; 1282*0Sstevel@tonic-gate 1283*0Sstevel@tonic-gate struct LOOKUP3args { 1284*0Sstevel@tonic-gate diropargs3 what; 1285*0Sstevel@tonic-gate }; 1286*0Sstevel@tonic-gate typedef struct LOOKUP3args LOOKUP3args; 1287*0Sstevel@tonic-gate 1288*0Sstevel@tonic-gate struct LOOKUP3resok { 1289*0Sstevel@tonic-gate nfs_fh3 object; 1290*0Sstevel@tonic-gate post_op_attr obj_attributes; 1291*0Sstevel@tonic-gate post_op_attr dir_attributes; 1292*0Sstevel@tonic-gate }; 1293*0Sstevel@tonic-gate typedef struct LOOKUP3resok LOOKUP3resok; 1294*0Sstevel@tonic-gate 1295*0Sstevel@tonic-gate struct LOOKUP3resfail { 1296*0Sstevel@tonic-gate post_op_attr dir_attributes; 1297*0Sstevel@tonic-gate }; 1298*0Sstevel@tonic-gate typedef struct LOOKUP3resfail LOOKUP3resfail; 1299*0Sstevel@tonic-gate 1300*0Sstevel@tonic-gate struct LOOKUP3res { 1301*0Sstevel@tonic-gate nfsstat3 status; 1302*0Sstevel@tonic-gate union { 1303*0Sstevel@tonic-gate LOOKUP3resok ok; 1304*0Sstevel@tonic-gate LOOKUP3resfail fail; 1305*0Sstevel@tonic-gate } res_u; 1306*0Sstevel@tonic-gate }; 1307*0Sstevel@tonic-gate typedef struct LOOKUP3res LOOKUP3res; 1308*0Sstevel@tonic-gate 1309*0Sstevel@tonic-gate #ifdef _KERNEL 1310*0Sstevel@tonic-gate struct LOOKUP3vres { 1311*0Sstevel@tonic-gate nfsstat3 status; 1312*0Sstevel@tonic-gate nfs_fh3 object; 1313*0Sstevel@tonic-gate post_op_vattr dir_attributes; 1314*0Sstevel@tonic-gate post_op_vattr obj_attributes; 1315*0Sstevel@tonic-gate }; 1316*0Sstevel@tonic-gate typedef struct LOOKUP3vres LOOKUP3vres; 1317*0Sstevel@tonic-gate #endif /* _KERNEL */ 1318*0Sstevel@tonic-gate 1319*0Sstevel@tonic-gate struct ACCESS3args { 1320*0Sstevel@tonic-gate nfs_fh3 object; 1321*0Sstevel@tonic-gate uint32 access; 1322*0Sstevel@tonic-gate }; 1323*0Sstevel@tonic-gate typedef struct ACCESS3args ACCESS3args; 1324*0Sstevel@tonic-gate #define ACCESS3_READ 0x1 1325*0Sstevel@tonic-gate #define ACCESS3_LOOKUP 0x2 1326*0Sstevel@tonic-gate #define ACCESS3_MODIFY 0x4 1327*0Sstevel@tonic-gate #define ACCESS3_EXTEND 0x8 1328*0Sstevel@tonic-gate #define ACCESS3_DELETE 0x10 1329*0Sstevel@tonic-gate #define ACCESS3_EXECUTE 0x20 1330*0Sstevel@tonic-gate 1331*0Sstevel@tonic-gate struct ACCESS3resok { 1332*0Sstevel@tonic-gate post_op_attr obj_attributes; 1333*0Sstevel@tonic-gate uint32 access; 1334*0Sstevel@tonic-gate }; 1335*0Sstevel@tonic-gate typedef struct ACCESS3resok ACCESS3resok; 1336*0Sstevel@tonic-gate 1337*0Sstevel@tonic-gate struct ACCESS3resfail { 1338*0Sstevel@tonic-gate post_op_attr obj_attributes; 1339*0Sstevel@tonic-gate }; 1340*0Sstevel@tonic-gate typedef struct ACCESS3resfail ACCESS3resfail; 1341*0Sstevel@tonic-gate 1342*0Sstevel@tonic-gate struct ACCESS3res { 1343*0Sstevel@tonic-gate nfsstat3 status; 1344*0Sstevel@tonic-gate union { 1345*0Sstevel@tonic-gate ACCESS3resok ok; 1346*0Sstevel@tonic-gate ACCESS3resfail fail; 1347*0Sstevel@tonic-gate } res_u; 1348*0Sstevel@tonic-gate }; 1349*0Sstevel@tonic-gate typedef struct ACCESS3res ACCESS3res; 1350*0Sstevel@tonic-gate 1351*0Sstevel@tonic-gate struct READLINK3args { 1352*0Sstevel@tonic-gate nfs_fh3 symlink; 1353*0Sstevel@tonic-gate }; 1354*0Sstevel@tonic-gate typedef struct READLINK3args READLINK3args; 1355*0Sstevel@tonic-gate 1356*0Sstevel@tonic-gate struct READLINK3resok { 1357*0Sstevel@tonic-gate post_op_attr symlink_attributes; 1358*0Sstevel@tonic-gate nfspath3 data; 1359*0Sstevel@tonic-gate }; 1360*0Sstevel@tonic-gate typedef struct READLINK3resok READLINK3resok; 1361*0Sstevel@tonic-gate 1362*0Sstevel@tonic-gate struct READLINK3resfail { 1363*0Sstevel@tonic-gate post_op_attr symlink_attributes; 1364*0Sstevel@tonic-gate }; 1365*0Sstevel@tonic-gate typedef struct READLINK3resfail READLINK3resfail; 1366*0Sstevel@tonic-gate 1367*0Sstevel@tonic-gate struct READLINK3res { 1368*0Sstevel@tonic-gate nfsstat3 status; 1369*0Sstevel@tonic-gate union { 1370*0Sstevel@tonic-gate READLINK3resok ok; 1371*0Sstevel@tonic-gate READLINK3resfail fail; 1372*0Sstevel@tonic-gate } res_u; 1373*0Sstevel@tonic-gate }; 1374*0Sstevel@tonic-gate typedef struct READLINK3res READLINK3res; 1375*0Sstevel@tonic-gate 1376*0Sstevel@tonic-gate struct READ3args { 1377*0Sstevel@tonic-gate nfs_fh3 file; 1378*0Sstevel@tonic-gate offset3 offset; 1379*0Sstevel@tonic-gate count3 count; 1380*0Sstevel@tonic-gate }; 1381*0Sstevel@tonic-gate typedef struct READ3args READ3args; 1382*0Sstevel@tonic-gate 1383*0Sstevel@tonic-gate struct READ3resok { 1384*0Sstevel@tonic-gate post_op_attr file_attributes; 1385*0Sstevel@tonic-gate count3 count; 1386*0Sstevel@tonic-gate bool_t eof; 1387*0Sstevel@tonic-gate struct { 1388*0Sstevel@tonic-gate uint_t data_len; 1389*0Sstevel@tonic-gate char *data_val; 1390*0Sstevel@tonic-gate mblk_t *mp; 1391*0Sstevel@tonic-gate } data; 1392*0Sstevel@tonic-gate uint_t size; 1393*0Sstevel@tonic-gate }; 1394*0Sstevel@tonic-gate typedef struct READ3resok READ3resok; 1395*0Sstevel@tonic-gate 1396*0Sstevel@tonic-gate struct READ3resfail { 1397*0Sstevel@tonic-gate post_op_attr file_attributes; 1398*0Sstevel@tonic-gate }; 1399*0Sstevel@tonic-gate typedef struct READ3resfail READ3resfail; 1400*0Sstevel@tonic-gate 1401*0Sstevel@tonic-gate struct READ3res { 1402*0Sstevel@tonic-gate nfsstat3 status; 1403*0Sstevel@tonic-gate union { 1404*0Sstevel@tonic-gate READ3resok ok; 1405*0Sstevel@tonic-gate READ3resfail fail; 1406*0Sstevel@tonic-gate } res_u; 1407*0Sstevel@tonic-gate }; 1408*0Sstevel@tonic-gate typedef struct READ3res READ3res; 1409*0Sstevel@tonic-gate 1410*0Sstevel@tonic-gate #ifdef _KERNEL 1411*0Sstevel@tonic-gate /* 1412*0Sstevel@tonic-gate * READ3 reply that directly decodes fattr3 directly into vattr 1413*0Sstevel@tonic-gate */ 1414*0Sstevel@tonic-gate struct READ3vres { 1415*0Sstevel@tonic-gate nfsstat3 status; 1416*0Sstevel@tonic-gate struct post_op_vattr pov; 1417*0Sstevel@tonic-gate count3 count; 1418*0Sstevel@tonic-gate bool_t eof; 1419*0Sstevel@tonic-gate struct { 1420*0Sstevel@tonic-gate uint_t data_len; 1421*0Sstevel@tonic-gate char *data_val; 1422*0Sstevel@tonic-gate } data; 1423*0Sstevel@tonic-gate uint_t size; 1424*0Sstevel@tonic-gate }; 1425*0Sstevel@tonic-gate typedef struct READ3vres READ3vres; 1426*0Sstevel@tonic-gate #endif /* _KERNEL */ 1427*0Sstevel@tonic-gate 1428*0Sstevel@tonic-gate /* 1429*0Sstevel@tonic-gate * READ3 reply that uiomoves data directly into a struct uio 1430*0Sstevel@tonic-gate * ignores any attributes returned 1431*0Sstevel@tonic-gate */ 1432*0Sstevel@tonic-gate struct READ3uiores { 1433*0Sstevel@tonic-gate nfsstat3 status; 1434*0Sstevel@tonic-gate count3 count; 1435*0Sstevel@tonic-gate bool_t eof; 1436*0Sstevel@tonic-gate struct uio *uiop; 1437*0Sstevel@tonic-gate uint_t size; /* maximum reply size */ 1438*0Sstevel@tonic-gate }; 1439*0Sstevel@tonic-gate typedef struct READ3uiores READ3uiores; 1440*0Sstevel@tonic-gate 1441*0Sstevel@tonic-gate enum stable_how { 1442*0Sstevel@tonic-gate UNSTABLE = 0, 1443*0Sstevel@tonic-gate DATA_SYNC = 1, 1444*0Sstevel@tonic-gate FILE_SYNC = 2 1445*0Sstevel@tonic-gate }; 1446*0Sstevel@tonic-gate typedef enum stable_how stable_how; 1447*0Sstevel@tonic-gate 1448*0Sstevel@tonic-gate struct WRITE3args { 1449*0Sstevel@tonic-gate nfs_fh3 file; 1450*0Sstevel@tonic-gate offset3 offset; 1451*0Sstevel@tonic-gate count3 count; 1452*0Sstevel@tonic-gate stable_how stable; 1453*0Sstevel@tonic-gate struct { 1454*0Sstevel@tonic-gate uint_t data_len; 1455*0Sstevel@tonic-gate char *data_val; 1456*0Sstevel@tonic-gate } data; 1457*0Sstevel@tonic-gate mblk_t *mblk; 1458*0Sstevel@tonic-gate }; 1459*0Sstevel@tonic-gate typedef struct WRITE3args WRITE3args; 1460*0Sstevel@tonic-gate 1461*0Sstevel@tonic-gate struct WRITE3resok { 1462*0Sstevel@tonic-gate wcc_data file_wcc; 1463*0Sstevel@tonic-gate count3 count; 1464*0Sstevel@tonic-gate stable_how committed; 1465*0Sstevel@tonic-gate writeverf3 verf; 1466*0Sstevel@tonic-gate }; 1467*0Sstevel@tonic-gate typedef struct WRITE3resok WRITE3resok; 1468*0Sstevel@tonic-gate 1469*0Sstevel@tonic-gate struct WRITE3resfail { 1470*0Sstevel@tonic-gate wcc_data file_wcc; 1471*0Sstevel@tonic-gate }; 1472*0Sstevel@tonic-gate typedef struct WRITE3resfail WRITE3resfail; 1473*0Sstevel@tonic-gate 1474*0Sstevel@tonic-gate struct WRITE3res { 1475*0Sstevel@tonic-gate nfsstat3 status; 1476*0Sstevel@tonic-gate union { 1477*0Sstevel@tonic-gate WRITE3resok ok; 1478*0Sstevel@tonic-gate WRITE3resfail fail; 1479*0Sstevel@tonic-gate } res_u; 1480*0Sstevel@tonic-gate }; 1481*0Sstevel@tonic-gate typedef struct WRITE3res WRITE3res; 1482*0Sstevel@tonic-gate 1483*0Sstevel@tonic-gate enum createmode3 { 1484*0Sstevel@tonic-gate UNCHECKED = 0, 1485*0Sstevel@tonic-gate GUARDED = 1, 1486*0Sstevel@tonic-gate EXCLUSIVE = 2 1487*0Sstevel@tonic-gate }; 1488*0Sstevel@tonic-gate typedef enum createmode3 createmode3; 1489*0Sstevel@tonic-gate 1490*0Sstevel@tonic-gate struct createhow3 { 1491*0Sstevel@tonic-gate createmode3 mode; 1492*0Sstevel@tonic-gate union { 1493*0Sstevel@tonic-gate sattr3 obj_attributes; 1494*0Sstevel@tonic-gate createverf3 verf; 1495*0Sstevel@tonic-gate } createhow3_u; 1496*0Sstevel@tonic-gate }; 1497*0Sstevel@tonic-gate typedef struct createhow3 createhow3; 1498*0Sstevel@tonic-gate 1499*0Sstevel@tonic-gate struct CREATE3args { 1500*0Sstevel@tonic-gate diropargs3 where; 1501*0Sstevel@tonic-gate createhow3 how; 1502*0Sstevel@tonic-gate }; 1503*0Sstevel@tonic-gate typedef struct CREATE3args CREATE3args; 1504*0Sstevel@tonic-gate 1505*0Sstevel@tonic-gate struct CREATE3resok { 1506*0Sstevel@tonic-gate post_op_fh3 obj; 1507*0Sstevel@tonic-gate post_op_attr obj_attributes; 1508*0Sstevel@tonic-gate wcc_data dir_wcc; 1509*0Sstevel@tonic-gate }; 1510*0Sstevel@tonic-gate typedef struct CREATE3resok CREATE3resok; 1511*0Sstevel@tonic-gate 1512*0Sstevel@tonic-gate struct CREATE3resfail { 1513*0Sstevel@tonic-gate wcc_data dir_wcc; 1514*0Sstevel@tonic-gate }; 1515*0Sstevel@tonic-gate typedef struct CREATE3resfail CREATE3resfail; 1516*0Sstevel@tonic-gate 1517*0Sstevel@tonic-gate struct CREATE3res { 1518*0Sstevel@tonic-gate nfsstat3 status; 1519*0Sstevel@tonic-gate union { 1520*0Sstevel@tonic-gate CREATE3resok ok; 1521*0Sstevel@tonic-gate CREATE3resfail fail; 1522*0Sstevel@tonic-gate } res_u; 1523*0Sstevel@tonic-gate }; 1524*0Sstevel@tonic-gate typedef struct CREATE3res CREATE3res; 1525*0Sstevel@tonic-gate 1526*0Sstevel@tonic-gate struct MKDIR3args { 1527*0Sstevel@tonic-gate diropargs3 where; 1528*0Sstevel@tonic-gate sattr3 attributes; 1529*0Sstevel@tonic-gate }; 1530*0Sstevel@tonic-gate typedef struct MKDIR3args MKDIR3args; 1531*0Sstevel@tonic-gate 1532*0Sstevel@tonic-gate struct MKDIR3resok { 1533*0Sstevel@tonic-gate post_op_fh3 obj; 1534*0Sstevel@tonic-gate post_op_attr obj_attributes; 1535*0Sstevel@tonic-gate wcc_data dir_wcc; 1536*0Sstevel@tonic-gate }; 1537*0Sstevel@tonic-gate typedef struct MKDIR3resok MKDIR3resok; 1538*0Sstevel@tonic-gate 1539*0Sstevel@tonic-gate struct MKDIR3resfail { 1540*0Sstevel@tonic-gate wcc_data dir_wcc; 1541*0Sstevel@tonic-gate }; 1542*0Sstevel@tonic-gate typedef struct MKDIR3resfail MKDIR3resfail; 1543*0Sstevel@tonic-gate 1544*0Sstevel@tonic-gate struct MKDIR3res { 1545*0Sstevel@tonic-gate nfsstat3 status; 1546*0Sstevel@tonic-gate union { 1547*0Sstevel@tonic-gate MKDIR3resok ok; 1548*0Sstevel@tonic-gate MKDIR3resfail fail; 1549*0Sstevel@tonic-gate } res_u; 1550*0Sstevel@tonic-gate }; 1551*0Sstevel@tonic-gate typedef struct MKDIR3res MKDIR3res; 1552*0Sstevel@tonic-gate 1553*0Sstevel@tonic-gate struct symlinkdata3 { 1554*0Sstevel@tonic-gate sattr3 symlink_attributes; 1555*0Sstevel@tonic-gate nfspath3 symlink_data; 1556*0Sstevel@tonic-gate }; 1557*0Sstevel@tonic-gate typedef struct symlinkdata3 symlinkdata3; 1558*0Sstevel@tonic-gate 1559*0Sstevel@tonic-gate struct SYMLINK3args { 1560*0Sstevel@tonic-gate diropargs3 where; 1561*0Sstevel@tonic-gate symlinkdata3 symlink; 1562*0Sstevel@tonic-gate }; 1563*0Sstevel@tonic-gate typedef struct SYMLINK3args SYMLINK3args; 1564*0Sstevel@tonic-gate 1565*0Sstevel@tonic-gate struct SYMLINK3resok { 1566*0Sstevel@tonic-gate post_op_fh3 obj; 1567*0Sstevel@tonic-gate post_op_attr obj_attributes; 1568*0Sstevel@tonic-gate wcc_data dir_wcc; 1569*0Sstevel@tonic-gate }; 1570*0Sstevel@tonic-gate typedef struct SYMLINK3resok SYMLINK3resok; 1571*0Sstevel@tonic-gate 1572*0Sstevel@tonic-gate struct SYMLINK3resfail { 1573*0Sstevel@tonic-gate wcc_data dir_wcc; 1574*0Sstevel@tonic-gate }; 1575*0Sstevel@tonic-gate typedef struct SYMLINK3resfail SYMLINK3resfail; 1576*0Sstevel@tonic-gate 1577*0Sstevel@tonic-gate struct SYMLINK3res { 1578*0Sstevel@tonic-gate nfsstat3 status; 1579*0Sstevel@tonic-gate union { 1580*0Sstevel@tonic-gate SYMLINK3resok ok; 1581*0Sstevel@tonic-gate SYMLINK3resfail fail; 1582*0Sstevel@tonic-gate } res_u; 1583*0Sstevel@tonic-gate }; 1584*0Sstevel@tonic-gate typedef struct SYMLINK3res SYMLINK3res; 1585*0Sstevel@tonic-gate 1586*0Sstevel@tonic-gate struct devicedata3 { 1587*0Sstevel@tonic-gate sattr3 dev_attributes; 1588*0Sstevel@tonic-gate specdata3 spec; 1589*0Sstevel@tonic-gate }; 1590*0Sstevel@tonic-gate typedef struct devicedata3 devicedata3; 1591*0Sstevel@tonic-gate 1592*0Sstevel@tonic-gate struct mknoddata3 { 1593*0Sstevel@tonic-gate ftype3 type; 1594*0Sstevel@tonic-gate union { 1595*0Sstevel@tonic-gate devicedata3 device; 1596*0Sstevel@tonic-gate sattr3 pipe_attributes; 1597*0Sstevel@tonic-gate } mknoddata3_u; 1598*0Sstevel@tonic-gate }; 1599*0Sstevel@tonic-gate typedef struct mknoddata3 mknoddata3; 1600*0Sstevel@tonic-gate 1601*0Sstevel@tonic-gate struct MKNOD3args { 1602*0Sstevel@tonic-gate diropargs3 where; 1603*0Sstevel@tonic-gate mknoddata3 what; 1604*0Sstevel@tonic-gate }; 1605*0Sstevel@tonic-gate typedef struct MKNOD3args MKNOD3args; 1606*0Sstevel@tonic-gate 1607*0Sstevel@tonic-gate struct MKNOD3resok { 1608*0Sstevel@tonic-gate post_op_fh3 obj; 1609*0Sstevel@tonic-gate post_op_attr obj_attributes; 1610*0Sstevel@tonic-gate wcc_data dir_wcc; 1611*0Sstevel@tonic-gate }; 1612*0Sstevel@tonic-gate typedef struct MKNOD3resok MKNOD3resok; 1613*0Sstevel@tonic-gate 1614*0Sstevel@tonic-gate struct MKNOD3resfail { 1615*0Sstevel@tonic-gate wcc_data dir_wcc; 1616*0Sstevel@tonic-gate }; 1617*0Sstevel@tonic-gate typedef struct MKNOD3resfail MKNOD3resfail; 1618*0Sstevel@tonic-gate 1619*0Sstevel@tonic-gate struct MKNOD3res { 1620*0Sstevel@tonic-gate nfsstat3 status; 1621*0Sstevel@tonic-gate union { 1622*0Sstevel@tonic-gate MKNOD3resok ok; 1623*0Sstevel@tonic-gate MKNOD3resfail fail; 1624*0Sstevel@tonic-gate } res_u; 1625*0Sstevel@tonic-gate }; 1626*0Sstevel@tonic-gate typedef struct MKNOD3res MKNOD3res; 1627*0Sstevel@tonic-gate 1628*0Sstevel@tonic-gate struct REMOVE3args { 1629*0Sstevel@tonic-gate diropargs3 object; 1630*0Sstevel@tonic-gate }; 1631*0Sstevel@tonic-gate typedef struct REMOVE3args REMOVE3args; 1632*0Sstevel@tonic-gate 1633*0Sstevel@tonic-gate struct REMOVE3resok { 1634*0Sstevel@tonic-gate wcc_data dir_wcc; 1635*0Sstevel@tonic-gate }; 1636*0Sstevel@tonic-gate typedef struct REMOVE3resok REMOVE3resok; 1637*0Sstevel@tonic-gate 1638*0Sstevel@tonic-gate struct REMOVE3resfail { 1639*0Sstevel@tonic-gate wcc_data dir_wcc; 1640*0Sstevel@tonic-gate }; 1641*0Sstevel@tonic-gate typedef struct REMOVE3resfail REMOVE3resfail; 1642*0Sstevel@tonic-gate 1643*0Sstevel@tonic-gate struct REMOVE3res { 1644*0Sstevel@tonic-gate nfsstat3 status; 1645*0Sstevel@tonic-gate union { 1646*0Sstevel@tonic-gate REMOVE3resok ok; 1647*0Sstevel@tonic-gate REMOVE3resfail fail; 1648*0Sstevel@tonic-gate } res_u; 1649*0Sstevel@tonic-gate }; 1650*0Sstevel@tonic-gate typedef struct REMOVE3res REMOVE3res; 1651*0Sstevel@tonic-gate 1652*0Sstevel@tonic-gate struct RMDIR3args { 1653*0Sstevel@tonic-gate diropargs3 object; 1654*0Sstevel@tonic-gate }; 1655*0Sstevel@tonic-gate typedef struct RMDIR3args RMDIR3args; 1656*0Sstevel@tonic-gate 1657*0Sstevel@tonic-gate struct RMDIR3resok { 1658*0Sstevel@tonic-gate wcc_data dir_wcc; 1659*0Sstevel@tonic-gate }; 1660*0Sstevel@tonic-gate typedef struct RMDIR3resok RMDIR3resok; 1661*0Sstevel@tonic-gate 1662*0Sstevel@tonic-gate struct RMDIR3resfail { 1663*0Sstevel@tonic-gate wcc_data dir_wcc; 1664*0Sstevel@tonic-gate }; 1665*0Sstevel@tonic-gate typedef struct RMDIR3resfail RMDIR3resfail; 1666*0Sstevel@tonic-gate 1667*0Sstevel@tonic-gate struct RMDIR3res { 1668*0Sstevel@tonic-gate nfsstat3 status; 1669*0Sstevel@tonic-gate union { 1670*0Sstevel@tonic-gate RMDIR3resok ok; 1671*0Sstevel@tonic-gate RMDIR3resfail fail; 1672*0Sstevel@tonic-gate } res_u; 1673*0Sstevel@tonic-gate }; 1674*0Sstevel@tonic-gate typedef struct RMDIR3res RMDIR3res; 1675*0Sstevel@tonic-gate 1676*0Sstevel@tonic-gate struct RENAME3args { 1677*0Sstevel@tonic-gate diropargs3 from; 1678*0Sstevel@tonic-gate diropargs3 to; 1679*0Sstevel@tonic-gate }; 1680*0Sstevel@tonic-gate typedef struct RENAME3args RENAME3args; 1681*0Sstevel@tonic-gate 1682*0Sstevel@tonic-gate struct RENAME3resok { 1683*0Sstevel@tonic-gate wcc_data fromdir_wcc; 1684*0Sstevel@tonic-gate wcc_data todir_wcc; 1685*0Sstevel@tonic-gate }; 1686*0Sstevel@tonic-gate typedef struct RENAME3resok RENAME3resok; 1687*0Sstevel@tonic-gate 1688*0Sstevel@tonic-gate struct RENAME3resfail { 1689*0Sstevel@tonic-gate wcc_data fromdir_wcc; 1690*0Sstevel@tonic-gate wcc_data todir_wcc; 1691*0Sstevel@tonic-gate }; 1692*0Sstevel@tonic-gate typedef struct RENAME3resfail RENAME3resfail; 1693*0Sstevel@tonic-gate 1694*0Sstevel@tonic-gate struct RENAME3res { 1695*0Sstevel@tonic-gate nfsstat3 status; 1696*0Sstevel@tonic-gate union { 1697*0Sstevel@tonic-gate RENAME3resok ok; 1698*0Sstevel@tonic-gate RENAME3resfail fail; 1699*0Sstevel@tonic-gate } res_u; 1700*0Sstevel@tonic-gate }; 1701*0Sstevel@tonic-gate typedef struct RENAME3res RENAME3res; 1702*0Sstevel@tonic-gate 1703*0Sstevel@tonic-gate struct LINK3args { 1704*0Sstevel@tonic-gate nfs_fh3 file; 1705*0Sstevel@tonic-gate diropargs3 link; 1706*0Sstevel@tonic-gate }; 1707*0Sstevel@tonic-gate typedef struct LINK3args LINK3args; 1708*0Sstevel@tonic-gate 1709*0Sstevel@tonic-gate struct LINK3resok { 1710*0Sstevel@tonic-gate post_op_attr file_attributes; 1711*0Sstevel@tonic-gate wcc_data linkdir_wcc; 1712*0Sstevel@tonic-gate }; 1713*0Sstevel@tonic-gate typedef struct LINK3resok LINK3resok; 1714*0Sstevel@tonic-gate 1715*0Sstevel@tonic-gate struct LINK3resfail { 1716*0Sstevel@tonic-gate post_op_attr file_attributes; 1717*0Sstevel@tonic-gate wcc_data linkdir_wcc; 1718*0Sstevel@tonic-gate }; 1719*0Sstevel@tonic-gate typedef struct LINK3resfail LINK3resfail; 1720*0Sstevel@tonic-gate 1721*0Sstevel@tonic-gate struct LINK3res { 1722*0Sstevel@tonic-gate nfsstat3 status; 1723*0Sstevel@tonic-gate union { 1724*0Sstevel@tonic-gate LINK3resok ok; 1725*0Sstevel@tonic-gate LINK3resfail fail; 1726*0Sstevel@tonic-gate } res_u; 1727*0Sstevel@tonic-gate }; 1728*0Sstevel@tonic-gate typedef struct LINK3res LINK3res; 1729*0Sstevel@tonic-gate 1730*0Sstevel@tonic-gate struct READDIR3args { 1731*0Sstevel@tonic-gate nfs_fh3 dir; 1732*0Sstevel@tonic-gate cookie3 cookie; 1733*0Sstevel@tonic-gate cookieverf3 cookieverf; 1734*0Sstevel@tonic-gate count3 count; 1735*0Sstevel@tonic-gate }; 1736*0Sstevel@tonic-gate typedef struct READDIR3args READDIR3args; 1737*0Sstevel@tonic-gate 1738*0Sstevel@tonic-gate struct entry3 { 1739*0Sstevel@tonic-gate fileid3 fileid; 1740*0Sstevel@tonic-gate filename3 name; 1741*0Sstevel@tonic-gate cookie3 cookie; 1742*0Sstevel@tonic-gate struct entry3 *nextentry; 1743*0Sstevel@tonic-gate }; 1744*0Sstevel@tonic-gate typedef struct entry3 entry3; 1745*0Sstevel@tonic-gate 1746*0Sstevel@tonic-gate struct dirlist3 { 1747*0Sstevel@tonic-gate entry3 *entries; 1748*0Sstevel@tonic-gate bool_t eof; 1749*0Sstevel@tonic-gate }; 1750*0Sstevel@tonic-gate typedef struct dirlist3 dirlist3; 1751*0Sstevel@tonic-gate 1752*0Sstevel@tonic-gate struct READDIR3resok { 1753*0Sstevel@tonic-gate post_op_attr dir_attributes; 1754*0Sstevel@tonic-gate cookieverf3 cookieverf; 1755*0Sstevel@tonic-gate dirlist3 reply; 1756*0Sstevel@tonic-gate uint_t size; 1757*0Sstevel@tonic-gate uint_t count; 1758*0Sstevel@tonic-gate uint_t freecount; 1759*0Sstevel@tonic-gate cookie3 cookie; 1760*0Sstevel@tonic-gate }; 1761*0Sstevel@tonic-gate typedef struct READDIR3resok READDIR3resok; 1762*0Sstevel@tonic-gate 1763*0Sstevel@tonic-gate struct READDIR3resfail { 1764*0Sstevel@tonic-gate post_op_attr dir_attributes; 1765*0Sstevel@tonic-gate }; 1766*0Sstevel@tonic-gate typedef struct READDIR3resfail READDIR3resfail; 1767*0Sstevel@tonic-gate 1768*0Sstevel@tonic-gate struct READDIR3res { 1769*0Sstevel@tonic-gate nfsstat3 status; 1770*0Sstevel@tonic-gate union { 1771*0Sstevel@tonic-gate READDIR3resok ok; 1772*0Sstevel@tonic-gate READDIR3resfail fail; 1773*0Sstevel@tonic-gate } res_u; 1774*0Sstevel@tonic-gate }; 1775*0Sstevel@tonic-gate typedef struct READDIR3res READDIR3res; 1776*0Sstevel@tonic-gate 1777*0Sstevel@tonic-gate #ifdef _KERNEL 1778*0Sstevel@tonic-gate struct READDIR3vres { 1779*0Sstevel@tonic-gate nfsstat3 status; 1780*0Sstevel@tonic-gate post_op_vattr dir_attributes; 1781*0Sstevel@tonic-gate cookieverf3 cookieverf; 1782*0Sstevel@tonic-gate dirent64_t *entries; /* decoded dirent64s */ 1783*0Sstevel@tonic-gate uint_t size; /* actual size of entries */ 1784*0Sstevel@tonic-gate uint_t entries_size; /* max size of entries */ 1785*0Sstevel@tonic-gate off64_t loff; /* last offset/cookie */ 1786*0Sstevel@tonic-gate bool_t eof; /* End of directory */ 1787*0Sstevel@tonic-gate }; 1788*0Sstevel@tonic-gate typedef struct READDIR3vres READDIR3vres; 1789*0Sstevel@tonic-gate #endif /* _KERNEL */ 1790*0Sstevel@tonic-gate 1791*0Sstevel@tonic-gate struct READDIRPLUS3args { 1792*0Sstevel@tonic-gate nfs_fh3 dir; 1793*0Sstevel@tonic-gate cookie3 cookie; 1794*0Sstevel@tonic-gate cookieverf3 cookieverf; 1795*0Sstevel@tonic-gate count3 dircount; 1796*0Sstevel@tonic-gate count3 maxcount; 1797*0Sstevel@tonic-gate }; 1798*0Sstevel@tonic-gate typedef struct READDIRPLUS3args READDIRPLUS3args; 1799*0Sstevel@tonic-gate 1800*0Sstevel@tonic-gate struct entryplus3 { 1801*0Sstevel@tonic-gate fileid3 fileid; 1802*0Sstevel@tonic-gate filename3 name; 1803*0Sstevel@tonic-gate cookie3 cookie; 1804*0Sstevel@tonic-gate post_op_attr name_attributes; 1805*0Sstevel@tonic-gate post_op_fh3 name_handle; 1806*0Sstevel@tonic-gate struct entryplus3 *nextentry; 1807*0Sstevel@tonic-gate }; 1808*0Sstevel@tonic-gate typedef struct entryplus3 entryplus3; 1809*0Sstevel@tonic-gate 1810*0Sstevel@tonic-gate struct dirlistplus3 { 1811*0Sstevel@tonic-gate entryplus3 *entries; 1812*0Sstevel@tonic-gate bool_t eof; 1813*0Sstevel@tonic-gate }; 1814*0Sstevel@tonic-gate typedef struct dirlistplus3 dirlistplus3; 1815*0Sstevel@tonic-gate 1816*0Sstevel@tonic-gate struct entryplus3_info { 1817*0Sstevel@tonic-gate post_op_attr attr; 1818*0Sstevel@tonic-gate post_op_fh3 fh; 1819*0Sstevel@tonic-gate uint_t namelen; 1820*0Sstevel@tonic-gate }; 1821*0Sstevel@tonic-gate typedef struct entryplus3_info entryplus3_info; 1822*0Sstevel@tonic-gate 1823*0Sstevel@tonic-gate struct READDIRPLUS3resok { 1824*0Sstevel@tonic-gate post_op_attr dir_attributes; 1825*0Sstevel@tonic-gate cookieverf3 cookieverf; 1826*0Sstevel@tonic-gate dirlistplus3 reply; 1827*0Sstevel@tonic-gate uint_t size; 1828*0Sstevel@tonic-gate uint_t count; 1829*0Sstevel@tonic-gate uint_t maxcount; 1830*0Sstevel@tonic-gate entryplus3_info *infop; 1831*0Sstevel@tonic-gate }; 1832*0Sstevel@tonic-gate typedef struct READDIRPLUS3resok READDIRPLUS3resok; 1833*0Sstevel@tonic-gate 1834*0Sstevel@tonic-gate struct READDIRPLUS3resfail { 1835*0Sstevel@tonic-gate post_op_attr dir_attributes; 1836*0Sstevel@tonic-gate }; 1837*0Sstevel@tonic-gate typedef struct READDIRPLUS3resfail READDIRPLUS3resfail; 1838*0Sstevel@tonic-gate 1839*0Sstevel@tonic-gate struct READDIRPLUS3res { 1840*0Sstevel@tonic-gate nfsstat3 status; 1841*0Sstevel@tonic-gate union { 1842*0Sstevel@tonic-gate READDIRPLUS3resok ok; 1843*0Sstevel@tonic-gate READDIRPLUS3resfail fail; 1844*0Sstevel@tonic-gate } res_u; 1845*0Sstevel@tonic-gate }; 1846*0Sstevel@tonic-gate typedef struct READDIRPLUS3res READDIRPLUS3res; 1847*0Sstevel@tonic-gate 1848*0Sstevel@tonic-gate #ifdef _KERNEL 1849*0Sstevel@tonic-gate struct entryplus3_va_fh { 1850*0Sstevel@tonic-gate int va_valid; 1851*0Sstevel@tonic-gate int fh_valid; 1852*0Sstevel@tonic-gate vattr_t va; 1853*0Sstevel@tonic-gate nfs_fh3 fh; 1854*0Sstevel@tonic-gate char *d_name; /* back pointer into entries */ 1855*0Sstevel@tonic-gate }; 1856*0Sstevel@tonic-gate 1857*0Sstevel@tonic-gate struct READDIRPLUS3vres { 1858*0Sstevel@tonic-gate nfsstat3 status; 1859*0Sstevel@tonic-gate post_op_vattr dir_attributes; 1860*0Sstevel@tonic-gate cookieverf3 cookieverf; 1861*0Sstevel@tonic-gate dirent64_t *entries; /* decoded dirent64s */ 1862*0Sstevel@tonic-gate uint_t size; /* actual size of entries */ 1863*0Sstevel@tonic-gate uint_t entries_size; /* max size of entries */ 1864*0Sstevel@tonic-gate bool_t eof; /* End of directory */ 1865*0Sstevel@tonic-gate off64_t loff; /* last offset/cookie */ 1866*0Sstevel@tonic-gate cred_t *credentials; /* caller's credentials */ 1867*0Sstevel@tonic-gate hrtime_t time; /* time of READDIRPLUS call */ 1868*0Sstevel@tonic-gate }; 1869*0Sstevel@tonic-gate typedef struct READDIRPLUS3vres READDIRPLUS3vres; 1870*0Sstevel@tonic-gate #endif /* _KERNEL */ 1871*0Sstevel@tonic-gate 1872*0Sstevel@tonic-gate struct FSSTAT3args { 1873*0Sstevel@tonic-gate nfs_fh3 fsroot; 1874*0Sstevel@tonic-gate }; 1875*0Sstevel@tonic-gate typedef struct FSSTAT3args FSSTAT3args; 1876*0Sstevel@tonic-gate 1877*0Sstevel@tonic-gate struct FSSTAT3resok { 1878*0Sstevel@tonic-gate post_op_attr obj_attributes; 1879*0Sstevel@tonic-gate size3 tbytes; 1880*0Sstevel@tonic-gate size3 fbytes; 1881*0Sstevel@tonic-gate size3 abytes; 1882*0Sstevel@tonic-gate size3 tfiles; 1883*0Sstevel@tonic-gate size3 ffiles; 1884*0Sstevel@tonic-gate size3 afiles; 1885*0Sstevel@tonic-gate uint32 invarsec; 1886*0Sstevel@tonic-gate }; 1887*0Sstevel@tonic-gate typedef struct FSSTAT3resok FSSTAT3resok; 1888*0Sstevel@tonic-gate 1889*0Sstevel@tonic-gate struct FSSTAT3resfail { 1890*0Sstevel@tonic-gate post_op_attr obj_attributes; 1891*0Sstevel@tonic-gate }; 1892*0Sstevel@tonic-gate typedef struct FSSTAT3resfail FSSTAT3resfail; 1893*0Sstevel@tonic-gate 1894*0Sstevel@tonic-gate struct FSSTAT3res { 1895*0Sstevel@tonic-gate nfsstat3 status; 1896*0Sstevel@tonic-gate union { 1897*0Sstevel@tonic-gate FSSTAT3resok ok; 1898*0Sstevel@tonic-gate FSSTAT3resfail fail; 1899*0Sstevel@tonic-gate } res_u; 1900*0Sstevel@tonic-gate }; 1901*0Sstevel@tonic-gate typedef struct FSSTAT3res FSSTAT3res; 1902*0Sstevel@tonic-gate 1903*0Sstevel@tonic-gate struct FSINFO3args { 1904*0Sstevel@tonic-gate nfs_fh3 fsroot; 1905*0Sstevel@tonic-gate }; 1906*0Sstevel@tonic-gate typedef struct FSINFO3args FSINFO3args; 1907*0Sstevel@tonic-gate 1908*0Sstevel@tonic-gate struct FSINFO3resok { 1909*0Sstevel@tonic-gate post_op_attr obj_attributes; 1910*0Sstevel@tonic-gate uint32 rtmax; 1911*0Sstevel@tonic-gate uint32 rtpref; 1912*0Sstevel@tonic-gate uint32 rtmult; 1913*0Sstevel@tonic-gate uint32 wtmax; 1914*0Sstevel@tonic-gate uint32 wtpref; 1915*0Sstevel@tonic-gate uint32 wtmult; 1916*0Sstevel@tonic-gate uint32 dtpref; 1917*0Sstevel@tonic-gate size3 maxfilesize; 1918*0Sstevel@tonic-gate nfstime3 time_delta; 1919*0Sstevel@tonic-gate uint32 properties; 1920*0Sstevel@tonic-gate }; 1921*0Sstevel@tonic-gate typedef struct FSINFO3resok FSINFO3resok; 1922*0Sstevel@tonic-gate 1923*0Sstevel@tonic-gate struct FSINFO3resfail { 1924*0Sstevel@tonic-gate post_op_attr obj_attributes; 1925*0Sstevel@tonic-gate }; 1926*0Sstevel@tonic-gate typedef struct FSINFO3resfail FSINFO3resfail; 1927*0Sstevel@tonic-gate #define FSF3_LINK 0x1 1928*0Sstevel@tonic-gate #define FSF3_SYMLINK 0x2 1929*0Sstevel@tonic-gate #define FSF3_HOMOGENEOUS 0x8 1930*0Sstevel@tonic-gate #define FSF3_CANSETTIME 0x10 1931*0Sstevel@tonic-gate 1932*0Sstevel@tonic-gate struct FSINFO3res { 1933*0Sstevel@tonic-gate nfsstat3 status; 1934*0Sstevel@tonic-gate union { 1935*0Sstevel@tonic-gate FSINFO3resok ok; 1936*0Sstevel@tonic-gate FSINFO3resfail fail; 1937*0Sstevel@tonic-gate } res_u; 1938*0Sstevel@tonic-gate }; 1939*0Sstevel@tonic-gate typedef struct FSINFO3res FSINFO3res; 1940*0Sstevel@tonic-gate 1941*0Sstevel@tonic-gate struct PATHCONF3args { 1942*0Sstevel@tonic-gate nfs_fh3 object; 1943*0Sstevel@tonic-gate }; 1944*0Sstevel@tonic-gate typedef struct PATHCONF3args PATHCONF3args; 1945*0Sstevel@tonic-gate 1946*0Sstevel@tonic-gate struct nfs3_pathconf_info { 1947*0Sstevel@tonic-gate uint32 link_max; 1948*0Sstevel@tonic-gate uint32 name_max; 1949*0Sstevel@tonic-gate bool_t no_trunc; 1950*0Sstevel@tonic-gate bool_t chown_restricted; 1951*0Sstevel@tonic-gate bool_t case_insensitive; 1952*0Sstevel@tonic-gate bool_t case_preserving; 1953*0Sstevel@tonic-gate }; 1954*0Sstevel@tonic-gate typedef struct nfs3_pathconf_info nfs3_pathconf_info; 1955*0Sstevel@tonic-gate 1956*0Sstevel@tonic-gate struct PATHCONF3resok { 1957*0Sstevel@tonic-gate post_op_attr obj_attributes; 1958*0Sstevel@tonic-gate nfs3_pathconf_info info; 1959*0Sstevel@tonic-gate }; 1960*0Sstevel@tonic-gate typedef struct PATHCONF3resok PATHCONF3resok; 1961*0Sstevel@tonic-gate 1962*0Sstevel@tonic-gate struct PATHCONF3resfail { 1963*0Sstevel@tonic-gate post_op_attr obj_attributes; 1964*0Sstevel@tonic-gate }; 1965*0Sstevel@tonic-gate typedef struct PATHCONF3resfail PATHCONF3resfail; 1966*0Sstevel@tonic-gate 1967*0Sstevel@tonic-gate struct PATHCONF3res { 1968*0Sstevel@tonic-gate nfsstat3 status; 1969*0Sstevel@tonic-gate union { 1970*0Sstevel@tonic-gate PATHCONF3resok ok; 1971*0Sstevel@tonic-gate PATHCONF3resfail fail; 1972*0Sstevel@tonic-gate } res_u; 1973*0Sstevel@tonic-gate }; 1974*0Sstevel@tonic-gate typedef struct PATHCONF3res PATHCONF3res; 1975*0Sstevel@tonic-gate 1976*0Sstevel@tonic-gate struct COMMIT3args { 1977*0Sstevel@tonic-gate nfs_fh3 file; 1978*0Sstevel@tonic-gate offset3 offset; 1979*0Sstevel@tonic-gate count3 count; 1980*0Sstevel@tonic-gate }; 1981*0Sstevel@tonic-gate typedef struct COMMIT3args COMMIT3args; 1982*0Sstevel@tonic-gate 1983*0Sstevel@tonic-gate struct COMMIT3resok { 1984*0Sstevel@tonic-gate wcc_data file_wcc; 1985*0Sstevel@tonic-gate writeverf3 verf; 1986*0Sstevel@tonic-gate }; 1987*0Sstevel@tonic-gate typedef struct COMMIT3resok COMMIT3resok; 1988*0Sstevel@tonic-gate 1989*0Sstevel@tonic-gate struct COMMIT3resfail { 1990*0Sstevel@tonic-gate wcc_data file_wcc; 1991*0Sstevel@tonic-gate }; 1992*0Sstevel@tonic-gate typedef struct COMMIT3resfail COMMIT3resfail; 1993*0Sstevel@tonic-gate 1994*0Sstevel@tonic-gate struct COMMIT3res { 1995*0Sstevel@tonic-gate nfsstat3 status; 1996*0Sstevel@tonic-gate union { 1997*0Sstevel@tonic-gate COMMIT3resok ok; 1998*0Sstevel@tonic-gate COMMIT3resfail fail; 1999*0Sstevel@tonic-gate } res_u; 2000*0Sstevel@tonic-gate }; 2001*0Sstevel@tonic-gate typedef struct COMMIT3res COMMIT3res; 2002*0Sstevel@tonic-gate 2003*0Sstevel@tonic-gate #define NFS3_PROGRAM ((rpcprog_t)100003) 2004*0Sstevel@tonic-gate #define NFS_V3 ((rpcvers_t)3) 2005*0Sstevel@tonic-gate #define NFSPROC3_NULL ((rpcproc_t)0) 2006*0Sstevel@tonic-gate #define NFSPROC3_GETATTR ((rpcproc_t)1) 2007*0Sstevel@tonic-gate #define NFSPROC3_SETATTR ((rpcproc_t)2) 2008*0Sstevel@tonic-gate #define NFSPROC3_LOOKUP ((rpcproc_t)3) 2009*0Sstevel@tonic-gate #define NFSPROC3_ACCESS ((rpcproc_t)4) 2010*0Sstevel@tonic-gate #define NFSPROC3_READLINK ((rpcproc_t)5) 2011*0Sstevel@tonic-gate #define NFSPROC3_READ ((rpcproc_t)6) 2012*0Sstevel@tonic-gate #define NFSPROC3_WRITE ((rpcproc_t)7) 2013*0Sstevel@tonic-gate #define NFSPROC3_CREATE ((rpcproc_t)8) 2014*0Sstevel@tonic-gate #define NFSPROC3_MKDIR ((rpcproc_t)9) 2015*0Sstevel@tonic-gate #define NFSPROC3_SYMLINK ((rpcproc_t)10) 2016*0Sstevel@tonic-gate #define NFSPROC3_MKNOD ((rpcproc_t)11) 2017*0Sstevel@tonic-gate #define NFSPROC3_REMOVE ((rpcproc_t)12) 2018*0Sstevel@tonic-gate #define NFSPROC3_RMDIR ((rpcproc_t)13) 2019*0Sstevel@tonic-gate #define NFSPROC3_RENAME ((rpcproc_t)14) 2020*0Sstevel@tonic-gate #define NFSPROC3_LINK ((rpcproc_t)15) 2021*0Sstevel@tonic-gate #define NFSPROC3_READDIR ((rpcproc_t)16) 2022*0Sstevel@tonic-gate #define NFSPROC3_READDIRPLUS ((rpcproc_t)17) 2023*0Sstevel@tonic-gate #define NFSPROC3_FSSTAT ((rpcproc_t)18) 2024*0Sstevel@tonic-gate #define NFSPROC3_FSINFO ((rpcproc_t)19) 2025*0Sstevel@tonic-gate #define NFSPROC3_PATHCONF ((rpcproc_t)20) 2026*0Sstevel@tonic-gate #define NFSPROC3_COMMIT ((rpcproc_t)21) 2027*0Sstevel@tonic-gate 2028*0Sstevel@tonic-gate #ifndef _KERNEL 2029*0Sstevel@tonic-gate extern void * nfsproc3_null_3(); 2030*0Sstevel@tonic-gate extern GETATTR3res * nfsproc3_getattr_3(); 2031*0Sstevel@tonic-gate extern SETATTR3res * nfsproc3_setattr_3(); 2032*0Sstevel@tonic-gate extern LOOKUP3res * nfsproc3_lookup_3(); 2033*0Sstevel@tonic-gate extern ACCESS3res * nfsproc3_access_3(); 2034*0Sstevel@tonic-gate extern READLINK3res * nfsproc3_readlink_3(); 2035*0Sstevel@tonic-gate extern READ3res * nfsproc3_read_3(); 2036*0Sstevel@tonic-gate extern WRITE3res * nfsproc3_write_3(); 2037*0Sstevel@tonic-gate extern CREATE3res * nfsproc3_create_3(); 2038*0Sstevel@tonic-gate extern MKDIR3res * nfsproc3_mkdir_3(); 2039*0Sstevel@tonic-gate extern SYMLINK3res * nfsproc3_symlink_3(); 2040*0Sstevel@tonic-gate extern MKNOD3res * nfsproc3_mknod_3(); 2041*0Sstevel@tonic-gate extern REMOVE3res * nfsproc3_remove_3(); 2042*0Sstevel@tonic-gate extern RMDIR3res * nfsproc3_rmdir_3(); 2043*0Sstevel@tonic-gate extern RENAME3res * nfsproc3_rename_3(); 2044*0Sstevel@tonic-gate extern LINK3res * nfsproc3_link_3(); 2045*0Sstevel@tonic-gate extern READDIR3res * nfsproc3_readdir_3(); 2046*0Sstevel@tonic-gate extern READDIRPLUS3res * nfsproc3_readdirplus_3(); 2047*0Sstevel@tonic-gate extern FSSTAT3res * nfsproc3_fsstat_3(); 2048*0Sstevel@tonic-gate extern FSINFO3res * nfsproc3_fsinfo_3(); 2049*0Sstevel@tonic-gate extern PATHCONF3res * nfsproc3_pathconf_3(); 2050*0Sstevel@tonic-gate extern COMMIT3res * nfsproc3_commit_3(); 2051*0Sstevel@tonic-gate #endif /* !_KERNEL */ 2052*0Sstevel@tonic-gate 2053*0Sstevel@tonic-gate #ifdef _KERNEL 2054*0Sstevel@tonic-gate /* the NFS Version 3 XDR functions */ 2055*0Sstevel@tonic-gate 2056*0Sstevel@tonic-gate extern bool_t xdr_nfs_fh3(XDR *, nfs_fh3 *); 2057*0Sstevel@tonic-gate extern bool_t xdr_diropargs3(XDR *, diropargs3 *); 2058*0Sstevel@tonic-gate extern bool_t xdr_post_op_attr(XDR *, post_op_attr *); 2059*0Sstevel@tonic-gate extern bool_t xdr_post_op_fh3(XDR *, post_op_fh3 *); 2060*0Sstevel@tonic-gate extern bool_t xdr_GETATTR3res(XDR *, GETATTR3res *); 2061*0Sstevel@tonic-gate extern bool_t xdr_GETATTR3vres(XDR *, GETATTR3vres *); 2062*0Sstevel@tonic-gate extern bool_t xdr_SETATTR3args(XDR *, SETATTR3args *); 2063*0Sstevel@tonic-gate extern bool_t xdr_SETATTR3res(XDR *, SETATTR3res *); 2064*0Sstevel@tonic-gate extern bool_t xdr_LOOKUP3res(XDR *, LOOKUP3res *); 2065*0Sstevel@tonic-gate extern bool_t xdr_LOOKUP3vres(XDR *, LOOKUP3vres *); 2066*0Sstevel@tonic-gate extern bool_t xdr_ACCESS3args(XDR *, ACCESS3args *); 2067*0Sstevel@tonic-gate extern bool_t xdr_ACCESS3res(XDR *, ACCESS3res *); 2068*0Sstevel@tonic-gate extern bool_t xdr_READLINK3args(XDR *, READLINK3args *); 2069*0Sstevel@tonic-gate extern bool_t xdr_READLINK3res(XDR *, READLINK3res *); 2070*0Sstevel@tonic-gate extern bool_t xdr_READ3args(XDR *, READ3args *); 2071*0Sstevel@tonic-gate extern bool_t xdr_READ3res(XDR *, READ3res *); 2072*0Sstevel@tonic-gate extern bool_t xdr_READ3vres(XDR *, READ3vres *); 2073*0Sstevel@tonic-gate extern bool_t xdr_READ3uiores(XDR *, READ3uiores *); 2074*0Sstevel@tonic-gate extern bool_t xdr_WRITE3args(XDR *, WRITE3args *); 2075*0Sstevel@tonic-gate extern bool_t xdr_WRITE3res(XDR *, WRITE3res *); 2076*0Sstevel@tonic-gate extern bool_t xdr_CREATE3args(XDR *, CREATE3args *); 2077*0Sstevel@tonic-gate extern bool_t xdr_CREATE3res(XDR *, CREATE3res *); 2078*0Sstevel@tonic-gate extern bool_t xdr_MKDIR3args(XDR *, MKDIR3args *); 2079*0Sstevel@tonic-gate extern bool_t xdr_MKDIR3res(XDR *, MKDIR3res *); 2080*0Sstevel@tonic-gate extern bool_t xdr_SYMLINK3args(XDR *, SYMLINK3args *); 2081*0Sstevel@tonic-gate extern bool_t xdr_SYMLINK3res(XDR *, SYMLINK3res *); 2082*0Sstevel@tonic-gate extern bool_t xdr_MKNOD3args(XDR *, MKNOD3args *); 2083*0Sstevel@tonic-gate extern bool_t xdr_MKNOD3res(XDR *, MKNOD3res *); 2084*0Sstevel@tonic-gate extern bool_t xdr_REMOVE3res(XDR *, REMOVE3res *); 2085*0Sstevel@tonic-gate extern bool_t xdr_RMDIR3resfail(XDR *, RMDIR3resfail *); 2086*0Sstevel@tonic-gate extern bool_t xdr_RMDIR3res(XDR *, RMDIR3res *); 2087*0Sstevel@tonic-gate extern bool_t xdr_RENAME3args(XDR *, RENAME3args *); 2088*0Sstevel@tonic-gate extern bool_t xdr_RENAME3res(XDR *, RENAME3res *); 2089*0Sstevel@tonic-gate extern bool_t xdr_LINK3args(XDR *, LINK3args *); 2090*0Sstevel@tonic-gate extern bool_t xdr_LINK3res(XDR *, LINK3res *); 2091*0Sstevel@tonic-gate extern bool_t xdr_READDIR3args(XDR *, READDIR3args *); 2092*0Sstevel@tonic-gate extern bool_t xdr_READDIR3res(XDR *, READDIR3res *); 2093*0Sstevel@tonic-gate extern bool_t xdr_READDIR3vres(XDR *, READDIR3vres *); 2094*0Sstevel@tonic-gate extern bool_t xdr_READDIRPLUS3args(XDR *, READDIRPLUS3args *); 2095*0Sstevel@tonic-gate extern bool_t xdr_READDIRPLUS3res(XDR *, READDIRPLUS3res *); 2096*0Sstevel@tonic-gate extern bool_t xdr_READDIRPLUS3vres(XDR *, READDIRPLUS3vres *); 2097*0Sstevel@tonic-gate extern bool_t xdr_FSSTAT3res(XDR *, FSSTAT3res *); 2098*0Sstevel@tonic-gate extern bool_t xdr_FSINFO3res(XDR *, FSINFO3res *); 2099*0Sstevel@tonic-gate extern bool_t xdr_PATHCONF3res(XDR *, PATHCONF3res *); 2100*0Sstevel@tonic-gate extern bool_t xdr_COMMIT3args(XDR *, COMMIT3args *); 2101*0Sstevel@tonic-gate extern bool_t xdr_COMMIT3res(XDR *, COMMIT3res *); 2102*0Sstevel@tonic-gate extern bool_t xdr_fastnfs_fh3(XDR *, nfs_fh3 **); 2103*0Sstevel@tonic-gate 2104*0Sstevel@tonic-gate /* 2105*0Sstevel@tonic-gate * The NFS Version 3 service procedures. 2106*0Sstevel@tonic-gate */ 2107*0Sstevel@tonic-gate struct exportinfo; /* defined in nfs/export.h */ 2108*0Sstevel@tonic-gate struct servinfo; /* defined in nfs/nfs_clnt.h */ 2109*0Sstevel@tonic-gate struct mntinfo; /* defined in nfs/nfs_clnt.h */ 2110*0Sstevel@tonic-gate struct sec_ol; /* defined in nfs/export.h */ 2111*0Sstevel@tonic-gate 2112*0Sstevel@tonic-gate extern void rfs3_getattr(GETATTR3args *, GETATTR3res *, 2113*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2114*0Sstevel@tonic-gate extern fhandle_t *rfs3_getattr_getfh(GETATTR3args *); 2115*0Sstevel@tonic-gate extern void rfs3_setattr(SETATTR3args *, SETATTR3res *, 2116*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2117*0Sstevel@tonic-gate extern fhandle_t *rfs3_setattr_getfh(SETATTR3args *); 2118*0Sstevel@tonic-gate extern void rfs3_lookup(LOOKUP3args *, LOOKUP3res *, 2119*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2120*0Sstevel@tonic-gate extern fhandle_t *rfs3_lookup_getfh(LOOKUP3args *); 2121*0Sstevel@tonic-gate extern void rfs3_access(ACCESS3args *, ACCESS3res *, 2122*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2123*0Sstevel@tonic-gate extern fhandle_t *rfs3_access_getfh(ACCESS3args *); 2124*0Sstevel@tonic-gate extern void rfs3_readlink(READLINK3args *, READLINK3res *, 2125*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2126*0Sstevel@tonic-gate extern fhandle_t *rfs3_readlink_getfh(READLINK3args *); 2127*0Sstevel@tonic-gate extern void rfs3_readlink_free(READLINK3res *); 2128*0Sstevel@tonic-gate extern void rfs3_read(READ3args *, READ3res *, 2129*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2130*0Sstevel@tonic-gate extern fhandle_t *rfs3_read_getfh(READ3args *); 2131*0Sstevel@tonic-gate extern void rfs3_read_free(READ3res *); 2132*0Sstevel@tonic-gate extern void rfs3_write(WRITE3args *, WRITE3res *, 2133*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2134*0Sstevel@tonic-gate extern fhandle_t *rfs3_write_getfh(WRITE3args *); 2135*0Sstevel@tonic-gate extern void rfs3_create(CREATE3args *, CREATE3res *, 2136*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2137*0Sstevel@tonic-gate extern fhandle_t *rfs3_create_getfh(CREATE3args *); 2138*0Sstevel@tonic-gate extern void rfs3_mkdir(MKDIR3args *, MKDIR3res *, 2139*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2140*0Sstevel@tonic-gate extern fhandle_t *rfs3_mkdir_getfh(MKDIR3args *); 2141*0Sstevel@tonic-gate extern void rfs3_symlink(SYMLINK3args *, SYMLINK3res *, 2142*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2143*0Sstevel@tonic-gate extern fhandle_t *rfs3_symlink_getfh(SYMLINK3args *); 2144*0Sstevel@tonic-gate extern void rfs3_mknod(MKNOD3args *, MKNOD3res *, 2145*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2146*0Sstevel@tonic-gate extern fhandle_t *rfs3_mknod_getfh(MKNOD3args *); 2147*0Sstevel@tonic-gate extern void rfs3_remove(REMOVE3args *, REMOVE3res *, 2148*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2149*0Sstevel@tonic-gate extern fhandle_t *rfs3_remove_getfh(REMOVE3args *); 2150*0Sstevel@tonic-gate extern void rfs3_rmdir(RMDIR3args *, RMDIR3res *, 2151*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2152*0Sstevel@tonic-gate extern fhandle_t *rfs3_rmdir_getfh(RMDIR3args *); 2153*0Sstevel@tonic-gate extern void rfs3_rename(RENAME3args *, RENAME3res *, 2154*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2155*0Sstevel@tonic-gate extern fhandle_t *rfs3_rename_getfh(RENAME3args *); 2156*0Sstevel@tonic-gate extern void rfs3_link(LINK3args *, LINK3res *, 2157*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2158*0Sstevel@tonic-gate extern fhandle_t *rfs3_link_getfh(LINK3args *); 2159*0Sstevel@tonic-gate extern void rfs3_readdir(READDIR3args *, READDIR3res *, 2160*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2161*0Sstevel@tonic-gate extern fhandle_t *rfs3_readdir_getfh(READDIR3args *); 2162*0Sstevel@tonic-gate extern void rfs3_readdir_free(READDIR3res *); 2163*0Sstevel@tonic-gate extern void rfs3_readdirplus(READDIRPLUS3args *, READDIRPLUS3res *, 2164*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2165*0Sstevel@tonic-gate extern fhandle_t *rfs3_readdirplus_getfh(READDIRPLUS3args *); 2166*0Sstevel@tonic-gate extern void rfs3_readdirplus_free(READDIRPLUS3res *); 2167*0Sstevel@tonic-gate extern void rfs3_fsstat(FSSTAT3args *, FSSTAT3res *, 2168*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2169*0Sstevel@tonic-gate extern fhandle_t *rfs3_fsstat_getfh(FSSTAT3args *); 2170*0Sstevel@tonic-gate extern void rfs3_fsinfo(FSINFO3args *, FSINFO3res *, 2171*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2172*0Sstevel@tonic-gate extern fhandle_t *rfs3_fsinfo_getfh(FSINFO3args *); 2173*0Sstevel@tonic-gate extern void rfs3_pathconf(PATHCONF3args *, PATHCONF3res *, 2174*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2175*0Sstevel@tonic-gate extern fhandle_t *rfs3_pathconf_getfh(PATHCONF3args *); 2176*0Sstevel@tonic-gate extern void rfs3_commit(COMMIT3args *, COMMIT3res *, 2177*0Sstevel@tonic-gate struct exportinfo *, struct svc_req *, cred_t *); 2178*0Sstevel@tonic-gate extern fhandle_t *rfs3_commit_getfh(COMMIT3args *); 2179*0Sstevel@tonic-gate extern void rfs3_srvrinit(void); 2180*0Sstevel@tonic-gate extern void rfs3_srvrfini(void); 2181*0Sstevel@tonic-gate 2182*0Sstevel@tonic-gate extern int nfs3_validate_caches(vnode_t *, cred_t *); 2183*0Sstevel@tonic-gate extern void nfs3_cache_post_op_attr(vnode_t *, post_op_attr *, hrtime_t, 2184*0Sstevel@tonic-gate cred_t *); 2185*0Sstevel@tonic-gate extern void nfs3_cache_post_op_vattr(vnode_t *, post_op_vattr *, hrtime_t, 2186*0Sstevel@tonic-gate cred_t *); 2187*0Sstevel@tonic-gate extern void nfs3_cache_wcc_data(vnode_t *, wcc_data *, hrtime_t, cred_t *); 2188*0Sstevel@tonic-gate extern void nfs3_attrcache(vnode_t *, fattr3 *, hrtime_t); 2189*0Sstevel@tonic-gate extern int nfs3_cache_fattr3(vnode_t *, fattr3 *, vattr_t *, hrtime_t, 2190*0Sstevel@tonic-gate cred_t *); 2191*0Sstevel@tonic-gate extern int nfs3_getattr_otw(vnode_t *, struct vattr *, cred_t *); 2192*0Sstevel@tonic-gate extern int nfs3getattr(vnode_t *, struct vattr *, cred_t *); 2193*0Sstevel@tonic-gate extern int fattr3_to_vattr(vnode_t *, fattr3 *, struct vattr *); 2194*0Sstevel@tonic-gate extern int nfs3tsize(void); 2195*0Sstevel@tonic-gate extern uint_t nfs3_tsize(struct knetconfig *); 2196*0Sstevel@tonic-gate extern uint_t rfs3_tsize(struct svc_req *); 2197*0Sstevel@tonic-gate extern int vattr_to_sattr3(struct vattr *, sattr3 *); 2198*0Sstevel@tonic-gate extern void setdiropargs3(diropargs3 *, char *, vnode_t *); 2199*0Sstevel@tonic-gate extern enum nfsstat3 puterrno3(int); 2200*0Sstevel@tonic-gate extern int geterrno3(enum nfsstat3); 2201*0Sstevel@tonic-gate extern int nfs3init(int, char *); 2202*0Sstevel@tonic-gate extern void nfs3fini(void); 2203*0Sstevel@tonic-gate extern int nfs3_vfsinit(void); 2204*0Sstevel@tonic-gate extern void nfs3_vfsfini(void); 2205*0Sstevel@tonic-gate extern void vattr_to_post_op_attr(struct vattr *, post_op_attr *); 2206*0Sstevel@tonic-gate extern void mblk_to_iov(mblk_t *, int, struct iovec *); 2207*0Sstevel@tonic-gate extern int rfs_publicfh_mclookup(char *, vnode_t *, cred_t *, 2208*0Sstevel@tonic-gate vnode_t **, struct exportinfo **, struct sec_ol *); 2209*0Sstevel@tonic-gate extern int rfs_pathname(char *, vnode_t **, vnode_t **, 2210*0Sstevel@tonic-gate vnode_t *, cred_t *, int); 2211*0Sstevel@tonic-gate extern vtype_t nf3_to_vt[]; 2212*0Sstevel@tonic-gate extern kstat_named_t *rfsproccnt_v3_ptr; 2213*0Sstevel@tonic-gate extern vfsops_t *nfs3_vfsops; 2214*0Sstevel@tonic-gate extern struct vnodeops *nfs3_vnodeops; 2215*0Sstevel@tonic-gate extern const struct fs_operation_def nfs3_vnodeops_template[]; 2216*0Sstevel@tonic-gate #ifdef DEBUG 2217*0Sstevel@tonic-gate extern int rfs3_do_pre_op_attr; 2218*0Sstevel@tonic-gate extern int rfs3_do_post_op_attr; 2219*0Sstevel@tonic-gate extern int rfs3_do_post_op_fh3; 2220*0Sstevel@tonic-gate #endif 2221*0Sstevel@tonic-gate /* 2222*0Sstevel@tonic-gate * Some servers do not properly update the attributes of the 2223*0Sstevel@tonic-gate * directory when changes are made. To allow interoperability 2224*0Sstevel@tonic-gate * with these broken servers, the nfs_disable_rddir_cache 2225*0Sstevel@tonic-gate * parameter can be used to disable readdir response caching. 2226*0Sstevel@tonic-gate */ 2227*0Sstevel@tonic-gate extern int nfs_disable_rddir_cache; 2228*0Sstevel@tonic-gate 2229*0Sstevel@tonic-gate /* 2230*0Sstevel@tonic-gate * External functions called by the v2/v3 code into the v4 code 2231*0Sstevel@tonic-gate */ 2232*0Sstevel@tonic-gate extern void nfs4_clnt_init(void); 2233*0Sstevel@tonic-gate extern void nfs4_clnt_fini(void); 2234*0Sstevel@tonic-gate 2235*0Sstevel@tonic-gate /* 2236*0Sstevel@tonic-gate * Does NFS4 server have a vnode delegated? TRUE if so, FALSE if not. 2237*0Sstevel@tonic-gate */ 2238*0Sstevel@tonic-gate extern bool_t rfs4_check_delegated(int mode, vnode_t *, bool_t trunc); 2239*0Sstevel@tonic-gate /* 2240*0Sstevel@tonic-gate * VOP_GETATTR call. If a NFS4 delegation is present on the supplied vnode 2241*0Sstevel@tonic-gate * call back to the delegated client to get attributes for AT_MTIME and 2242*0Sstevel@tonic-gate * AT_SIZE. Invoke VOP_GETATTR to get all other attributes or all attributes 2243*0Sstevel@tonic-gate * if no delegation is present. 2244*0Sstevel@tonic-gate */ 2245*0Sstevel@tonic-gate extern int rfs4_delegated_getattr(vnode_t *, vattr_t *, int, cred_t *); 2246*0Sstevel@tonic-gate extern void rfs4_hold_deleg_policy(void); 2247*0Sstevel@tonic-gate extern void rfs4_rele_deleg_policy(void); 2248*0Sstevel@tonic-gate #endif /* _KERNEL */ 2249*0Sstevel@tonic-gate 2250*0Sstevel@tonic-gate #ifdef __cplusplus 2251*0Sstevel@tonic-gate } 2252*0Sstevel@tonic-gate #endif 2253*0Sstevel@tonic-gate 2254*0Sstevel@tonic-gate #endif /* _NFS_NFS_H */ 2255