Print this page
Zone ID only matches once, don't loop after a match
Fix nlm_unexport

*** 2568,2591 **** * belonging to the given export and cleans * all remote locks and share reservations * on them. */ void ! nlm_unexport(struct exportinfo *exi) { - struct nlm_globals *g; struct nlm_host *hostp; ! /* This may be called on behalf of global-zone doing shutdown. */ ! ASSERT(exi->exi_zone == curzone || curzone == global_zone); ! g = zone_getspecific(nlm_zone_key, exi->exi_zone); ! if (g == NULL) { ! /* Did zone cleanup get here already? */ return; } - mutex_enter(&g->lock); hostp = avl_first(&g->nlm_hosts_tree); while (hostp != NULL) { struct nlm_vhold *nvp; if (hostp->nh_flags & NLM_NH_INIDLE) { --- 2568,2588 ---- * belonging to the given export and cleans * all remote locks and share reservations * on them. */ void ! nlm_zone_unexport(struct nlm_globals *g, struct exportinfo *exi) { struct nlm_host *hostp; ! mutex_enter(&g->lock); ! if (g->run_status != NLM_ST_UP) { ! /* nothing to do */ ! mutex_exit(&g->lock); return; } hostp = avl_first(&g->nlm_hosts_tree); while (hostp != NULL) { struct nlm_vhold *nvp; if (hostp->nh_flags & NLM_NH_INIDLE) {
*** 2629,2638 **** --- 2626,2657 ---- } mutex_exit(&g->lock); } + void + nlm_unexport(struct exportinfo *exi) + { + struct nlm_globals *g; + + rw_enter(&lm_lck, RW_READER); + TAILQ_FOREACH(g, &nlm_zones_list, nlm_link) { + if (g->nlm_zoneid == exi->exi_zoneid) { + /* + * NOTE: If we want to drop lm_lock before + * calling nlm_zone_unexport(), we should break, + * and have a post-rw_exit() snippit like: + * if (g != NULL) + * nlm_zone_unexport(g, exi); + */ + nlm_zone_unexport(g, exi); + break; /* Only going to match once! */ + } + } + rw_exit(&lm_lck); + } + /* * Allocate new unique sysid. * In case of failure (no available sysids) * return LM_NOSYSID. */