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

*** 87,128 **** { "badcalls", KSTAT_DATA_UINT64 }, { "referrals", KSTAT_DATA_UINT64 }, { "referlinks", KSTAT_DATA_UINT64 }, }; - /* Points to the global zone server kstat data for all nfs versions */ - kstat_named_t *global_svstat_ptr[NFS_VERSMAX + 1]; - static void nfsstat_zone_init_server(zoneid_t zoneid, kstat_named_t *svstatp[]) { int vers; - /* - * first two indexes of these arrays are not used, so initialize - * to NULL - */ - svstatp[0] = NULL; - svstatp[1] = NULL; - global_svstat_ptr[0] = NULL; - global_svstat_ptr[0] = NULL; - for (vers = NFS_VERSION; vers <= NFS_V4; vers++) { svstatp[vers] = nfsstat_zone_init_common(zoneid, "nfs", vers, "nfs_server", svstat_tmpl, sizeof (svstat_tmpl)); - if (zoneid == GLOBAL_ZONEID) - global_svstat_ptr[vers] = svstatp[vers]; } } static void ! nfsstat_zone_fini_server(zoneid_t zoneid, kstat_named_t **svstatp) { int vers; for (vers = NFS_VERSION; vers <= NFS_V4; vers++) { - if (zoneid == GLOBAL_ZONEID) - global_svstat_ptr[vers] = NULL; nfsstat_zone_fini_common(zoneid, "nfs", vers, "nfs_server"); kmem_free(svstatp[vers], sizeof (svstat_tmpl)); } } --- 87,112 ---- { "badcalls", KSTAT_DATA_UINT64 }, { "referrals", KSTAT_DATA_UINT64 }, { "referlinks", KSTAT_DATA_UINT64 }, }; static void nfsstat_zone_init_server(zoneid_t zoneid, kstat_named_t *svstatp[]) { int vers; for (vers = NFS_VERSION; vers <= NFS_V4; vers++) { svstatp[vers] = nfsstat_zone_init_common(zoneid, "nfs", vers, "nfs_server", svstat_tmpl, sizeof (svstat_tmpl)); } } static void ! nfsstat_zone_fini_server(zoneid_t zoneid, kstat_named_t *svstatp[]) { int vers; for (vers = NFS_VERSION; vers <= NFS_V4; vers++) { nfsstat_zone_fini_common(zoneid, "nfs", vers, "nfs_server"); kmem_free(svstatp[vers], sizeof (svstat_tmpl)); } }
*** 186,218 **** { "rmdir", KSTAT_DATA_UINT64 }, { "readdir", KSTAT_DATA_UINT64 }, { "statfs", KSTAT_DATA_UINT64 } }; - kstat_named_t *rfsproccnt_v2_ptr; - - static void - nfsstat_zone_init_rfsproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - kstat_named_t *ks_data; - - ks_data = nfsstat_zone_init_common(zoneid, "nfs", 0, "rfsproccnt_v2", - rfsproccnt_v2_tmpl, sizeof (rfsproccnt_v2_tmpl)); - statsp->rfsproccnt_ptr = ks_data; - if (zoneid == GLOBAL_ZONEID) - rfsproccnt_v2_ptr = ks_data; - } - - static void - nfsstat_zone_fini_rfsproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - if (zoneid == GLOBAL_ZONEID) - rfsproccnt_v2_ptr = NULL; - nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v2"); - kmem_free(statsp->rfsproccnt_ptr, sizeof (rfsproccnt_v2_tmpl)); - } - /* * NFSv2 client ACL stats */ static const kstat_named_t aclreqcnt_v2_tmpl[] = { { "null", KSTAT_DATA_UINT64 }, --- 170,179 ----
*** 247,280 **** { "getattr", KSTAT_DATA_UINT64 }, { "access", KSTAT_DATA_UINT64 }, { "getxattrdir", KSTAT_DATA_UINT64 } }; - kstat_named_t *aclproccnt_v2_ptr; - - static void - nfsstat_zone_init_aclproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - kstat_named_t *ks_data; - - ks_data = nfsstat_zone_init_common(zoneid, "nfs_acl", 0, - "aclproccnt_v2", aclproccnt_v2_tmpl, - sizeof (aclproccnt_v2_tmpl)); - statsp->aclproccnt_ptr = ks_data; - if (zoneid == GLOBAL_ZONEID) - aclproccnt_v2_ptr = ks_data; - } - - static void - nfsstat_zone_fini_aclproc_v2(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - if (zoneid == GLOBAL_ZONEID) - aclproccnt_v2_ptr = NULL; - nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v2"); - kmem_free(statsp->aclproccnt_ptr, sizeof (aclproccnt_v2_tmpl)); - } - /* * NFSv3 client stats */ static const kstat_named_t rfsreqcnt_v3_tmpl[] = { { "null", KSTAT_DATA_UINT64 }, --- 208,217 ----
*** 341,373 **** { "fsinfo", KSTAT_DATA_UINT64 }, { "pathconf", KSTAT_DATA_UINT64 }, { "commit", KSTAT_DATA_UINT64 } }; - kstat_named_t *rfsproccnt_v3_ptr; - - static void - nfsstat_zone_init_rfsproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - kstat_named_t *ks_data; - - ks_data = nfsstat_zone_init_common(zoneid, "nfs", 0, "rfsproccnt_v3", - rfsproccnt_v3_tmpl, sizeof (rfsproccnt_v3_tmpl)); - statsp->rfsproccnt_ptr = ks_data; - if (zoneid == GLOBAL_ZONEID) - rfsproccnt_v3_ptr = ks_data; - } - - static void - nfsstat_zone_fini_rfsproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - if (zoneid == GLOBAL_ZONEID) - rfsproccnt_v3_ptr = NULL; - nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v3"); - kmem_free(statsp->rfsproccnt_ptr, sizeof (rfsproccnt_v3_tmpl)); - } - /* * NFSv3 client ACL stats */ static const kstat_named_t aclreqcnt_v3_tmpl[] = { { "null", KSTAT_DATA_UINT64 }, --- 278,287 ----
*** 398,431 **** { "getacl", KSTAT_DATA_UINT64 }, { "setacl", KSTAT_DATA_UINT64 }, { "getxattrdir", KSTAT_DATA_UINT64 } }; - kstat_named_t *aclproccnt_v3_ptr; - - static void - nfsstat_zone_init_aclproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - kstat_named_t *ks_data; - - ks_data = nfsstat_zone_init_common(zoneid, "nfs_acl", 0, - "aclproccnt_v3", aclproccnt_v3_tmpl, - sizeof (aclproccnt_v3_tmpl)); - statsp->aclproccnt_ptr = ks_data; - if (zoneid == GLOBAL_ZONEID) - aclproccnt_v3_ptr = ks_data; - } - - static void - nfsstat_zone_fini_aclproc_v3(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - if (zoneid == GLOBAL_ZONEID) - aclproccnt_v3_ptr = NULL; - nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v3"); - kmem_free(statsp->aclproccnt_ptr, sizeof (aclproccnt_v3_tmpl)); - } - /* * NFSv4 client stats */ static const kstat_named_t rfsreqcnt_v4_tmpl[] = { { "null", KSTAT_DATA_UINT64 }, --- 312,321 ----
*** 528,560 **** { "write", KSTAT_DATA_UINT64 }, { "release_lockowner", KSTAT_DATA_UINT64 }, { "illegal", KSTAT_DATA_UINT64 }, }; - kstat_named_t *rfsproccnt_v4_ptr; - - static void - nfsstat_zone_init_rfsproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - kstat_named_t *ks_data; - - ks_data = nfsstat_zone_init_common(zoneid, "nfs", 0, "rfsproccnt_v4", - rfsproccnt_v4_tmpl, sizeof (rfsproccnt_v4_tmpl)); - statsp->rfsproccnt_ptr = ks_data; - if (zoneid == GLOBAL_ZONEID) - rfsproccnt_v4_ptr = ks_data; - } - - static void - nfsstat_zone_fini_rfsproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - if (zoneid == GLOBAL_ZONEID) - rfsproccnt_v4_ptr = NULL; - nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v4"); - kmem_free(statsp->rfsproccnt_ptr, sizeof (rfsproccnt_v4_tmpl)); - } - /* * NFSv4 client ACL stats */ static const kstat_named_t aclreqcnt_v4_tmpl[] = { { "null", KSTAT_DATA_UINT64 }, --- 418,427 ----
*** 575,617 **** nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclreqcnt_v4"); kmem_free(statsp->aclreqcnt_ptr, sizeof (aclreqcnt_v4_tmpl)); } /* - * NFSv4 server ACL stats - */ - static const kstat_named_t aclproccnt_v4_tmpl[] = { - { "null", KSTAT_DATA_UINT64 }, - { "getacl", KSTAT_DATA_UINT64 }, - { "setacl", KSTAT_DATA_UINT64 } - }; - - kstat_named_t *aclproccnt_v4_ptr; - - static void - nfsstat_zone_init_aclproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - kstat_named_t *ks_data; - - ks_data = nfsstat_zone_init_common(zoneid, "nfs_acl", 0, - "aclproccnt_v4", aclproccnt_v4_tmpl, - sizeof (aclproccnt_v4_tmpl)); - statsp->aclproccnt_ptr = ks_data; - if (zoneid == GLOBAL_ZONEID) - aclproccnt_v4_ptr = ks_data; - } - - static void - nfsstat_zone_fini_aclproc_v4(zoneid_t zoneid, struct nfs_version_stats *statsp) - { - if (zoneid == GLOBAL_ZONEID) - aclproccnt_v4_ptr = NULL; - nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v4"); - kmem_free(statsp->aclproccnt_ptr, sizeof (aclproccnt_v4_tmpl)); - } - - /* * Zone initializer callback to setup the kstats. */ void * nfsstat_zone_init(zoneid_t zoneid) { --- 442,451 ----
*** 618,652 **** struct nfs_stats *nfs_stats_ptr; nfs_stats_ptr = kmem_zalloc(sizeof (*nfs_stats_ptr), KM_SLEEP); /* - * Initialize all versions of the nfs_server - */ - nfsstat_zone_init_server(zoneid, nfs_stats_ptr->nfs_stats_svstat_ptr); - - /* * Initialize v2 stats */ nfsstat_zone_init_rfsreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); - nfsstat_zone_init_rfsproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); nfsstat_zone_init_aclreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); - nfsstat_zone_init_aclproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); /* * Initialize v3 stats */ nfsstat_zone_init_rfsreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); - nfsstat_zone_init_rfsproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); nfsstat_zone_init_aclreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); - nfsstat_zone_init_aclproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); /* * Initialize v4 stats */ nfsstat_zone_init_rfsreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); - nfsstat_zone_init_rfsproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); nfsstat_zone_init_aclreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); - nfsstat_zone_init_aclproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); return (nfs_stats_ptr); } /* --- 452,475 ----
*** 656,688 **** nfsstat_zone_fini(zoneid_t zoneid, void *data) { struct nfs_stats *nfs_stats_ptr = data; /* - * Free nfs:0:nfs_server stats - */ - nfsstat_zone_fini_server(zoneid, nfs_stats_ptr->nfs_stats_svstat_ptr); - - /* * Free v2 stats */ nfsstat_zone_fini_rfsreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); - nfsstat_zone_fini_rfsproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); nfsstat_zone_fini_aclreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); - nfsstat_zone_fini_aclproc_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); /* * Free v3 stats */ nfsstat_zone_fini_rfsreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); - nfsstat_zone_fini_rfsproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); nfsstat_zone_fini_aclreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); - nfsstat_zone_fini_aclproc_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); /* * Free v4 stats */ nfsstat_zone_fini_rfsreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); - nfsstat_zone_fini_rfsproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); nfsstat_zone_fini_aclreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); - nfsstat_zone_fini_aclproc_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); kmem_free(nfs_stats_ptr, sizeof (*nfs_stats_ptr)); } --- 479,554 ---- nfsstat_zone_fini(zoneid_t zoneid, void *data) { struct nfs_stats *nfs_stats_ptr = data; /* * Free v2 stats */ nfsstat_zone_fini_rfsreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); nfsstat_zone_fini_aclreq_v2(zoneid, &nfs_stats_ptr->nfs_stats_v2); /* * Free v3 stats */ nfsstat_zone_fini_rfsreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); nfsstat_zone_fini_aclreq_v3(zoneid, &nfs_stats_ptr->nfs_stats_v3); /* * Free v4 stats */ nfsstat_zone_fini_rfsreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); nfsstat_zone_fini_aclreq_v4(zoneid, &nfs_stats_ptr->nfs_stats_v4); kmem_free(nfs_stats_ptr, sizeof (*nfs_stats_ptr)); + } + + void + rfs_stat_zone_init(nfs_globals_t *ng) + { + zoneid_t zoneid = ng->nfs_zoneid; + + /* Initialize all versions of the nfs_server */ + nfsstat_zone_init_server(zoneid, ng->svstat); + + /* NFS proc */ + ng->rfsproccnt[NFS_V2] = nfsstat_zone_init_common(zoneid, "nfs", 0, + "rfsproccnt_v2", rfsproccnt_v2_tmpl, sizeof (rfsproccnt_v2_tmpl)); + + ng->rfsproccnt[NFS_V3] = nfsstat_zone_init_common(zoneid, "nfs", 0, + "rfsproccnt_v3", rfsproccnt_v3_tmpl, sizeof (rfsproccnt_v3_tmpl)); + + ng->rfsproccnt[NFS_V4] = nfsstat_zone_init_common(zoneid, "nfs", 0, + "rfsproccnt_v4", rfsproccnt_v4_tmpl, sizeof (rfsproccnt_v4_tmpl)); + + /* ACL proc */ + ng->aclproccnt[NFS_V2] = nfsstat_zone_init_common(zoneid, "nfs_acl", 0, + "aclproccnt_v2", aclproccnt_v2_tmpl, sizeof (aclproccnt_v2_tmpl)); + + ng->aclproccnt[NFS_V3] = nfsstat_zone_init_common(zoneid, "nfs_acl", 0, + "aclproccnt_v3", aclproccnt_v3_tmpl, sizeof (aclproccnt_v3_tmpl)); + + } + + void + rfs_stat_zone_fini(nfs_globals_t *ng) + { + zoneid_t zoneid = ng->nfs_zoneid; + + /* Free nfs:x:nfs_server stats */ + nfsstat_zone_fini_server(zoneid, ng->svstat); + + /* NFS */ + nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v2"); + kmem_free(ng->rfsproccnt[NFS_V2], sizeof (rfsproccnt_v2_tmpl)); + + nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v3"); + kmem_free(ng->rfsproccnt[NFS_V3], sizeof (rfsproccnt_v3_tmpl)); + + nfsstat_zone_fini_common(zoneid, "nfs", 0, "rfsproccnt_v4"); + kmem_free(ng->rfsproccnt[NFS_V4], sizeof (rfsproccnt_v4_tmpl)); + + /* ACL */ + nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v2"); + kmem_free(ng->aclproccnt[NFS_V2], sizeof (aclproccnt_v2_tmpl)); + + nfsstat_zone_fini_common(zoneid, "nfs_acl", 0, "aclproccnt_v3"); + kmem_free(ng->aclproccnt[NFS_V3], sizeof (aclproccnt_v3_tmpl)); + }