Print this page
Fix NFS design problems re. multiple zone keys
Make NFS server zone-specific data all have the same lifetime
Fix rfs4_clean_state_exi
Fix exi_cache_reclaim
Fix mistakes in zone keys work
More fixes re. exi_zoneid and exi_tree
(danmcd -> Keep some ASSERT()s around for readability.)
*** 89,100 ****
static int rdma_setup_read_data3(READ3args *, READ3resok *);
extern int nfs_loaned_buffers;
u_longlong_t nfs3_srv_caller_id;
- static zone_key_t rfs3_zone_key;
/* ARGSUSED */
void
rfs3_getattr(GETATTR3args *args, GETATTR3res *resp, struct exportinfo *exi,
struct svc_req *req, cred_t *cr, bool_t ro)
{
--- 89,108 ----
static int rdma_setup_read_data3(READ3args *, READ3resok *);
extern int nfs_loaned_buffers;
u_longlong_t nfs3_srv_caller_id;
+ static nfs3_srv_t *
+ nfs3_get_srv(void)
+ {
+ nfs_globals_t *ng = zone_getspecific(nfssrv_zone_key, curzone);
+ nfs3_srv_t *srv = ng->nfs3_srv;
+ ASSERT(srv != NULL);
+ return (srv);
+ }
+
/* ARGSUSED */
void
rfs3_getattr(GETATTR3args *args, GETATTR3res *resp, struct exportinfo *exi,
struct svc_req *req, cred_t *cr, bool_t ro)
{
*** 1325,1335 ****
error = ESTALE;
goto err;
}
ASSERT3P(curzone, ==, exi->exi_zone); /* exi is guaranteed non-NULL. */
! ns = zone_getspecific(rfs3_zone_key, curzone);
if (is_system_labeled()) {
bslabel_t *clabel = req->rq_label;
ASSERT(clabel != NULL);
DTRACE_PROBE2(tx__rfs3__log__info__opwrite__clabel, char *,
--- 1333,1344 ----
error = ESTALE;
goto err;
}
ASSERT3P(curzone, ==, exi->exi_zone); /* exi is guaranteed non-NULL. */
! ns = nfs3_get_srv();
!
if (is_system_labeled()) {
bslabel_t *clabel = req->rq_label;
ASSERT(clabel != NULL);
DTRACE_PROBE2(tx__rfs3__log__info__opwrite__clabel, char *,
*** 4126,4136 ****
error = ESTALE;
goto out;
}
ASSERT3P(curzone, ==, exi->exi_zone); /* exi is guaranteed non-NULL. */
! ns = zone_getspecific(rfs3_zone_key, curzone);
bva.va_mask = AT_ALL;
error = VOP_GETATTR(vp, &bva, 0, cr, NULL);
/*
* If we can't get the attributes, then we can't do the
--- 4135,4145 ----
error = ESTALE;
goto out;
}
ASSERT3P(curzone, ==, exi->exi_zone); /* exi is guaranteed non-NULL. */
! ns = nfs3_get_srv();
bva.va_mask = AT_ALL;
error = VOP_GETATTR(vp, &bva, 0, cr, NULL);
/*
* If we can't get the attributes, then we can't do the
*** 4379,4391 ****
rok->wlist_len = wlist_len;
rok->wlist = wcl;
return (TRUE);
}
! /* ARGSUSED */
! static void *
! rfs3_zone_init(zoneid_t zoneid)
{
nfs3_srv_t *ns;
struct rfs3_verf_overlay {
uint_t id; /* a "unique" identifier */
int ts; /* a unique timestamp */
--- 4388,4399 ----
rok->wlist_len = wlist_len;
rok->wlist = wcl;
return (TRUE);
}
! void
! rfs3_srv_zone_init(nfs_globals_t *ng)
{
nfs3_srv_t *ns;
struct rfs3_verf_overlay {
uint_t id; /* a "unique" identifier */
int ts; /* a unique timestamp */
*** 4426,4452 ****
verfp->id = zone_get_hostid(NULL);
if (verfp->id == 0)
verfp->id = (uint_t)now.tv_nsec;
! return (ns);
}
! /* ARGSUSED */
! static void
! rfs3_zone_fini(zoneid_t zoneid, void *data)
{
! nfs3_srv_t *ns = data;
kmem_free(ns, sizeof (*ns));
}
void
rfs3_srvrinit(void)
{
nfs3_srv_caller_id = fs_new_caller_id();
- zone_key_create(&rfs3_zone_key, rfs3_zone_init, NULL, rfs3_zone_fini);
}
void
rfs3_srvrfini(void)
{
--- 4434,4460 ----
verfp->id = zone_get_hostid(NULL);
if (verfp->id == 0)
verfp->id = (uint_t)now.tv_nsec;
! ng->nfs3_srv = ns;
}
! void
! rfs3_srv_zone_fini(nfs_globals_t *ng)
{
! nfs3_srv_t *ns = ng->nfs3_srv;
+ ng->nfs3_srv = NULL;
+
kmem_free(ns, sizeof (*ns));
}
void
rfs3_srvrinit(void)
{
nfs3_srv_caller_id = fs_new_caller_id();
}
void
rfs3_srvrfini(void)
{