Print this page
Revert exi_zone to exi_zoneid, and install exi_ne backpointer
*** 471,489 ****
struct exportinfo *tree_exi;
struct exp_visible *tree_vis;
} treenode_t;
/*
* TREE_ROOT checks if the node corresponds to a filesystem root or
* the zone's root directory.
* TREE_EXPORTED checks if the node is explicitly shared
*/
#define TREE_ROOT(t) \
((t)->tree_exi != NULL && \
(((t)->tree_exi->exi_vp->v_flag & VROOT) || \
! VN_CMP((t)->tree_exi->exi_zone->zone_rootvp, (t)->tree_exi->exi_vp)))
#define TREE_EXPORTED(t) \
((t)->tree_exi && !PSEUDO((t)->tree_exi))
#define EXPTABLESIZE 256
--- 471,495 ----
struct exportinfo *tree_exi;
struct exp_visible *tree_vis;
} treenode_t;
/*
+ * Now that we have links to chase, we can get the zone rootvp just from
+ * an export. No current-zone-context needed.
+ */
+ #define EXI_TO_ZONEROOTVP(exi) ((exi)->exi_ne->exi_root->exi_vp)
+
+ /*
* TREE_ROOT checks if the node corresponds to a filesystem root or
* the zone's root directory.
* TREE_EXPORTED checks if the node is explicitly shared
*/
#define TREE_ROOT(t) \
((t)->tree_exi != NULL && \
(((t)->tree_exi->exi_vp->v_flag & VROOT) || \
! VN_CMP(EXI_TO_ZONEROOTVP((t)->tree_exi), (t)->tree_exi->exi_vp)))
#define TREE_EXPORTED(t) \
((t)->tree_exi && !PSEUDO((t)->tree_exi))
#define EXPTABLESIZE 256
*** 521,530 ****
--- 527,537 ----
struct treenode *exi_tree;
fhandle_t exi_fh;
krwlock_t exi_cache_lock;
kmutex_t exi_lock;
uint_t exi_count;
+ zoneid_t exi_zoneid;
vnode_t *exi_vp;
vnode_t *exi_dvp;
avl_tree_t *exi_cache[AUTH_TABLESIZE];
struct log_buffer *exi_logbuffer;
struct exp_visible *exi_visible;
*** 532,561 ****
unsigned exi_volatile_dev:1;
unsigned exi_moved:1;
int exi_id;
avl_node_t exi_id_link;
/*
! * Soft-reference/backpointer to the zone. The ZSD callbacks we have
! * invoke cleanup code that crosses into OTHER cleanup functions that
! * may assume same-zone context and attempt to find their own ZSD,
! * using "curzone" when in fact "curzone" is global when called from
! * NFS's ZSD cleanup (see lm_unexport->nlm_unexport for an example).
! *
! * During ZSD shutdown or destroy callbacks, the zone structure
! * does not have its mutex held, and it has just-enough references
! * to not free from underneath us. This field is not a proper
! * referenced-held zone pointer, and only ZSD callbacks should use
! * it.
*/
! struct zone *exi_zone;
#ifdef VOLATILE_FH_TEST
uint32_t exi_volatile_id;
struct ex_vol_rename *exi_vol_rename;
kmutex_t exi_vol_rename_lock;
#endif /* VOLATILE_FH_TEST -- keep last! */
};
- #define exi_zoneid exi_zone->zone_id
typedef struct exportinfo exportinfo_t;
typedef struct exportdata exportdata_t;
typedef struct secinfo secinfo_t;
--- 539,560 ----
unsigned exi_volatile_dev:1;
unsigned exi_moved:1;
int exi_id;
avl_node_t exi_id_link;
/*
! * Soft-reference/backpointer to zone's nfs_export_t.
! * This allows us access to the zone's rootvp (stored in
! * exi_ne->exi_root->exi_vp) even if the current thread isn't in
! * same-zone context.
*/
! struct nfs_export *exi_ne;
#ifdef VOLATILE_FH_TEST
uint32_t exi_volatile_id;
struct ex_vol_rename *exi_vol_rename;
kmutex_t exi_vol_rename_lock;
#endif /* VOLATILE_FH_TEST -- keep last! */
};
typedef struct exportinfo exportinfo_t;
typedef struct exportdata exportdata_t;
typedef struct secinfo secinfo_t;
*** 673,683 ****
* must be held when searching or modifiying the exportinfo list.
*/
krwlock_t exported_lock;
/* "public" and default (root) location for public filehandle */
! struct exportinfo *exi_public, *exi_root;
/* For checking default public file handle */
fid_t exi_rootfid;
/* For comparing V2 filehandles */
fhandle_t nullfh2;
--- 672,683 ----
* must be held when searching or modifiying the exportinfo list.
*/
krwlock_t exported_lock;
/* "public" and default (root) location for public filehandle */
! struct exportinfo *exi_public;
! struct exportinfo *exi_root;
/* For checking default public file handle */
fid_t exi_rootfid;
/* For comparing V2 filehandles */
fhandle_t nullfh2;