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 ----