Print this page
NEX-16917 Need to reduce the impact of NFS per-share kstats on failover
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
NEX-15279 support NFS server in zone
NEX-15520 online NFS shares cause zoneadm halt to hang in nfs_export_zone_fini
Portions contributed by: Dan Kruchinin dan.kruchinin@nexenta.com
Portions contributed by: Stepan Zastupov stepan.zastupov@gmail.com
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
NEX-6778 NFS kstats leak and cause system to hang
Revert "NEX-4261 Per-client NFS server IOPS, bandwidth, and latency kstats"
This reverts commit 586c3ab1927647487f01c337ddc011c642575a52.
Revert "NEX-5354 Aggregated IOPS, bandwidth, and latency kstats for NFS server"
This reverts commit c91d7614da8618ef48018102b077f60ecbbac8c2.
Revert "NEX-5667 nfssrv_stats_flags does not work for aggregated kstats"
This reverts commit 3dcf42618be7dd5f408c327f429c81e07ca08e74.
Revert "NEX-5750 Time values for aggregated NFS server kstats should be normalized"
This reverts commit 1f4d4f901153b0191027969fa4a8064f9d3b9ee1.
Revert "NEX-5942 Panic in rfs4_minorvers_mismatch() with NFSv4.1 client"
This reverts commit 40766417094a162f5e4cc8786c0fa0a7e5871cd9.
Revert "NEX-5752 NFS server: namespace collision in kstats"
This reverts commit ae81e668db86050da8e483264acb0cce0444a132.
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-5354 Aggregated IOPS, bandwidth, and latency kstats for NFS server
Reviewed by: Steve Peng <steve.peng@nexenta.com>
NEX-4261 Per-client NFS server IOPS, bandwidth, and latency kstats
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-3097 IOPS, bandwidth, and latency kstats for NFS server
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
NEX-3524 CLONE - Port NEX-3505 "wrong authentication" messages with root=@0.0.0.0/0 set, result in loss of client access
Reviewed by: Marcel Telka <marcel.telka@nexenta.com>
NEX-3533 CLONE - Port NEX-3019 NFSv3 writes underneath mounted filesystem to directory
Reviewed by: Dan Fields <dan.fields@nexenta.com>
NEX-1974 Support for more than 16 groups with AUTH_SYS
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
NEX-1128 NFS server: Generic uid and gid remapping for AUTH_SYS
Reviewed by: Jan Kryl <jan.kryl@nexenta.com>
OS-20 share_nfs(1m) charset handling is unreliable
OS-22 Page fault at nfscmd_dropped_entrysize+0x1e()
OS-23 NFSv2/3/4: READDIR responses are inconsistent when charset conversion fails
OS-24 rfs3_readdir(): Issues related to nfscmd_convdirent()
Reviewed by: Jan Kryl <jan.kryl@nexenta.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
re #13613 rb4516 Tunables needs volatile keyword
closes #12112 rb3823 - nfs-nohide: lookup("..") for submount should be correct
re #3541 rb11254 - nfs nohide - "nfssrv: need ability to go to submounts for v3 and v2 protocols"

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/nfs/nfs.h
          +++ new/usr/src/uts/common/nfs/nfs.h
↓ 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 2018 Nexenta Systems, Inc.
       31 + * Copyright (c) 2013 by Delphix. 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>
