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);
}