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