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
        
*** 18,40 ****
   *
   * CDDL HEADER END
   */
  
  /*
-  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
   * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
-  * Copyright (c) 2013 by Delphix. All rights reserved.
   */
  
  /*      Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T     */
  /*        All Rights Reserved   */
  
  #ifndef _NFS_NFS_H
  #define _NFS_NFS_H
  
- /*      nfs.h 2.38 88/08/19 SMI */
- 
  #include <sys/isa_defs.h>
  #include <sys/vfs.h>
  #include <sys/stream.h>
  #include <rpc/types.h>
  #include <sys/types32.h>
--- 18,41 ----
   *
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
   */
  
  /*      Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T     */
  /*        All Rights Reserved   */
  
+ /*
+  * Copyright (c) 2013 by Delphix. All rights reserved.
+  * Copyright 2019 Nexenta by DDN, Inc. All rights reserved.
+  */
+ 
  #ifndef _NFS_NFS_H
  #define _NFS_NFS_H
  
  #include <sys/isa_defs.h>
  #include <sys/vfs.h>
  #include <sys/stream.h>
  #include <rpc/types.h>
  #include <sys/types32.h>
*** 70,83 ****
   * Used to determine registration and service handling of versions
   */
  #define NFS_VERSMIN_DEFAULT     ((rpcvers_t)2)
  #define NFS_VERSMAX_DEFAULT     ((rpcvers_t)4)
  
! extern rpcvers_t nfs_versmin;
! extern rpcvers_t nfs_versmax;
  
  /*
   * Default delegation setting for the server ==> "on"
   */
  #define NFS_SERVER_DELEGATION_DEFAULT   (TRUE)
  
  /* Maximum size of data portion of a remote request */
--- 71,132 ----
   * Used to determine registration and service handling of versions
   */
  #define NFS_VERSMIN_DEFAULT     ((rpcvers_t)2)
  #define NFS_VERSMAX_DEFAULT     ((rpcvers_t)4)
  
! /*
!  * Used to track the state of the server so that initialization
!  * can be done properly.
!  */
! typedef enum {
!         NFS_SERVER_STOPPED,     /* server state destroyed */
!         NFS_SERVER_STOPPING,    /* server state being destroyed */
!         NFS_SERVER_RUNNING,
!         NFS_SERVER_QUIESCED,    /* server state preserved */
!         NFS_SERVER_OFFLINE      /* server pool offline */
! } nfs_server_running_t;
  
+ /* Forward declarations for nfs_globals */
+ struct nfs_export;
+ struct nfs_srv;
+ struct nfs3_srv;
+ struct nfs4_srv;
+ struct nfsauth_globals;
+ 
  /*
+  * Zone globals variables of NFS server
+  */
+ typedef struct nfs_globals {
+         list_node_t             nfs_g_link;     /* all globals list */
+ 
+         rpcvers_t               nfs_versmin;
+         rpcvers_t               nfs_versmax;
+ 
+         /* NFS server locks and state */
+         nfs_server_running_t    nfs_server_upordown;
+         kmutex_t                nfs_server_upordown_lock;
+         kcondvar_t              nfs_server_upordown_cv;
+ 
+         /* RDMA wait variables */
+         kcondvar_t              rdma_wait_cv;
+         kmutex_t                rdma_wait_mutex;
+ 
+         zoneid_t                nfs_zoneid;
+         /* Per-zone data structures private to each module */
+         struct nfs_export       *nfs_export;    /* nfs_export.c */
+         struct nfs_srv          *nfs_srv;       /* nfs_srv.c */
+         struct nfs3_srv         *nfs3_srv;      /* nfs3_srv.c */
+         struct nfs4_srv         *nfs4_srv;      /* nfs4_srv.c */
+         struct nfsauth_globals  *nfs_auth;      /* nfs_auth.c */
+ 
+         /* statistic: nfs_stat.c, etc. */
+         kstat_named_t           *svstat[NFS_VERSMAX + 1];
+         kstat_named_t           *rfsproccnt[NFS_VERSMAX + 1];
+         kstat_named_t           *aclproccnt[NFS_VERSMAX + 1];
+ } nfs_globals_t;
+ 
+ /*
   * Default delegation setting for the server ==> "on"
   */
  #define NFS_SERVER_DELEGATION_DEFAULT   (TRUE)
  
  /* Maximum size of data portion of a remote request */
*** 870,879 ****
--- 919,930 ----
  extern void     rfs_statfs(fhandle_t *, struct nfsstatfs *, struct exportinfo *,
      struct svc_req *, cred_t *, bool_t);
  extern void     *rfs_statfs_getfh(fhandle_t *);
  extern void     rfs_srvrinit(void);
  extern void     rfs_srvrfini(void);
+ extern void     rfs_srv_zone_init(nfs_globals_t *);
+ extern void     rfs_srv_zone_fini(nfs_globals_t *);
  
  /*
   * flags to define path types during Multi Component Lookups
   * using the public filehandle
   */
*** 882,891 ****
--- 933,944 ----
  #define SECURITY_QUERY  0x04    /* Security query */
  
  /* index for svstat_ptr */
  enum nfs_svccounts {NFS_CALLS, NFS_BADCALLS, NFS_REFERRALS, NFS_REFERLINKS};
  
+ #define NFS_V2  NFS_VERSION
+ 
  /*      function defs for NFS kernel */
  extern int      nfs_waitfor_purge_complete(vnode_t *);
  extern int      nfs_validate_caches(vnode_t *, cred_t *);
  extern void     nfs_purge_caches(vnode_t *, int, cred_t *);
  extern void     nfs_purge_rddir_cache(vnode_t *);
*** 902,912 ****
  extern void     nfs_async_stop(struct vfs *);
  extern int      nfs_async_stop_sig(struct vfs *);
  extern int      nfs_clntinit(void);
  extern void     nfs_clntfini(void);
  extern int      nfstsize(void);
! extern int      nfs_srvinit(void);
  extern void     nfs_srvfini(void);
  extern int      vattr_to_sattr(struct vattr *, struct nfssattr *);
  extern void     setdiropargs(struct nfsdiropargs *, char *, vnode_t *);
  extern int      setdirgid(vnode_t *, gid_t *, cred_t *);
  extern int      setdirmode(vnode_t *, mode_t *, cred_t *);
--- 955,965 ----
  extern void     nfs_async_stop(struct vfs *);
  extern int      nfs_async_stop_sig(struct vfs *);
  extern int      nfs_clntinit(void);
  extern void     nfs_clntfini(void);
  extern int      nfstsize(void);
! extern void     nfs_srvinit(void);
  extern void     nfs_srvfini(void);
  extern int      vattr_to_sattr(struct vattr *, struct nfssattr *);
  extern void     setdiropargs(struct nfsdiropargs *, char *, vnode_t *);
  extern int      setdirgid(vnode_t *, gid_t *, cred_t *);
  extern int      setdirmode(vnode_t *, mode_t *, cred_t *);
*** 940,953 ****
--- 993,1010 ----
  extern void     sv_free(struct servinfo *);
  extern int      nfsauth_access(struct exportinfo *, struct svc_req *, cred_t *,
      uid_t *, gid_t *, uint_t *, gid_t **);
  extern void     nfsauth_init(void);
  extern void     nfsauth_fini(void);
+ extern void     nfsauth_zone_init(nfs_globals_t *);
+ extern void     nfsauth_zone_fini(nfs_globals_t *);
+ extern void     nfsauth_zone_shutdown(nfs_globals_t *);
  extern int      nfs_setopts(vnode_t *, model_t, struct nfs_args *);
  extern int      nfs_mount_label_policy(vfs_t *, struct netbuf *,
      struct knetconfig *, cred_t *);
  extern boolean_t nfs_has_ctty(void);
+ extern nfs_globals_t *nfs_srv_getzg(void);
  extern void     nfs_srv_stop_all(void);
  extern void     nfs_srv_quiesce_all(void);
  extern int      rfs4_dss_setpaths(char *, size_t);
  extern int      nfs_setmod_check(page_t *);
  
*** 955,967 ****
  extern time_t   rfs4_grace_period;
  extern nvlist_t *rfs4_dss_paths, *rfs4_dss_oldpaths;
  
  extern kstat_named_t    *global_svstat_ptr[];
  
  extern krwlock_t        rroklock;
  extern vtype_t          nf_to_vt[];
- extern kstat_named_t    *rfsproccnt_v2_ptr;
  extern kmutex_t         nfs_minor_lock;
  extern int              nfs_major;
  extern int              nfs_minor;
  extern vfsops_t         *nfs_vfsops;
  extern struct vnodeops  *nfs_vnodeops;
--- 1012,1027 ----
  extern time_t   rfs4_grace_period;
  extern nvlist_t *rfs4_dss_paths, *rfs4_dss_oldpaths;
  
  extern kstat_named_t    *global_svstat_ptr[];
  
+ extern zone_key_t       nfssrv_zone_key;
+ extern list_t           nfssrv_globals_list;
+ extern krwlock_t        nfssrv_globals_rwl;
+ 
  extern krwlock_t        rroklock;
  extern vtype_t          nf_to_vt[];
  extern kmutex_t         nfs_minor_lock;
  extern int              nfs_major;
  extern int              nfs_minor;
  extern vfsops_t         *nfs_vfsops;
  extern struct vnodeops  *nfs_vnodeops;
*** 973,992 ****
  /*
   * Per-zone stats as consumed by nfsstat(1m)
   */
  struct nfs_version_stats {
          kstat_named_t   *aclreqcnt_ptr;         /* nfs_acl:0:aclreqcnt_v? */
-         kstat_named_t   *aclproccnt_ptr;        /* nfs_acl:0:aclproccnt_v? */
          kstat_named_t   *rfsreqcnt_ptr;         /* nfs:0:rfsreqcnt_v? */
-         kstat_named_t   *rfsproccnt_ptr;        /* nfs:0:rfsproccnt_v? */
  };
  
  /*
   * A bit of asymmetry: nfs:0:nfs_client isn't part of this structure.
   */
  struct nfs_stats {
-         kstat_named_t           *nfs_stats_svstat_ptr[NFS_VERSMAX + 1];
          struct nfs_version_stats        nfs_stats_v2;
          struct nfs_version_stats        nfs_stats_v3;
          struct nfs_version_stats        nfs_stats_v4;
  };
  
--- 1033,1049 ----
*** 999,1008 ****
--- 1056,1068 ----
   * Zone callback functions.
   */
  extern void     *nfsstat_zone_init(zoneid_t);
  extern void     nfsstat_zone_fini(zoneid_t, void *);
  
+ extern void rfs_stat_zone_init(nfs_globals_t *);
+ extern void rfs_stat_zone_fini(nfs_globals_t *);
+ 
  #endif  /* _KERNEL */
  
  /*
   * Version 3 declarations and definitions.
   */
*** 2246,2255 ****
--- 2306,2317 ----
  extern void     rfs3_commit(COMMIT3args *, COMMIT3res *, struct exportinfo *,
      struct svc_req *, cred_t *, bool_t);
  extern void     *rfs3_commit_getfh(COMMIT3args *);
  extern void     rfs3_srvrinit(void);
  extern void     rfs3_srvrfini(void);
+ extern void     rfs3_srv_zone_init(nfs_globals_t *);
+ extern void     rfs3_srv_zone_fini(nfs_globals_t *);
  
  extern int      nfs3_validate_caches(vnode_t *, cred_t *);
  extern void     nfs3_cache_post_op_attr(vnode_t *, post_op_attr *, hrtime_t,
      cred_t *);
  extern void     nfs3_cache_post_op_vattr(vnode_t *, post_op_vattr *, hrtime_t,
*** 2280,2290 ****
      cred_t *, int);
  extern int      rfs_cross_mnt(vnode_t **, struct exportinfo **);
  extern int      rfs_climb_crossmnt(vnode_t **, struct exportinfo **, cred_t *);
  
  extern vtype_t          nf3_to_vt[];
- extern kstat_named_t    *rfsproccnt_v3_ptr;
  extern vfsops_t         *nfs3_vfsops;
  extern struct vnodeops  *nfs3_vnodeops;
  extern const struct fs_operation_def nfs3_vnodeops_template[];
  
  /*
--- 2342,2351 ----
*** 2310,2324 ****
   * call back to the delegated client to get attributes for AT_MTIME and
   * AT_SIZE. Invoke VOP_GETATTR to get all other attributes or all attributes
   * if no delegation is present.
   */
  extern int      rfs4_delegated_getattr(vnode_t *, vattr_t *, int, cred_t *);
- extern void     rfs4_hold_deleg_policy(void);
- extern void     rfs4_rele_deleg_policy(void);
  
  extern int      do_xattr_exists_check(vnode_t *, ulong_t *, cred_t *);
  
  extern ts_label_t *nfs_getflabel(vnode_t *, struct exportinfo *);
  extern boolean_t do_rfs_label_check(bslabel_t *, vnode_t *, int,
      struct exportinfo *);
  
  /*
--- 2371,2385 ----
   * call back to the delegated client to get attributes for AT_MTIME and
   * AT_SIZE. Invoke VOP_GETATTR to get all other attributes or all attributes
   * if no delegation is present.
   */
  extern int      rfs4_delegated_getattr(vnode_t *, vattr_t *, int, cred_t *);
  
  extern int      do_xattr_exists_check(vnode_t *, ulong_t *, cred_t *);
  
+ extern int      protect_zfs_mntpt(vnode_t *);
+ 
  extern ts_label_t *nfs_getflabel(vnode_t *, struct exportinfo *);
  extern boolean_t do_rfs_label_check(bslabel_t *, vnode_t *, int,
      struct exportinfo *);
  
  /*