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.
*/