Print this page
Add VZONEROOT flag because not all zone roots have VROOT set.

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/os/zone.c
          +++ new/usr/src/uts/common/os/zone.c
↓ open down ↓ 2386 lines elided ↑ open up ↑
2387 2387                  mutex_exit(&zone_deathrow_lock);
2388 2388          }
2389 2389  
2390 2390          list_destroy(&zone->zone_ref_list);
2391 2391          zone_free_zsd(zone);
2392 2392          zone_free_datasets(zone);
2393 2393          list_destroy(&zone->zone_dl_list);
2394 2394  
2395 2395          cpu_uarray_free(zone->zone_ustate);
2396 2396  
2397      -        if (zone->zone_rootvp != NULL)
2398      -                VN_RELE(zone->zone_rootvp);
     2397 +        if (zone->zone_rootvp != NULL) {
     2398 +                vnode_t *vp = zone->zone_rootvp;
     2399 +
     2400 +                mutex_enter(&vp->v_lock);
     2401 +                vp->v_flag &= ~VZONEROOT;
     2402 +                mutex_exit(&vp->v_lock);
     2403 +                VN_RELE(vp);
     2404 +                /* No need to worry about NULL-ing out zone_rootvp. */
     2405 +        }
2399 2406          if (zone->zone_rootpath)
2400 2407                  kmem_free(zone->zone_rootpath, zone->zone_rootpathlen);
2401 2408          if (zone->zone_name != NULL)
2402 2409                  kmem_free(zone->zone_name, ZONENAME_MAX);
2403 2410          if (zone->zone_slabel != NULL)
2404 2411                  label_rele(zone->zone_slabel);
2405 2412          if (zone->zone_nodename != NULL)
2406 2413                  kmem_free(zone->zone_nodename, _SYS_NMLN);
2407 2414          if (zone->zone_domain != NULL)
2408 2415                  kmem_free(zone->zone_domain, _SYS_NMLN);
↓ open down ↓ 1062 lines elided ↑ open up ↑
3471 3478                                  /* Success! */
3472 3479                                  break;
3473 3480                          }
3474 3481                          VN_RELE(vp);
3475 3482                  }
3476 3483                  if (error != ESTALE)
3477 3484                          goto out;
3478 3485          }
3479 3486  
3480 3487          ASSERT(error == 0);
     3488 +        mutex_enter(&vp->v_lock);
     3489 +        if (vp->v_flag & VZONEROOT) {
     3490 +                /* Wow, someone's already using this zone root! */
     3491 +                error = EEXIST; /* XXX KEBE ASKS, better errno? */
     3492 +                mutex_exit(&vp->v_lock);
     3493 +                VN_RELE(vp);
     3494 +                goto out;
     3495 +        }
     3496 +        vp->v_flag |= VZONEROOT;
     3497 +        mutex_exit(&vp->v_lock);
3481 3498          zone->zone_rootvp = vp;         /* we hold a reference to vp */
3482 3499          zone->zone_rootpath = path;
3483 3500          zone->zone_rootpathlen = pathlen;
3484 3501          if (pathlen > 5 && strcmp(path + pathlen - 5, "/lu/") == 0)
3485 3502                  zone->zone_flags |= ZF_IS_SCRATCH;
3486 3503          return (0);
3487 3504  
3488 3505  out:
3489 3506          pn_free(&pn);
3490 3507          pn_free(&upn);
↓ open down ↓ 1871 lines elided ↑ open up ↑
5362 5379          if (zone->zone_flags & ZF_HASHED_LABEL)
5363 5380                  (void) mod_hash_destroy(zonehashbylabel,
5364 5381                      (mod_hash_key_t)zone->zone_slabel);
5365 5382          mutex_exit(&zonehash_lock);
5366 5383  
5367 5384          /*
5368 5385           * Release the root vnode; we're not using it anymore.  Nor should any
5369 5386           * other thread that might access it exist.
5370 5387           */
5371 5388          if (zone->zone_rootvp != NULL) {
5372      -                VN_RELE(zone->zone_rootvp);
     5389 +                vnode_t *vp = zone->zone_rootvp;
     5390 +
     5391 +                mutex_enter(&vp->v_lock);
     5392 +                vp->v_flag &= ~VZONEROOT;
     5393 +                mutex_exit(&vp->v_lock);
     5394 +                VN_RELE(vp);
5373 5395                  zone->zone_rootvp = NULL;
5374 5396          }
5375 5397  
5376 5398          /* add to deathrow list */
5377 5399          mutex_enter(&zone_deathrow_lock);
5378 5400          list_insert_tail(&zone_deathrow, zone);
5379 5401          mutex_exit(&zone_deathrow_lock);
5380 5402  
5381 5403          /*
5382 5404           * Drop last reference (which was added by zsched()), this will
↓ open down ↓ 2008 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX