Print this page
Untrip aggressive assert AND use EXI_TO_ZONEROOTVP
Revert exi_zone to exi_zoneid, and install exi_ne backpointer
*** 691,718 ****
*/
exportinfo_t *
vis2exi(treenode_t *tnode)
{
exportinfo_t *exi_ret = NULL;
- #ifdef DEBUG
- zone_t *zone = NULL;
- #endif
for (;;) {
tnode = tnode->tree_parent;
- #ifdef DEBUG
- if (zone == NULL && tnode->tree_exi != NULL)
- zone = tnode->tree_exi->exi_zone;
- #endif
if (TREE_ROOT(tnode)) {
- ASSERT3P(zone, ==, tnode->tree_exi->exi_zone);
exi_ret = tnode->tree_exi;
break;
}
}
! ASSERT(exi_ret); /* Every visible should have its home exportinfo */
return (exi_ret);
}
/*
* For NFS V4.
--- 691,711 ----
*/
exportinfo_t *
vis2exi(treenode_t *tnode)
{
exportinfo_t *exi_ret = NULL;
for (;;) {
tnode = tnode->tree_parent;
if (TREE_ROOT(tnode)) {
exi_ret = tnode->tree_exi;
break;
}
}
! /* Every visible should have its home exportinfo */
! ASSERT(exi_ret != NULL);
return (exi_ret);
}
/*
* For NFS V4.
*** 724,734 ****
int seccnt, bool_t isadd)
{
treenode_t *tnode;
ASSERT(RW_WRITE_HELD(&ne->exported_lock));
- ASSERT3U(exip->exi_zoneid, ==, curzone->zone_id);
/*
* exi_tree can be null for the zone root
* which means we're already at the "top"
* and there's nothing more to "climb".
--- 717,726 ----
*** 749,759 ****
* its pseudonode.
* Note - for VROOT exports the implicitly allowed flavors were
* transferred from the PSEUDO export in exportfs()
*/
if (isadd && !(exip->exi_vp->v_flag & VROOT) &&
! !VN_IS_CURZONEROOT(exip->exi_vp) &&
tnode->tree_vis->vis_seccnt > 0) {
srv_secinfo_add(&exip->exi_export.ex_secinfo,
&exip->exi_export.ex_seccnt, tnode->tree_vis->vis_secinfo,
tnode->tree_vis->vis_seccnt, FALSE);
}
--- 741,751 ----
* its pseudonode.
* Note - for VROOT exports the implicitly allowed flavors were
* transferred from the PSEUDO export in exportfs()
*/
if (isadd && !(exip->exi_vp->v_flag & VROOT) &&
! !VN_CMP(exip->exi_vp, EXI_TO_ZONEROOTVP(exip)) &&
tnode->tree_vis->vis_seccnt > 0) {
srv_secinfo_add(&exip->exi_export.ex_secinfo,
&exip->exi_export.ex_seccnt, tnode->tree_vis->vis_secinfo,
tnode->tree_vis->vis_seccnt, FALSE);
}
*** 822,831 ****
--- 814,824 ----
exp_hash_link(exi, fid_hash, bckt);
bckt = &ne->exptable_path_hash[pkp_tab_hash(exi->exi_export.ex_path,
strlen(exi->exi_export.ex_path))];
exp_hash_link(exi, path_hash, bckt);
+ exi->exi_ne = ne;
}
/*
* Helper functions for exi_id handling
*/
*** 928,942 ****
/*
* Because we cannot:
* ASSERT(curzone->zone_id == ng->nfs_zoneid);
* We grab the zone pointer explicitly (like netstacks do) and
* set the rootvp here.
*/
zone = zone_find_by_id_nolock(ng->nfs_zoneid);
ne->exi_root->exi_vp = zone->zone_rootvp;
! ne->exi_root->exi_zone = zone; /* XXX KEBE SAYS lose me, and... */
! /* ne->exi_root->exi_zoneid = ng->nfs_zoneid; */ /* use me instead! */
/*
* Fill in ne->exi_rootfid later, in nfs_export_get_rootfid
* because we can't correctly return errors here.
*/
--- 921,938 ----
/*
* Because we cannot:
* ASSERT(curzone->zone_id == ng->nfs_zoneid);
* We grab the zone pointer explicitly (like netstacks do) and
* set the rootvp here.
+ *
+ * Subsequent exportinfo_t's that get export_link()ed to "ne" also
+ * will backpoint to "ne" such that exi->exi_ne->exi_root->exi_vp
+ * will get the zone's rootvp for a given exportinfo_t.
*/
zone = zone_find_by_id_nolock(ng->nfs_zoneid);
ne->exi_root->exi_vp = zone->zone_rootvp;
! ne->exi_root->exi_zoneid = ng->nfs_zoneid;
/*
* Fill in ne->exi_rootfid later, in nfs_export_get_rootfid
* because we can't correctly return errors here.
*/
*** 1410,1422 ****
exi = kmem_zalloc(sizeof (*exi), KM_SLEEP);
exi->exi_fsid = fsid;
exi->exi_fid = fid;
exi->exi_vp = vp;
exi->exi_count = 1;
! exi->exi_zone = crgetzone(cr);
! ASSERT(exi->exi_zone != NULL); /* XXX KEBE ASKS... */
! ASSERT3P(exi->exi_zone, ==, curzone); /* ... are these legit? */
exi->exi_volatile_dev = (vfssw[vp->v_vfsp->vfs_fstype].vsw_flag &
VSW_VOLATILEDEV) ? 1 : 0;
mutex_init(&exi->exi_lock, NULL, MUTEX_DEFAULT, NULL);
exi->exi_dvp = dvp;
--- 1406,1417 ----
exi = kmem_zalloc(sizeof (*exi), KM_SLEEP);
exi->exi_fsid = fsid;
exi->exi_fid = fid;
exi->exi_vp = vp;
exi->exi_count = 1;
! exi->exi_zoneid = crgetzoneid(cr);
! ASSERT3U(exi->exi_zoneid, ==, curzone->zone_id);
exi->exi_volatile_dev = (vfssw[vp->v_vfsp->vfs_fstype].vsw_flag &
VSW_VOLATILEDEV) ? 1 : 0;
mutex_init(&exi->exi_lock, NULL, MUTEX_DEFAULT, NULL);
exi->exi_dvp = dvp;
*** 1882,1891 ****
--- 1877,1888 ----
{
ASSERT(RW_WRITE_HELD(&ne->exported_lock));
exp_hash_unlink(exi, fid_hash);
exp_hash_unlink(exi, path_hash);
+ ASSERT3P(exi->exi_ne, ==, ne);
+ exi->exi_ne = NULL;
}
/*
* Unexport an exported filesystem
*/
*** 1926,1936 ****
newexi = pseudo_exportfs(ne, exi->exi_vp, &exi->exi_fid,
exi->exi_visible, &exi->exi_export);
exi->exi_visible = NULL;
/* interconnect the existing treenode with the new exportinfo */
- newexi->exi_zone = exi->exi_zone; /* XXX KEBE SAYS LOSE ME */
newexi->exi_tree = exi->exi_tree;
newexi->exi_tree->tree_exi = newexi;
/* Update the change timestamp */
tree_update_change(ne, exi->exi_tree, NULL);
--- 1923,1932 ----