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