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,33 **** * * CDDL HEADER END */ /* ! * Copyright 2015 Nexenta Systems, Inc. All rights reserved. */ /* ! * Copyright 2010 Sun Microsystems, Inc. All rights reserved. ! * Use is subject to license terms. */ #ifndef _NFS4_H #define _NFS4_H --- 18,34 ---- * * CDDL HEADER END */ /* ! * Copyright 2010 Sun Microsystems, Inc. All rights reserved. ! * Use is subject to license terms. */ /* ! * Copyright 2018 Nexenta Systems, Inc. ! * Copyright 2019 Nexenta by DDN, Inc. */ #ifndef _NFS4_H #define _NFS4_H
*** 37,46 **** --- 38,48 ---- #include <rpc/rpc.h> #include <nfs/nfs.h> #ifdef _KERNEL #include <nfs/nfs4_kprot.h> + #include <nfs/nfs4_drc.h> #include <sys/nvpair.h> #else #include <rpcsvc/nfs4_prot.h> #endif #include <nfs/nfs4_attr.h>
*** 117,135 **** typedef struct { /* opaque entry type for later use */ rfs4_dbe_t *dbe; } *rfs4_entry_t; ! extern rfs4_table_t *rfs4_client_tab; /* database, table, index creation entry points */ extern rfs4_database_t *rfs4_database_create(uint32_t); extern void rfs4_database_shutdown(rfs4_database_t *); extern void rfs4_database_destroy(rfs4_database_t *); extern void rfs4_database_destroy(rfs4_database_t *); extern rfs4_table_t *rfs4_table_create(rfs4_database_t *, char *, time_t, uint32_t, bool_t (*create)(rfs4_entry_t, void *), void (*destroy)(rfs4_entry_t), bool_t (*expiry)(rfs4_entry_t), --- 119,153 ---- typedef struct { /* opaque entry type for later use */ rfs4_dbe_t *dbe; } *rfs4_entry_t; ! /* ! * NFSv4 server state databases ! * ! * Initialized when the module is loaded and used by NFSv4 state tables. ! * These kmem_cache free pools are used globally, the NFSv4 state tables ! * which make use of these kmem_cache free pools are per zone. ! */ ! extern kmem_cache_t *rfs4_client_mem_cache; ! extern kmem_cache_t *rfs4_clntIP_mem_cache; ! extern kmem_cache_t *rfs4_openown_mem_cache; ! extern kmem_cache_t *rfs4_openstID_mem_cache; ! extern kmem_cache_t *rfs4_lockstID_mem_cache; ! extern kmem_cache_t *rfs4_lockown_mem_cache; ! extern kmem_cache_t *rfs4_file_mem_cache; ! extern kmem_cache_t *rfs4_delegstID_mem_cache; /* database, table, index creation entry points */ extern rfs4_database_t *rfs4_database_create(uint32_t); extern void rfs4_database_shutdown(rfs4_database_t *); extern void rfs4_database_destroy(rfs4_database_t *); extern void rfs4_database_destroy(rfs4_database_t *); + extern kmem_cache_t *nfs4_init_mem_cache(char *, uint32_t, uint32_t, + uint32_t); extern rfs4_table_t *rfs4_table_create(rfs4_database_t *, char *, time_t, uint32_t, bool_t (*create)(rfs4_entry_t, void *), void (*destroy)(rfs4_entry_t), bool_t (*expiry)(rfs4_entry_t),
*** 367,382 **** /* array of paths passed-in from nfsd command-line; stored in nvlist */ char **rfs4_dss_newpaths; uint_t rfs4_dss_numnewpaths; - /* - * Circular doubly-linked list of paths for currently-served RGs. - * No locking required: only changed on warmstart. Managed with insque/remque. - */ - rfs4_dss_path_t *rfs4_dss_pathlist; - /* nvlists of all DSS paths: current, and before last warmstart */ nvlist_t *rfs4_dss_paths, *rfs4_dss_oldpaths; /* * The server maintains a set of state on a per client basis that --- 385,394 ----
*** 738,767 **** uint32_t rf_deny_read; uint32_t rf_deny_write; krwlock_t rf_file_rwlock; } rfs4_file_t; - extern int rfs4_seen_first_compound; /* set first time we see one */ - - extern rfs4_servinst_t *rfs4_cur_servinst; /* current server instance */ - extern kmutex_t rfs4_servinst_lock; /* protects linked list */ - extern void rfs4_servinst_create(int, int, char **); - extern void rfs4_servinst_destroy_all(void); - extern void rfs4_servinst_assign(rfs4_client_t *, - rfs4_servinst_t *); - extern rfs4_servinst_t *rfs4_servinst(rfs4_client_t *); - extern int rfs4_clnt_in_grace(rfs4_client_t *); - extern int rfs4_servinst_in_grace(rfs4_servinst_t *); - extern int rfs4_servinst_grace_new(rfs4_servinst_t *); - extern void rfs4_grace_start(rfs4_servinst_t *); - extern void rfs4_grace_start_new(void); - extern void rfs4_grace_reset_all(void); - extern void rfs4_ss_oldstate(rfs4_oldstate_t *, char *, char *); - extern void rfs4_dss_readstate(int, char **); - /* ! * rfs4_deleg_policy is used to signify the server's global delegation * policy. The default is to NEVER delegate files and the * administrator must configure the server to enable delegations. * * The disable/enable delegation functions are used to eliminate a * race with exclusive creates. --- 750,761 ---- uint32_t rf_deny_read; uint32_t rf_deny_write; krwlock_t rf_file_rwlock; } rfs4_file_t; /* ! * nfs4_deleg_policy is used to signify the server's global delegation * policy. The default is to NEVER delegate files and the * administrator must configure the server to enable delegations. * * The disable/enable delegation functions are used to eliminate a * race with exclusive creates.
*** 769,780 **** typedef enum { SRV_NEVER_DELEGATE = 0, SRV_NORMAL_DELEGATE = 1 } srv_deleg_policy_t; - extern srv_deleg_policy_t rfs4_deleg_policy; - extern kmutex_t rfs4_deleg_lock; extern void rfs4_disable_delegation(void), rfs4_enable_delegation(void); /* * Request types for delegation. These correspond with * open_delegation_type4 with the addition of a new value, DELEG_ANY, --- 763,772 ----
*** 788,802 **** } delegreq_t; #define NFS4_DELEG4TYPE2REQTYPE(x) (delegreq_t)(x) /* * Various interfaces to manipulate the state structures introduced * above */ - extern kmutex_t rfs4_state_lock; - extern void rfs4_clean_state_exi(struct exportinfo *exi); extern void rfs4_free_reply(nfs_resop4 *); extern void rfs4_copy_reply(nfs_resop4 *, nfs_resop4 *); /* rfs4_client_t handling */ extern rfs4_client_t *rfs4_findclient(nfs_client_id4 *, --- 780,907 ---- } delegreq_t; #define NFS4_DELEG4TYPE2REQTYPE(x) (delegreq_t)(x) /* + * Zone global variables of NFSv4 server + */ + typedef struct nfs4_srv { + /* Unique write verifier */ + verifier4 write4verf; + /* Delegation lock */ + kmutex_t deleg_lock; + /* Used to serialize create/destroy of nfs4_server_state database */ + kmutex_t state_lock; + rfs4_database_t *nfs4_server_state; + /* Used to manage access to server instance linked list */ + kmutex_t servinst_lock; + rfs4_servinst_t *nfs4_cur_servinst; + /* Used to manage access to nfs4_deleg_policy */ + krwlock_t deleg_policy_lock; + srv_deleg_policy_t nfs4_deleg_policy; + /* Set first time we see one */ + int seen_first_compound; + /* + * Circular double-linked list of paths for currently-served RGs. + * No locking required -- only changed on server start. + * Managed with insque/remque. + */ + rfs4_dss_path_t *dss_pathlist; + /* Duplicate request cache */ + rfs4_drc_t *nfs4_drc; + /* nfsv4 server start time */ + time_t rfs4_start_time; + /* Used to serialize lookups of clientids */ + krwlock_t rfs4_findclient_lock; + + /* NFSv4 server state client tables */ + /* table expiry times */ + time_t rfs4_client_cache_time; + time_t rfs4_openowner_cache_time; + time_t rfs4_state_cache_time; + time_t rfs4_lo_state_cache_time; + time_t rfs4_lockowner_cache_time; + time_t rfs4_file_cache_time; + time_t rfs4_deleg_state_cache_time; + time_t rfs4_clntip_cache_time; + /* tables and indexes */ + /* client table */ + rfs4_table_t *rfs4_client_tab; + rfs4_index_t *rfs4_clientid_idx; + rfs4_index_t *rfs4_nfsclnt_idx; + /* client IP table */ + rfs4_table_t *rfs4_clntip_tab; + rfs4_index_t *rfs4_clntip_idx; + /* Open Owner table */ + rfs4_table_t *rfs4_openowner_tab; + rfs4_index_t *rfs4_openowner_idx; + /* Open State ID table */ + rfs4_table_t *rfs4_state_tab; + rfs4_index_t *rfs4_state_idx; + rfs4_index_t *rfs4_state_owner_file_idx; + rfs4_index_t *rfs4_state_file_idx; + /* Lock State ID table */ + rfs4_table_t *rfs4_lo_state_tab; + rfs4_index_t *rfs4_lo_state_idx; + rfs4_index_t *rfs4_lo_state_owner_idx; + /* Lock owner table */ + rfs4_table_t *rfs4_lockowner_tab; + rfs4_index_t *rfs4_lockowner_idx; + rfs4_index_t *rfs4_lockowner_pid_idx; + /* File table */ + rfs4_table_t *rfs4_file_tab; + rfs4_index_t *rfs4_file_idx; + /* Deleg State table */ + rfs4_table_t *rfs4_deleg_state_tab; + rfs4_index_t *rfs4_deleg_idx; + rfs4_index_t *rfs4_deleg_state_idx; + + /* client stable storage */ + int rfs4_ss_enabled; + } nfs4_srv_t; + + /* + * max length of the NFSv4 server database name + */ + #define RFS4_MAX_MEM_CACHE_NAME 48 + + /* + * global NFSv4 server kmem caches + * r_db_name - The name of the state database and the table that will use it + * These tables are defined in nfs4_srv_t + * r_db_mem_cache - The kmem cache associated with the state database name + */ + typedef struct rfs4_db_mem_cache { + char r_db_name[RFS4_MAX_MEM_CACHE_NAME]; + kmem_cache_t *r_db_mem_cache; + } rfs4_db_mem_cache_t; + + #define RFS4_DB_MEM_CACHE_NUM 8 + + rfs4_db_mem_cache_t rfs4_db_mem_cache_table[RFS4_DB_MEM_CACHE_NUM]; + + + extern srv_deleg_policy_t nfs4_get_deleg_policy(); + + extern void rfs4_servinst_create(nfs4_srv_t *, int, int, char **); + extern void rfs4_servinst_destroy_all(nfs4_srv_t *); + extern void rfs4_servinst_assign(nfs4_srv_t *, rfs4_client_t *, + rfs4_servinst_t *); + extern rfs4_servinst_t *rfs4_servinst(rfs4_client_t *); + extern int rfs4_clnt_in_grace(rfs4_client_t *); + extern int rfs4_servinst_in_grace(rfs4_servinst_t *); + extern int rfs4_servinst_grace_new(rfs4_servinst_t *); + extern void rfs4_grace_start(rfs4_servinst_t *); + extern void rfs4_grace_start_new(nfs4_srv_t *); + extern void rfs4_grace_reset_all(nfs4_srv_t *); + extern void rfs4_ss_oldstate(rfs4_oldstate_t *, char *, char *); + extern void rfs4_dss_readstate(nfs4_srv_t *, int, char **); + + /* * Various interfaces to manipulate the state structures introduced * above */ extern void rfs4_free_reply(nfs_resop4 *); extern void rfs4_copy_reply(nfs_resop4 *, nfs_resop4 *); /* rfs4_client_t handling */ extern rfs4_client_t *rfs4_findclient(nfs_client_id4 *,
*** 944,954 **** extern fem_t *deleg_rdops; extern fem_t *deleg_wrops; extern int rfs4_share(rfs4_state_t *, uint32_t, uint32_t); extern int rfs4_unshare(rfs4_state_t *); ! extern void rfs4_set_deleg_policy(srv_deleg_policy_t); #ifdef DEBUG #define NFS4_DEBUG(var, args) if (var) cmn_err args extern int rfs4_debug; extern int nfs4_client_attr_debug; --- 1049,1062 ---- extern fem_t *deleg_rdops; extern fem_t *deleg_wrops; extern int rfs4_share(rfs4_state_t *, uint32_t, uint32_t); extern int rfs4_unshare(rfs4_state_t *); ! extern void rfs4_set_deleg_policy(nfs4_srv_t *, srv_deleg_policy_t); ! extern void rfs4_hold_deleg_policy(nfs4_srv_t *); ! extern void rfs4_rele_deleg_policy(nfs4_srv_t *); ! #ifdef DEBUG #define NFS4_DEBUG(var, args) if (var) cmn_err args extern int rfs4_debug; extern int nfs4_client_attr_debug;
*** 1346,1356 **** extern vtype_t nf4_to_vt[]; extern struct nfs4_ntov_map nfs4_ntov_map[]; extern uint_t nfs4_ntov_map_size; - extern kstat_named_t *rfsproccnt_v4_ptr; extern struct vfsops *nfs4_vfsops; extern struct vnodeops *nfs4_vnodeops; extern const struct fs_operation_def nfs4_vnodeops_template[]; extern vnodeops_t *nfs4_trigger_vnodeops; extern const struct fs_operation_def nfs4_trigger_vnodeops_template[]; --- 1454,1463 ----
*** 1375,1393 **** /* * The NFS Version 4 service procedures. */ extern void rfs4_compound(COMPOUND4args *, COMPOUND4res *, struct exportinfo *, struct svc_req *, cred_t *, int *); extern void rfs4_compound_free(COMPOUND4res *); extern void rfs4_compound_flagproc(COMPOUND4args *, int *); ! extern int rfs4_srvrinit(void); extern void rfs4_srvrfini(void); ! extern void rfs4_state_init(void); ! extern void rfs4_state_fini(void); #endif #ifdef __cplusplus } #endif --- 1482,1506 ---- /* * The NFS Version 4 service procedures. */ + extern void rfs4_do_server_start(int, int, int); extern void rfs4_compound(COMPOUND4args *, COMPOUND4res *, struct exportinfo *, struct svc_req *, cred_t *, int *); extern void rfs4_compound_free(COMPOUND4res *); extern void rfs4_compound_flagproc(COMPOUND4args *, int *); ! extern void rfs4_srvrinit(void); extern void rfs4_srvrfini(void); ! extern void rfs4_srv_zone_init(nfs_globals_t *); ! extern void rfs4_srv_zone_fini(nfs_globals_t *); ! extern void rfs4_state_g_init(void); ! extern void rfs4_state_zone_init(nfs4_srv_t *); ! extern void rfs4_state_g_fini(void); ! extern void rfs4_state_zone_fini(void); ! extern nfs4_srv_t *nfs4_get_srv(void); #endif #ifdef __cplusplus } #endif