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.)
*** 97,108 ****
*/
static int sattr_to_vattr(struct nfssattr *, struct vattr *);
static void acl_perm(struct vnode *, struct exportinfo *, struct vattr *,
cred_t *);
- static void *rfs_zone_init(zoneid_t zoneid);
- static void rfs_zone_fini(zoneid_t zoneid, void *data);
/*
* Some "over the wire" UNIX file types. These are encoded
* into the mode. This needs to be fixed in the next rev.
--- 97,106 ----
*** 111,122 ****
#define IFCHR 0020000 /* character special */
#define IFBLK 0060000 /* block special */
#define IFSOCK 0140000 /* socket */
u_longlong_t nfs2_srv_caller_id;
- static zone_key_t rfs_zone_key;
/*
* Get file attributes.
* Returns the current attributes of the file with the given fhandle.
*/
/* ARGSUSED */
--- 109,128 ----
#define IFCHR 0020000 /* character special */
#define IFBLK 0060000 /* block special */
#define IFSOCK 0140000 /* socket */
u_longlong_t nfs2_srv_caller_id;
+ static nfs_srv_t *
+ nfs_get_srv(void)
+ {
+ nfs_globals_t *ng = zone_getspecific(nfssrv_zone_key, curzone);
+ nfs_srv_t *srv = ng->nfs_srv;
+ ASSERT(srv != NULL);
+ return (srv);
+ }
+
/*
* Get file attributes.
* Returns the current attributes of the file with the given fhandle.
*/
/* ARGSUSED */
*** 1313,1324 ****
cred_t *savecred;
int in_crit = 0;
caller_context_t ct;
nfs_srv_t *nsrv;
! ASSERT3P(curzone, ==, ((exi == NULL) ? curzone : exi->exi_zone));
! nsrv = zone_getspecific(rfs_zone_key, curzone);
if (!nsrv->write_async) {
rfs_write_sync(wa, ns, exi, req, cr, ro);
return;
}
--- 1319,1330 ----
cred_t *savecred;
int in_crit = 0;
caller_context_t ct;
nfs_srv_t *nsrv;
! ASSERT(exi == NULL || exi->exi_zoneid == curzone->zone_id);
! nsrv = nfs_get_srv();
if (!nsrv->write_async) {
rfs_write_sync(wa, ns, exi, req, cr, ro);
return;
}
*** 3101,3139 ****
void
rfs_srvrinit(void)
{
nfs2_srv_caller_id = fs_new_caller_id();
- zone_key_create(&rfs_zone_key, rfs_zone_init, NULL, rfs_zone_fini);
}
void
rfs_srvrfini(void)
{
}
/* ARGSUSED */
! static void *
! rfs_zone_init(zoneid_t zoneid)
{
nfs_srv_t *ns;
ns = kmem_zalloc(sizeof (*ns), KM_SLEEP);
mutex_init(&ns->async_write_lock, NULL, MUTEX_DEFAULT, NULL);
ns->write_async = 1;
! return (ns);
}
/* ARGSUSED */
! static void
! rfs_zone_fini(zoneid_t zoneid, void *data)
{
! nfs_srv_t *ns;
! ns = (nfs_srv_t *)data;
mutex_destroy(&ns->async_write_lock);
kmem_free(ns, sizeof (*ns));
}
static int
--- 3107,3145 ----
void
rfs_srvrinit(void)
{
nfs2_srv_caller_id = fs_new_caller_id();
}
void
rfs_srvrfini(void)
{
}
/* ARGSUSED */
! void
! rfs_srv_zone_init(nfs_globals_t *ng)
{
nfs_srv_t *ns;
ns = kmem_zalloc(sizeof (*ns), KM_SLEEP);
mutex_init(&ns->async_write_lock, NULL, MUTEX_DEFAULT, NULL);
ns->write_async = 1;
! ng->nfs_srv = ns;
}
/* ARGSUSED */
! void
! rfs_srv_zone_fini(nfs_globals_t *ng)
{
! nfs_srv_t *ns = ng->nfs_srv;
! ng->nfs_srv = NULL;
!
mutex_destroy(&ns->async_write_lock);
kmem_free(ns, sizeof (*ns));
}
static int