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 *); /*