↓ 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  
  78   88  /*
       89 + * Zone globals variables of NFS server
       90 + */
       91 +typedef struct nfs_globals {
       92 +        rpcvers_t               nfs_versmin;
       93 +        rpcvers_t               nfs_versmax;
       94 +
       95 +        /* NFS server locks and state */
       96 +        nfs_server_running_t    nfs_server_upordown;
       97 +        kmutex_t                nfs_server_upordown_lock;
       98 +        kcondvar_t              nfs_server_upordown_cv;
       99 +
      100 +        /* RDMA wait variables */
      101 +        kcondvar_t              rdma_wait_cv;
      102 +        kmutex_t                rdma_wait_mutex;
      103 +} nfs_globals_t;
      104 +
      105 +/*
  79  106   * Default delegation setting for the server ==> "on"
  80  107   */
  81  108  #define NFS_SERVER_DELEGATION_DEFAULT   (TRUE)
  82  109  
  83  110  /* Maximum size of data portion of a remote request */
  84  111  #define NFS_MAXDATA     8192
  85  112  #define NFS_MAXNAMLEN   255
  86  113  #define NFS_MAXPATHLEN  1024
  87  114  
  88  115  /*
↓ open down ↓ 147 lines elided ↑ open up ↑
 236  263   * If nfs_allow_preepoch_time is TRUE, the maximum time value is INT32_MAX
 237  264   * for both kernel configurations and the minimum is INT32_MIN.
 238  265   *
 239  266   * And for nfsv4 (int64_t):
 240  267   *
 241  268   * nfsv4 allows for negative values in the protocol, and has a 64-bit
 242  269   * time field, so nfs_allow_preepoch_time can be ignored.
 243  270   */
 244  271  #ifdef _KERNEL
 245  272  
 246      -extern bool_t           nfs_allow_preepoch_time;
      273 +extern volatile bool_t  nfs_allow_preepoch_time;
 247  274  
 248  275  #ifdef _LP64
 249  276  
 250  277  /*
 251  278   * If no negative otw values are allowed, may use the full 32-bits of the
 252  279   * time to represent time later than 2038, by presenting the value as an
 253  280   * unsigned (but this can only be used by 64-bit apps due to cstat32
 254  281   * restrictions). If negative values are allowed, cannot represent times
 255  282   * after 2038. Either way, all 32 bits have a valid representation.
 256  283   */
