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
↓ 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>
↓ 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  /*
↓ 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);
↓ 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
↓ 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 *);
↓ 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   */
↓ 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 {
↓ open down ↓ 19 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX