Print this page
Untrip aggressive assert AND use EXI_TO_ZONEROOTVP
Revert exi_zone to exi_zoneid, and install exi_ne backpointer
Hyperaggressive asserts pt 1/N
Ooops exi_zoneid isn't a variable again yet
Be far more judicious in the use of curzone-using macros.
(Merge and extra asserts by danmcd.)
Bad assertions
nfs_export_zone_init() can't assume called in zone-context.
curzone reality check and teardown changes to use the RIGHT zone
Try to remove assumption that zone's root vnode is marked VROOT

*** 700,719 **** exi_ret = tnode->tree_exi; break; } } ! ASSERT(exi_ret); /* Every visible should have its home exportinfo */ return (exi_ret); } /* * For NFS V4. * Add or remove the newly exported or unexported security flavors of the * given exportinfo from its ancestors upto the system root. */ ! void srv_secinfo_treeclimb(nfs_export_t *ne, exportinfo_t *exip, secinfo_t *sec, int seccnt, bool_t isadd) { treenode_t *tnode; --- 700,720 ---- exi_ret = tnode->tree_exi; break; } } ! /* Every visible should have its home exportinfo */ ! ASSERT(exi_ret != NULL); return (exi_ret); } /* * For NFS V4. * Add or remove the newly exported or unexported security flavors of the * given exportinfo from its ancestors upto the system root. */ ! static void srv_secinfo_treeclimb(nfs_export_t *ne, exportinfo_t *exip, secinfo_t *sec, int seccnt, bool_t isadd) { treenode_t *tnode;
*** 740,749 **** --- 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); }
*** 805,822 **** export_link(nfs_export_t *ne, exportinfo_t *exi) { exportinfo_t **bckt; ASSERT(RW_WRITE_HELD(&ne->exported_lock)); - ASSERT(exi->exi_zoneid == ne->ne_globals->nfs_zoneid); bckt = &ne->exptable[exptablehash(&exi->exi_fsid, &exi->exi_fid)]; 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); } /* * Helper functions for exi_id handling */ --- 807,824 ---- export_link(nfs_export_t *ne, exportinfo_t *exi) { exportinfo_t **bckt; ASSERT(RW_WRITE_HELD(&ne->exported_lock)); bckt = &ne->exptable[exptablehash(&exi->exi_fsid, &exi->exi_fid)]; 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 */
*** 889,898 **** --- 891,901 ---- void nfs_export_zone_init(nfs_globals_t *ng) { int i; nfs_export_t *ne; + zone_t *zone; ne = kmem_zalloc(sizeof (*ne), KM_SLEEP); rw_init(&ne->exported_lock, NULL, RW_DEFAULT, NULL);
*** 913,923 **** ne->exi_root->exi_export.ex_path[1] = '\0'; ne->exi_root->exi_count = 1; mutex_init(&ne->exi_root->exi_lock, NULL, MUTEX_DEFAULT, NULL); ! ne->exi_root->exi_vp = 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. --- 916,937 ---- ne->exi_root->exi_export.ex_path[1] = '\0'; ne->exi_root->exi_count = 1; mutex_init(&ne->exi_root->exi_lock, NULL, MUTEX_DEFAULT, NULL); ! /* ! * 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.
*** 1393,1402 **** --- 1407,1417 ---- 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;
*** 1862,1871 **** --- 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 */
*** 1935,1944 **** --- 1952,1966 ---- /* * If this was a public export, restore * the public filehandle to the root. */ + + /* + * XXX KEBE ASKS --> Should CRED() instead be + * exi->exi_zone->zone_kcred? + */ if (exi == ne->exi_public) { ne->exi_public = ne->exi_root; nfslog_share_record(ne->exi_public, CRED()); }
*** 2169,2179 **** /* * We have just failed finding a matching export. * If we're at the root of this filesystem, then * it's time to stop (with failure). */ ! if (vp->v_flag & VROOT) { error = EINVAL; break; } if (walk != NULL) --- 2191,2202 ---- /* * We have just failed finding a matching export. * If we're at the root of this filesystem, then * it's time to stop (with failure). */ ! ASSERT3P(vp->v_vfsp->vfs_zone, ==, curzone); ! if ((vp->v_flag & VROOT) || VN_IS_CURZONEROOT(vp)) { error = EINVAL; break; } if (walk != NULL)