↓ open down ↓ 351 lines elided ↑ open up ↑
 608  635  /*
 609  636   * Arguments to readdir
 610  637   */
 611  638  struct nfsrddirargs {
 612  639          fhandle_t rda_fh;       /* directory handle */
 613  640          uint32_t rda_offset;    /* offset in directory (opaque) */
 614  641          uint32_t rda_count;     /* number of directory bytes to read */
 615  642  };
 616  643  
 617  644  /*
      645 + * Entry structure
      646 + */
      647 +struct nfsentry {
      648 +        uint32_t fileid;
      649 +        char *name;
      650 +        uint32_t cookie;
      651 +        struct nfsentry *nextentry;
      652 +};
      653 +
      654 +/*
 618  655   * NFS_OK part of readdir result
 619  656   */
 620  657  struct nfsrdok {
      658 +        struct nfsentry *rdok_entries;  /* variable number of entries */
      659 +        bool_t rdok_eof;                /* true if last entry is in result */
      660 +
 621  661          uint32_t rdok_offset;           /* next offset (opaque) */
 622  662          uint32_t rdok_size;             /* size in bytes of entries */
 623      -        bool_t  rdok_eof;               /* true if last entry is in result */
 624      -        struct dirent64 *rdok_entries;  /* variable number of entries */
      663 +        struct dirent64 *rdok_dirents;  /* variable number of entries */
 625  664  };
 626  665  
 627  666  /*
 628  667   * Readdir result
 629  668   */
 630  669  struct nfsrddirres {
 631  670          nfsstat rd_status;
 632      -        uint_t          rd_bufsize;     /* client request size (not xdr'ed) */
 633  671          union {
 634  672                  struct nfsrdok rd_rdok_u;
 635  673          } rd_u;
 636  674  };
 637  675  #define rd_rdok         rd_u.rd_rdok_u
      676 +#define rd_entries      rd_u.rd_rdok_u.rdok_entries
      677 +#define rd_eof          rd_u.rd_rdok_u.rdok_eof
      678 +
 638  679  #define rd_offset       rd_u.rd_rdok_u.rdok_offset
 639  680  #define rd_size         rd_u.rd_rdok_u.rdok_size
 640      -#define rd_eof          rd_u.rd_rdok_u.rdok_eof
 641      -#define rd_entries      rd_u.rd_rdok_u.rdok_entries
      681 +#define rd_dirents      rd_u.rd_rdok_u.rdok_dirents
 642  682  
 643  683  
 644  684  /*
 645  685   * Arguments for directory operations
 646  686   */
 647  687  struct nfsdiropargs {
 648  688          fhandle_t       *da_fhandle;    /* pointer to directory file handle */
 649  689          char            *da_name;       /* name (up to NFS_MAXNAMLEN bytes) */
 650  690          fhandle_t       da_fhandle_buf; /* directory file handle */
 651  691          int             da_flags;       /* flags, see below */
↓ open down ↓ 245 lines elided ↑ open up ↑
 897  937  extern int      nfs_getattr_otw(vnode_t *, struct vattr *, cred_t *);
 898  938  extern int      nfsgetattr(vnode_t *, struct vattr *, cred_t *);
 899  939  extern int      nattr_to_vattr(vnode_t *, struct nfsfattr *, struct vattr *);
 900  940  extern void     nfs_async_manager(struct vfs *);
 901  941  extern void     nfs_async_manager_stop(struct vfs *);
 902  942  extern void     nfs_async_stop(struct vfs *);
 903  943  extern int      nfs_async_stop_sig(struct vfs *);
 904  944  extern int      nfs_clntinit(void);
 905  945  extern void     nfs_clntfini(void);
 906  946  extern int      nfstsize(void);
 907      -extern int      nfs_srvinit(void);
      947 +extern void     nfs_srvinit(void);
 908  948  extern void     nfs_srvfini(void);
 909  949  extern int      vattr_to_sattr(struct vattr *, struct nfssattr *);
 910  950  extern void     setdiropargs(struct nfsdiropargs *, char *, vnode_t *);
 911  951  extern int      setdirgid(vnode_t *, gid_t *, cred_t *);
 912  952  extern int      setdirmode(vnode_t *, mode_t *, cred_t *);
 913  953  extern int      newnum(void);
 914  954  extern char     *newname(void);
 915  955  extern int      nfs_subrinit(void);
 916  956  extern void     nfs_subrfini(void);
 917  957  extern enum nfsstat puterrno(int);
↓ open down ↓ 32 lines elided ↑ open up ↑
 950  990  extern void     nfs_srv_quiesce_all(void);
 951  991  extern int      rfs4_dss_setpaths(char *, size_t);
 952  992  extern int      nfs_setmod_check(page_t *);
 953  993  
 954  994  extern time_t   rfs4_lease_time;
 955  995  extern time_t   rfs4_grace_period;
 956  996  extern nvlist_t *rfs4_dss_paths, *rfs4_dss_oldpaths;
 957  997  
 958  998  extern kstat_named_t    *global_svstat_ptr[];
 959  999  
     1000 +extern zone_key_t       rfs4_zone_key;
     1001 +extern zone_key_t       nfssrv_zone_key;
 960 1002  extern krwlock_t        rroklock;
 961 1003  extern vtype_t          nf_to_vt[];
 962 1004  extern kstat_named_t    *rfsproccnt_v2_ptr;
     1005 +extern kstat_t          **rfsprocio_v2_ptr;
 963 1006  extern kmutex_t         nfs_minor_lock;
 964 1007  extern int              nfs_major;
 965 1008  extern int              nfs_minor;
 966 1009  extern vfsops_t         *nfs_vfsops;
 967 1010  extern struct vnodeops  *nfs_vnodeops;
 968 1011  extern const struct fs_operation_def nfs_vnodeops_template[];
 969 1012  extern int              nfsfstyp;
 970 1013  extern void             (*nfs_srv_quiesce_func)(void);
 971 1014  extern int              (*nfs_srv_dss_func)(char *, size_t);
 972 1015  
 973 1016  /*
 974      - * Per-zone stats as consumed by nfsstat(1m)
     1017 + * Per-zone stats
 975 1018   */
 976 1019  struct nfs_version_stats {
 977 1020          kstat_named_t   *aclreqcnt_ptr;         /* nfs_acl:0:aclreqcnt_v? */
 978 1021          kstat_named_t   *aclproccnt_ptr;        /* nfs_acl:0:aclproccnt_v? */
     1022 +        kstat_t         **aclprocio_ptr;        /* nfs_acl:0:aclprocio_v?_* */
     1023 +        kmutex_t        aclprocio_lock;         /* protects aclprocio */
 979 1024          kstat_named_t   *rfsreqcnt_ptr;         /* nfs:0:rfsreqcnt_v? */
 980 1025          kstat_named_t   *rfsproccnt_ptr;        /* nfs:0:rfsproccnt_v? */
     1026 +        kstat_t         **rfsprocio_ptr;        /* nfs:0:rfsprocio_v?_* */
     1027 +        kmutex_t        rfsprocio_lock;         /* protects rfsprocio */
 981 1028  };
 982 1029  
 983 1030  /*
 984 1031   * A bit of asymmetry: nfs:0:nfs_client isn't part of this structure.
 985 1032   */
 986 1033  struct nfs_stats {
 987 1034          kstat_named_t           *nfs_stats_svstat_ptr[NFS_VERSMAX + 1];
 988 1035          struct nfs_version_stats        nfs_stats_v2;
 989 1036          struct nfs_version_stats        nfs_stats_v3;
 990 1037          struct nfs_version_stats        nfs_stats_v4;
↓ open down ↓ 3 lines elided ↑ open up ↑
 994 1041   * Key used to retrieve counters.
 995 1042   */
 996 1043  extern zone_key_t nfsstat_zone_key;
 997 1044  
 998 1045  /*
 999 1046   * Zone callback functions.
1000 1047   */
1001 1048  extern void     *nfsstat_zone_init(zoneid_t);
1002 1049  extern void     nfsstat_zone_fini(zoneid_t, void *);
1003 1050  
     1051 +/*
     1052 + * Per-exportinfo stats
     1053 + */
     1054 +struct exp_kstats {
     1055 +        kstat_t         *share_kstat;           /* Generic share kstat */
     1056 +        struct {
     1057 +                kstat_named_t   path;           /* Shared path */
     1058 +                kstat_named_t   filesystem;     /* pseudo|real */
     1059 +        } share_kstat_data;                     /* Generic share kstat data */
     1060 +        char            *share_path;            /* Shared path string */
     1061 +        kstat_t         **rfsshr_v3_ptr;        /* NFS v3 per share stats */
     1062 +        kstat_t         **rfsshr_v4_ptr;        /* NFS v4 per share stats */
     1063 +        kmutex_t        procio_lock;            /* protects all exp_kstats */
     1064 +};
     1065 +
     1066 +extern struct exp_kstats *exp_kstats_init(zoneid_t, int, const char *, size_t,
     1067 +    bool_t);
     1068 +extern void exp_kstats_delete(struct exp_kstats *);
     1069 +extern void exp_kstats_fini(struct exp_kstats *);
     1070 +extern void exp_kstats_reset(struct exp_kstats *, const char *, size_t, bool_t);
     1071 +
     1072 +extern kstat_t *exp_kstats_v2(struct exp_kstats *, uint_t);
     1073 +extern kstat_t *exp_kstats_v3(struct exp_kstats *, uint_t);
     1074 +extern kstat_t *exp_kstats_v4(struct exp_kstats *, uint_t);
     1075 +
1004 1076  #endif  /* _KERNEL */
1005 1077  
1006 1078  /*
1007 1079   * Version 3 declarations and definitions.
1008 1080   */
1009 1081  
1010 1082  #define NFS3_FHSIZE 64
1011 1083  #define NFS3_COOKIEVERFSIZE 8
1012 1084  #define NFS3_CREATEVERFSIZE 8
1013 1085  #define NFS3_WRITEVERFSIZE 8
↓ open down ↓ 800 lines elided ↑ open up ↑
1814 1886  struct dirlist3 {
1815 1887          entry3 *entries;
1816 1888          bool_t eof;
1817 1889  };
1818 1890  typedef struct dirlist3 dirlist3;
1819 1891  
1820 1892  struct READDIR3resok {
1821 1893          post_op_attr dir_attributes;
1822 1894          cookieverf3 cookieverf;
1823 1895          dirlist3 reply;
1824      -        uint_t size;
1825      -        uint_t count;
1826      -        uint_t freecount;
1827      -        cookie3 cookie;
1828 1896  };
1829 1897  typedef struct READDIR3resok READDIR3resok;
1830 1898  
1831 1899  struct READDIR3resfail {
1832 1900          post_op_attr dir_attributes;
1833 1901  };
1834 1902  typedef struct READDIR3resfail READDIR3resfail;
1835 1903  
1836 1904  struct READDIR3res {
1837 1905          nfsstat3 status;
↓ open down ↓ 36 lines elided ↑ open up ↑
1874 1942          struct entryplus3 *nextentry;
1875 1943  };
1876 1944  typedef struct entryplus3 entryplus3;
1877 1945  
1878 1946  struct dirlistplus3 {
1879 1947          entryplus3 *entries;
1880 1948          bool_t eof;
1881 1949  };
1882 1950  typedef struct dirlistplus3 dirlistplus3;
1883 1951  
1884      -struct entryplus3_info {
1885      -        post_op_attr attr;
1886      -        post_op_fh3 fh;
1887      -        uint_t namelen;
1888      -};
1889      -typedef struct entryplus3_info entryplus3_info;
1890      -
1891 1952  struct READDIRPLUS3resok {
1892 1953          post_op_attr dir_attributes;
1893 1954          cookieverf3 cookieverf;
1894 1955          dirlistplus3 reply;
1895      -        uint_t size;
1896      -        uint_t count;
1897      -        uint_t maxcount;
1898      -        entryplus3_info *infop;
1899 1956  };
1900 1957  typedef struct READDIRPLUS3resok READDIRPLUS3resok;
1901 1958  
1902 1959  struct READDIRPLUS3resfail {
1903 1960          post_op_attr dir_attributes;
1904 1961  };
1905 1962  typedef struct READDIRPLUS3resfail READDIRPLUS3resfail;
1906 1963  
1907 1964  struct READDIRPLUS3res {
1908 1965          nfsstat3 status;
↓ open down ↓ 362 lines elided ↑ open up ↑
2271 2328  extern int      nfs3init(int, char *);
2272 2329  extern void     nfs3fini(void);
2273 2330  extern int      nfs3_vfsinit(void);
2274 2331  extern void     nfs3_vfsfini(void);
2275 2332  extern void     vattr_to_post_op_attr(struct vattr *, post_op_attr *);
2276 2333  extern void     mblk_to_iov(mblk_t *, int, struct iovec *);
2277 2334  extern int      rfs_publicfh_mclookup(char *, vnode_t *, cred_t *, vnode_t **,
2278 2335      struct exportinfo **, struct sec_ol *);
2279 2336  extern int      rfs_pathname(char *, vnode_t **, vnode_t **, vnode_t *,
2280 2337      cred_t *, int);
     2338 +extern int      rfs_cross_mnt(vnode_t **, struct exportinfo **);
     2339 +extern int      rfs_climb_crossmnt(vnode_t **, struct exportinfo **, cred_t *);
2281 2340  
2282 2341  extern vtype_t          nf3_to_vt[];
2283 2342  extern kstat_named_t    *rfsproccnt_v3_ptr;
     2343 +extern kstat_t          **rfsprocio_v3_ptr;
2284 2344  extern vfsops_t         *nfs3_vfsops;
2285 2345  extern struct vnodeops  *nfs3_vnodeops;
2286 2346  extern const struct fs_operation_def nfs3_vnodeops_template[];
2287 2347  
2288 2348  /*
2289 2349   * Some servers do not properly update the attributes of the
2290 2350   * directory when changes are made.  To allow interoperability
2291 2351   * with these broken servers, the nfs_disable_rddir_cache
2292 2352   * parameter can be used to disable readdir response caching.
2293 2353   */
2294      -extern int              nfs_disable_rddir_cache;
     2354 +extern volatile int     nfs_disable_rddir_cache;
2295 2355  
2296 2356  /*
2297 2357   * External functions called by the v2/v3 code into the v4 code
2298 2358   */
2299 2359  extern void     nfs4_clnt_init(void);
2300 2360  extern void     nfs4_clnt_fini(void);
2301 2361  
2302 2362  /*
2303 2363   * Does NFS4 server have a vnode delegated?  TRUE if so, FALSE if not.
2304 2364   */
2305 2365  extern bool_t   rfs4_check_delegated(int mode, vnode_t *, bool_t trunc);
2306 2366  /*
2307 2367   * VOP_GETATTR call. If a NFS4 delegation is present on the supplied vnode
2308 2368   * call back to the delegated client to get attributes for AT_MTIME and
2309 2369   * AT_SIZE. Invoke VOP_GETATTR to get all other attributes or all attributes
2310 2370   * if no delegation is present.
2311 2371   */
2312 2372  extern int      rfs4_delegated_getattr(vnode_t *, vattr_t *, int, cred_t *);
2313      -extern void     rfs4_hold_deleg_policy(void);
2314      -extern void     rfs4_rele_deleg_policy(void);
2315 2373  
2316 2374  extern int      do_xattr_exists_check(vnode_t *, ulong_t *, cred_t *);
2317 2375  
     2376 +extern int      protect_zfs_mntpt(vnode_t *);
     2377 +
2318 2378  extern ts_label_t *nfs_getflabel(vnode_t *, struct exportinfo *);
2319 2379  extern boolean_t do_rfs_label_check(bslabel_t *, vnode_t *, int,
2320 2380      struct exportinfo *);
2321 2381  
2322 2382  /*
2323 2383   * Copy Reduction support.
2324 2384   * xuio_t wrapper with additional private data.
2325 2385   */
2326 2386  
2327 2387  typedef struct nfs_xuio {
↓ open down ↓ 19 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX