Print this page
Fix NFS design problems re. multiple zone keys
Make NFS server zone-specific data all have the same lifetime
Fix rfs4_clean_state_exi
Fix exi_cache_reclaim
Fix mistakes in zone keys work
More fixes re. exi_zoneid and exi_tree
(danmcd -> Keep some ASSERT()s around for readability.)

@@ -25,12 +25,12 @@
 
 /*      Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T     */
 /*        All Rights Reserved   */
 
 /*
- * Copyright 2018 Nexenta Systems, Inc.
  * 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
 

@@ -83,14 +83,23 @@
         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;

@@ -98,10 +107,18 @@
         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 */
 } nfs_globals_t;
 
 /*
  * Default delegation setting for the server ==> "on"
  */

@@ -897,10 +914,12 @@
 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
  */

@@ -967,14 +986,18 @@
 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 *);
 

@@ -982,12 +1005,14 @@
 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       rfs4_zone_key;
 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 kstat_named_t    *rfsproccnt_v2_ptr;
 extern kmutex_t         nfs_minor_lock;
 extern int              nfs_major;

@@ -2275,10 +2300,12 @@
 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,