Print this page
Add VZONEROOT flag because not all zone roots have VROOT set.
*** 2392,2403 ****
zone_free_datasets(zone);
list_destroy(&zone->zone_dl_list);
cpu_uarray_free(zone->zone_ustate);
! if (zone->zone_rootvp != NULL)
! VN_RELE(zone->zone_rootvp);
if (zone->zone_rootpath)
kmem_free(zone->zone_rootpath, zone->zone_rootpathlen);
if (zone->zone_name != NULL)
kmem_free(zone->zone_name, ZONENAME_MAX);
if (zone->zone_slabel != NULL)
--- 2392,2410 ----
zone_free_datasets(zone);
list_destroy(&zone->zone_dl_list);
cpu_uarray_free(zone->zone_ustate);
! if (zone->zone_rootvp != NULL) {
! vnode_t *vp = zone->zone_rootvp;
!
! mutex_enter(&vp->v_lock);
! vp->v_flag &= ~VZONEROOT;
! mutex_exit(&vp->v_lock);
! VN_RELE(vp);
! /* No need to worry about NULL-ing out zone_rootvp. */
! }
if (zone->zone_rootpath)
kmem_free(zone->zone_rootpath, zone->zone_rootpathlen);
if (zone->zone_name != NULL)
kmem_free(zone->zone_name, ZONENAME_MAX);
if (zone->zone_slabel != NULL)
*** 3476,3485 ****
--- 3483,3502 ----
if (error != ESTALE)
goto out;
}
ASSERT(error == 0);
+ mutex_enter(&vp->v_lock);
+ if (vp->v_flag & VZONEROOT) {
+ /* Wow, someone's already using this zone root! */
+ error = EEXIST; /* XXX KEBE ASKS, better errno? */
+ mutex_exit(&vp->v_lock);
+ VN_RELE(vp);
+ goto out;
+ }
+ vp->v_flag |= VZONEROOT;
+ mutex_exit(&vp->v_lock);
zone->zone_rootvp = vp; /* we hold a reference to vp */
zone->zone_rootpath = path;
zone->zone_rootpathlen = pathlen;
if (pathlen > 5 && strcmp(path + pathlen - 5, "/lu/") == 0)
zone->zone_flags |= ZF_IS_SCRATCH;
*** 5367,5377 ****
/*
* Release the root vnode; we're not using it anymore. Nor should any
* other thread that might access it exist.
*/
if (zone->zone_rootvp != NULL) {
! VN_RELE(zone->zone_rootvp);
zone->zone_rootvp = NULL;
}
/* add to deathrow list */
mutex_enter(&zone_deathrow_lock);
--- 5384,5399 ----
/*
* Release the root vnode; we're not using it anymore. Nor should any
* other thread that might access it exist.
*/
if (zone->zone_rootvp != NULL) {
! vnode_t *vp = zone->zone_rootvp;
!
! mutex_enter(&vp->v_lock);
! vp->v_flag &= ~VZONEROOT;
! mutex_exit(&vp->v_lock);
! VN_RELE(vp);
zone->zone_rootvp = NULL;
}
/* add to deathrow list */
mutex_enter(&zone_deathrow_lock);