Print this page
Dan mods to NFS desgin problems re. multiple zone keys
Do rfs4_ss_fini() BEFORE rfs4_servinst_destroy_all().
Go ahead and destroy the NFSv4 database tables
*** 1494,1503 ****
--- 1494,1511 ----
nfs4_srv_t *nsrv4;
nsrv4 = nfs4_get_srv();
rfs4_set_deleg_policy(nsrv4, SRV_NEVER_DELEGATE);
+ /*
+ * Clean up any dangling stable storage structures BEFORE calling
+ * rfs4_servinst_destroy_all() so there are no dangling structures
+ * (i.e. the srvinsts are all cleared of danglers BEFORE they get
+ * freed).
+ */
+ rfs4_ss_fini(nsrv4);
+
mutex_enter(&nsrv4->state_lock);
if (nsrv4->nfs4_server_state == NULL) {
mutex_exit(&nsrv4->state_lock);
return;
*** 1515,1530 ****
rw_destroy(&nsrv4->rfs4_findclient_lock);
/* First stop all of the reaper threads in the database */
rfs4_database_shutdown(dbp);
/*
! * XXX workaround
! * Skip destrying the state database yet just in case there
! * are unfinished operations depending on it.
*/
/* Now destroy/release the database tables */
! /* rfs4_database_destroy(dbp); */
/* Reset the cache timers for next time */
nsrv4->rfs4_client_cache_time = 0;
nsrv4->rfs4_openowner_cache_time = 0;
nsrv4->rfs4_state_cache_time = 0;
--- 1523,1540 ----
rw_destroy(&nsrv4->rfs4_findclient_lock);
/* First stop all of the reaper threads in the database */
rfs4_database_shutdown(dbp);
/*
! * WARNING: There may be consumers of the rfs4 database still
! * active as we destroy these. IF that's the case, consider putting
! * some of their _zone_fini()-like functions into the zsd key as
! * ~~SHUTDOWN~~ functions instead of ~~DESTROY~~ functions. We can
! * maintain some ordering guarantees better that way.
*/
/* Now destroy/release the database tables */
! rfs4_database_destroy(dbp);
/* Reset the cache timers for next time */
nsrv4->rfs4_client_cache_time = 0;
nsrv4->rfs4_openowner_cache_time = 0;
nsrv4->rfs4_state_cache_time = 0;
*** 1532,1544 ****
nsrv4->rfs4_lockowner_cache_time = 0;
nsrv4->rfs4_file_cache_time = 0;
nsrv4->rfs4_deleg_state_cache_time = 0;
mutex_exit(&nsrv4->state_lock);
-
- /* clean up any dangling stable storage structures */
- rfs4_ss_fini(nsrv4);
}
typedef union {
struct {
uint32_t start_time;
--- 1542,1551 ----
*** 4121,4134 ****
if (nsrv4->nfs4_server_state == NULL) {
mutex_exit(&nsrv4->state_lock);
return;
}
! /* CSTYLED */
! rfs4_dbe_walk(nsrv4->rfs4_lo_state_tab, rfs4_lo_state_walk_callout, exi);
rfs4_dbe_walk(nsrv4->rfs4_state_tab, rfs4_state_walk_callout, exi);
! /* CSTYLED */
! rfs4_dbe_walk(nsrv4->rfs4_deleg_state_tab, rfs4_deleg_state_walk_callout, exi);
rfs4_dbe_walk(nsrv4->rfs4_file_tab, rfs4_file_walk_callout, exi);
mutex_exit(&nsrv4->state_lock);
}
--- 4128,4141 ----
if (nsrv4->nfs4_server_state == NULL) {
mutex_exit(&nsrv4->state_lock);
return;
}
! rfs4_dbe_walk(nsrv4->rfs4_lo_state_tab,
! rfs4_lo_state_walk_callout, exi);
rfs4_dbe_walk(nsrv4->rfs4_state_tab, rfs4_state_walk_callout, exi);
! rfs4_dbe_walk(nsrv4->rfs4_deleg_state_tab,
! rfs4_deleg_state_walk_callout, exi);
rfs4_dbe_walk(nsrv4->rfs4_file_tab, rfs4_file_walk_callout, exi);
mutex_exit(&nsrv4->state_lock);
}