Print this page
curzone reality check and teardown changes to use the RIGHT zone

*** 144,155 **** * struct (real or pseudo) can have a visible list as long as * a) its export root is VROOT, or is the zone's root for in-zone NFS service * b) a descendant of the export root is shared */ struct exportinfo * ! pseudo_exportfs(nfs_export_t *ne, vnode_t *vp, fid_t *fid, struct exp_visible *vis_head, ! struct exportdata *exdata) { struct exportinfo *exi; struct exportdata *kex; fsid_t fsid; int vpathlen; --- 144,155 ---- * struct (real or pseudo) can have a visible list as long as * a) its export root is VROOT, or is the zone's root for in-zone NFS service * b) a descendant of the export root is shared */ struct exportinfo * ! pseudo_exportfs(nfs_export_t *ne, vnode_t *vp, fid_t *fid, ! struct exp_visible *vis_head, struct exportdata *exdata) { struct exportinfo *exi; struct exportdata *kex; fsid_t fsid; int vpathlen;
*** 163,172 **** --- 163,173 ---- exi->exi_fid = *fid; exi->exi_vp = vp; VN_HOLD(exi->exi_vp); exi->exi_visible = vis_head; exi->exi_count = 1; + /* Caller will set exi_zone... */ 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); /*
*** 640,649 **** --- 641,651 ---- treenode_t *tree_head = NULL; timespec_t now; nfs_export_t *ne = nfs_get_export(); ASSERT(RW_WRITE_HELD(&ne->exported_lock)); + ASSERT3P(curzone, ==, exip->exi_zone); gethrestime(&now); vp = exip->exi_vp; VN_HOLD(vp);
*** 691,700 **** --- 693,703 ---- * this as a pseudo export so that an NFS v4 * client can do lookups in it. */ new_exi = pseudo_exportfs(ne, vp, &fid, vis_head, NULL); + new_exi->exi_zone = exip->exi_zone; vis_head = NULL; } if (VN_IS_CURZONEROOT(vp)) { /* at system root */
*** 833,842 **** --- 836,846 ---- { treenode_t *tnode, *old_nd; treenode_t *connect_point = NULL; ASSERT(RW_WRITE_HELD(&ne->exported_lock)); + ASSERT(curzone == exip->exi_zone || curzone == global_zone); tnode = exip->exi_tree; /* * The unshared exportinfo was unlinked in unexport(). * Zeroing tree_exi ensures that we will skip it.
*** 981,990 **** --- 985,995 ---- /* * An exported root vnode has a sub-dir shared if it has a visible * list. i.e. if it does not have a visible list, then there is no * node in this filesystem leads to any other shared node. */ + ASSERT3P(curzone, ==, exi->exi_zone); if (vp_is_exported && ((vp->v_flag & VROOT) || VN_IS_CURZONEROOT(vp))) { return (exi->exi_visible ? 1 : 0); }