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); }