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
*** 16,29 ****
--- 16,34 ----
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
+
/*
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
*/
+ /*
+ * Copyright 2018 Nexenta Systems, Inc.
+ */
+
#include <sys/systm.h>
#include <sys/cmn_err.h>
#include <sys/kmem.h>
#include <sys/disp.h>
#include <sys/id_space.h>
*** 247,256 ****
--- 252,305 ----
mutex_destroy(db->db_lock);
kmem_free(db, sizeof (rfs4_database_t));
}
+ /*
+ * Used to get the correct kmem_cache database for the state table being
+ * created.
+ * Helper function for rfs4_table_create
+ */
+ static kmem_cache_t *
+ get_db_mem_cache(char *name)
+ {
+ int i;
+
+ for (i = 0; i < RFS4_DB_MEM_CACHE_NUM; i++) {
+ if (strcmp(name, rfs4_db_mem_cache_table[i].r_db_name) == 0)
+ return (rfs4_db_mem_cache_table[i].r_db_mem_cache);
+ }
+ /*
+ * There is no associated kmem cache for this NFS4 server state
+ * table name
+ */
+ return (NULL);
+ }
+
+ /*
+ * Used to initialize the global NFSv4 server state database.
+ * Helper funtion for rfs4_state_g_init and called when module is loaded.
+ */
+ kmem_cache_t *
+ /* CSTYLED */
+ nfs4_init_mem_cache(char *cache_name, uint32_t idxcnt, uint32_t size, uint32_t idx)
+ {
+ kmem_cache_t *mem_cache = kmem_cache_create(cache_name,
+ sizeof (rfs4_dbe_t) + idxcnt * sizeof (rfs4_link_t) + size,
+ 0,
+ rfs4_dbe_kmem_constructor,
+ rfs4_dbe_kmem_destructor,
+ NULL,
+ NULL,
+ NULL,
+ 0);
+ (void) strlcpy(rfs4_db_mem_cache_table[idx].r_db_name, cache_name,
+ strlen(cache_name) + 1);
+ rfs4_db_mem_cache_table[idx].r_db_mem_cache = mem_cache;
+ return (mem_cache);
+ }
+
rfs4_table_t *
rfs4_table_create(rfs4_database_t *db, char *tabname, time_t max_cache_time,
uint32_t idxcnt, bool_t (*create)(rfs4_entry_t, void *),
void (*destroy)(rfs4_entry_t),
bool_t (*expiry)(rfs4_entry_t),
*** 302,320 ****
table->dbt_maxentries = maxentries;
table->dbt_create = create;
table->dbt_destroy = destroy;
table->dbt_expiry = expiry;
! table->dbt_mem_cache = kmem_cache_create(cache_name,
! sizeof (rfs4_dbe_t) + idxcnt * sizeof (rfs4_link_t) + size,
! 0,
! rfs4_dbe_kmem_constructor,
! rfs4_dbe_kmem_destructor,
! NULL,
! table,
! NULL,
! 0);
kmem_free(cache_name, len+13);
table->dbt_debug = db->db_debug_flags;
mutex_enter(db->db_lock);
--- 351,365 ----
table->dbt_maxentries = maxentries;
table->dbt_create = create;
table->dbt_destroy = destroy;
table->dbt_expiry = expiry;
! /*
! * get the correct kmem_cache for this table type based on the name.
! */
! table->dbt_mem_cache = get_db_mem_cache(cache_name);
!
kmem_free(cache_name, len+13);
table->dbt_debug = db->db_debug_flags;
mutex_enter(db->db_lock);
*** 362,372 ****
cv_destroy(&table->dbt_reaper_wait);
kmem_free(table->dbt_name, strlen(table->dbt_name) + 1);
if (table->dbt_id_space)
id_space_destroy(table->dbt_id_space);
! kmem_cache_destroy(table->dbt_mem_cache);
kmem_free(table, sizeof (rfs4_table_t));
}
rfs4_index_t *
rfs4_index_create(rfs4_table_t *table, char *keyname,
--- 407,417 ----
cv_destroy(&table->dbt_reaper_wait);
kmem_free(table->dbt_name, strlen(table->dbt_name) + 1);
if (table->dbt_id_space)
id_space_destroy(table->dbt_id_space);
! table->dbt_mem_cache = NULL;
kmem_free(table, sizeof (rfs4_table_t));
}
rfs4_index_t *
rfs4_index_create(rfs4_table_t *table, char *keyname,
*** 681,696 ****
/*ARGSUSED*/
boolean_t
rfs4_cpr_callb(void *arg, int code)
{
- rfs4_table_t *table = rfs4_client_tab;
rfs4_bucket_t *buckets, *bp;
rfs4_link_t *l;
rfs4_client_t *cp;
int i;
/*
* We get called for Suspend and Resume events.
* For the suspend case we simply don't care! Nor do we care if
* there are no clients.
*/
--- 726,743 ----
/*ARGSUSED*/
boolean_t
rfs4_cpr_callb(void *arg, int code)
{
rfs4_bucket_t *buckets, *bp;
rfs4_link_t *l;
rfs4_client_t *cp;
int i;
+ nfs4_srv_t *nsrv4 = nfs4_get_srv();
+ rfs4_table_t *table = nsrv4->rfs4_client_tab;
+
/*
* We get called for Suspend and Resume events.
* For the suspend case we simply don't care! Nor do we care if
* there are no clients.
*/
*** 877,895 ****
/* Notify the database shutdown processing that the table is shutdown */
mutex_enter(table->dbt_db->db_lock);
table->dbt_db->db_shutdown_count--;
cv_signal(&table->dbt_db->db_shutdown_wait);
mutex_exit(table->dbt_db->db_lock);
}
static void
rfs4_start_reaper(rfs4_table_t *table)
{
if (table->dbt_max_cache_time == 0)
return;
! (void) thread_create(NULL, 0, reaper_thread, table, 0, &p0, TS_RUN,
minclsyspri);
}
#ifdef DEBUG
void
--- 924,943 ----
/* Notify the database shutdown processing that the table is shutdown */
mutex_enter(table->dbt_db->db_lock);
table->dbt_db->db_shutdown_count--;
cv_signal(&table->dbt_db->db_shutdown_wait);
mutex_exit(table->dbt_db->db_lock);
+ zthread_exit();
}
static void
rfs4_start_reaper(rfs4_table_t *table)
{
if (table->dbt_max_cache_time == 0)
return;
! (void) zthread_create(NULL, 0, reaper_thread, table, 0,
minclsyspri);
}
#ifdef DEBUG
void