Print this page
Caution with use after exi_rele()
Ooops exi_zoneid isn't a variable again yet
Be far more judicious in the use of curzone-using macros.

*** 164,177 **** 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); - exi->exi_zoneid = ne->ne_globals->nfs_zoneid; /* * Build up the template fhandle */ exi->exi_fh.fh_fsid = fsid; --- 164,178 ---- exi->exi_vp = vp; VN_HOLD(exi->exi_vp); exi->exi_visible = vis_head; exi->exi_count = 1; /* Caller will set exi_zone... */ + /* XXX KEBE SAYS Uncomment me or fix in the caller */ + /* exi->exi_zoneid = ne->ne_globals->nfs_zoneid; */ 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); /* * Build up the template fhandle */ exi->exi_fh.fh_fsid = fsid;
*** 658,667 **** --- 659,669 ---- fid.fid_len = MAXFIDSZ; error = vop_fid_pseudo(vp, &fid); if (error) break; + ASSERT3U(exip->exi_zoneid, ==, curzone->zone_id); /* * The root of the file system, or the zone's root for * in-zone NFS service needs special handling */ if (vp->v_flag & VROOT || VN_IS_CURZONEROOT(vp)) {
*** 694,703 **** --- 696,706 ---- * 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); + /* XXX KEBE SAYS NUKE ME */ new_exi->exi_zone = exip->exi_zone; vis_head = NULL; } if (VN_IS_CURZONEROOT(vp)) {
*** 878,887 **** --- 881,891 ---- mutex_enter(&nfs_exi_id_lock); avl_remove(&exi_id_tree, tnode->tree_exi); mutex_exit(&nfs_exi_id_lock); export_unlink(ne, tnode->tree_exi); exi_rele(tnode->tree_exi); + tnode->tree_exi = NULL; } /* Release visible in parent's exportinfo */ if (tnode->tree_vis != NULL) less_visible(vis2exi(tnode), tnode->tree_vis);
*** 905,914 **** --- 909,920 ---- /* * Traverse backward across mountpoint from the * root vnode of a filesystem to its mounted-on * vnode. + * + * Callers to this function have confirmed the use of curzone is safe here. */ vnode_t * untraverse(vnode_t *vp) { vnode_t *tvp, *nextvp;
*** 961,971 **** * where c is in the same filesystem as a. * So, get_root_export(*exportinfo_for_c) returns exportinfo_for_a * * If d is shared, then c will be put into a's visible list. * Note: visible list is per filesystem and is attached to the ! * VROOT exportinfo. */ struct exportinfo * get_root_export(struct exportinfo *exip) { treenode_t *tnode = exip->exi_tree; --- 967,977 ---- * where c is in the same filesystem as a. * So, get_root_export(*exportinfo_for_c) returns exportinfo_for_a * * If d is shared, then c will be put into a's visible list. * Note: visible list is per filesystem and is attached to the ! * VROOT exportinfo. Returned exi does NOT have a new hold. */ struct exportinfo * get_root_export(struct exportinfo *exip) { treenode_t *tnode = exip->exi_tree;