Print this page
11083 support NFS server in zone
Portions contributed by: Dan Kruchinin <dan.kruchinin@nexenta.com>
Portions contributed by: Stepan Zastupov <stepan.zastupov@gmail.com>
Portions contributed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
Portions contributed by: Mike Zeller <mike@mikezeller.net>
Portions contributed by: Dan McDonald <danmcd@joyent.com>
Portions contributed by: Gordon Ross <gordon.w.ross@gmail.com>
Portions contributed by: Vitaliy Gusev <gusev.vitaliy@gmail.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Jason King <jbk@joyent.com>
Reviewed by: C Fraire <cfraire@me.com>
Change-Id: I22f289d357503f9b48a0bc2482cc4328a6d43d16

*** 18,35 **** * * CDDL HEADER END */ /* ! * Copyright 2015 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013 by Delphix. All rights reserved. */ /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ #include <sys/param.h> #include <sys/types.h> #include <sys/systm.h> #include <sys/cred.h> #include <sys/buf.h> --- 18,36 ---- * * CDDL HEADER END */ /* ! * Copyright 2018 Nexenta Systems, Inc. * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013 by Delphix. All rights reserved. */ /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ /* All Rights Reserved */ + #include <sys/param.h> #include <sys/types.h> #include <sys/systm.h> #include <sys/cred.h> #include <sys/buf.h>
*** 66,82 **** #include <inet/ip.h> #include <inet/ip6.h> /* * These are the interface routines for the server side of the * Network File System. See the NFS version 3 protocol specification * for a description of this interface. */ - static writeverf3 write3verf; - static int sattr3_to_vattr(sattr3 *, struct vattr *); static int vattr_to_fattr3(struct vattr *, fattr3 *); static int vattr_to_wcc_attr(struct vattr *, wcc_attr *); static void vattr_to_pre_op_attr(struct vattr *, pre_op_attr *); static void vattr_to_wcc_data(struct vattr *, struct vattr *, wcc_data *); --- 67,88 ---- #include <inet/ip.h> #include <inet/ip6.h> /* + * Zone global variables of NFSv3 server + */ + typedef struct nfs3_srv { + writeverf3 write3verf; + } nfs3_srv_t; + + /* * These are the interface routines for the server side of the * Network File System. See the NFS version 3 protocol specification * for a description of this interface. */ static int sattr3_to_vattr(sattr3 *, struct vattr *); static int vattr_to_fattr3(struct vattr *, fattr3 *); static int vattr_to_wcc_attr(struct vattr *, wcc_attr *); static void vattr_to_pre_op_attr(struct vattr *, pre_op_attr *); static void vattr_to_wcc_data(struct vattr *, struct vattr *, wcc_data *);
*** 84,93 **** --- 90,108 ---- extern int nfs_loaned_buffers; u_longlong_t nfs3_srv_caller_id; + static nfs3_srv_t * + nfs3_get_srv(void) + { + nfs_globals_t *ng = nfs_srv_getzg(); + 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) {
*** 95,106 **** vnode_t *vp; struct vattr va; vp = nfs3_fhtovp(&args->object, exi); ! DTRACE_NFSV3_4(op__getattr__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, GETATTR3args *, args); if (vp == NULL) { error = ESTALE; goto out; } --- 110,122 ---- vnode_t *vp; struct vattr va; vp = nfs3_fhtovp(&args->object, exi); ! DTRACE_NFSV3_5(op__getattr__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! GETATTR3args *, args); if (vp == NULL) { error = ESTALE; goto out; }
*** 117,128 **** error = vattr_to_fattr3(&va, &resp->resok.obj_attributes); if (error) goto out; resp->status = NFS3_OK; ! DTRACE_NFSV3_4(op__getattr__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, GETATTR3res *, resp); VN_RELE(vp); return; } --- 133,145 ---- error = vattr_to_fattr3(&va, &resp->resok.obj_attributes); if (error) goto out; resp->status = NFS3_OK; ! DTRACE_NFSV3_5(op__getattr__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! GETATTR3res *, resp); VN_RELE(vp); return; }
*** 132,143 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); ! DTRACE_NFSV3_4(op__getattr__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, GETATTR3res *, resp); if (vp != NULL) VN_RELE(vp); } --- 149,161 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); ! DTRACE_NFSV3_5(op__getattr__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! GETATTR3res *, resp); if (vp != NULL) VN_RELE(vp); }
*** 166,177 **** bvap = NULL; avap = NULL; vp = nfs3_fhtovp(&args->object, exi); ! DTRACE_NFSV3_4(op__setattr__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, SETATTR3args *, args); if (vp == NULL) { error = ESTALE; goto out; } --- 184,196 ---- bvap = NULL; avap = NULL; vp = nfs3_fhtovp(&args->object, exi); ! DTRACE_NFSV3_5(op__setattr__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! SETATTR3args *, args); if (vp == NULL) { error = ESTALE; goto out; }
*** 328,339 **** nbl_end_crit(vp); resp->status = NFS3_OK; vattr_to_wcc_data(bvap, avap, &resp->resok.obj_wcc); ! DTRACE_NFSV3_4(op__setattr__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, SETATTR3res *, resp); VN_RELE(vp); return; --- 347,359 ---- nbl_end_crit(vp); resp->status = NFS3_OK; vattr_to_wcc_data(bvap, avap, &resp->resok.obj_wcc); ! DTRACE_NFSV3_5(op__setattr__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! SETATTR3res *, resp); VN_RELE(vp); return;
*** 342,353 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_4(op__setattr__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, SETATTR3res *, resp); if (vp != NULL) { if (in_crit) nbl_end_crit(vp); VN_RELE(vp); --- 362,374 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_5(op__setattr__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! SETATTR3res *, resp); if (vp != NULL) { if (in_crit) nbl_end_crit(vp); VN_RELE(vp);
*** 388,407 **** /* * Allow lookups from the root - the default * location of the public filehandle. */ if (exi != NULL && (exi->exi_export.ex_flags & EX_PUBLIC)) { ! dvp = rootdir; VN_HOLD(dvp); ! DTRACE_NFSV3_4(op__lookup__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, LOOKUP3args *, args); } else { dvp = nfs3_fhtovp(&args->what.dir, exi); ! DTRACE_NFSV3_4(op__lookup__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, LOOKUP3args *, args); if (dvp == NULL) { error = ESTALE; goto out; } --- 409,431 ---- /* * Allow lookups from the root - the default * location of the public filehandle. */ if (exi != NULL && (exi->exi_export.ex_flags & EX_PUBLIC)) { ! ASSERT3U(exi->exi_zoneid, ==, curzone->zone_id); ! dvp = ZONE_ROOTVP(); VN_HOLD(dvp); ! DTRACE_NFSV3_5(op__lookup__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! LOOKUP3args *, args); } else { dvp = nfs3_fhtovp(&args->what.dir, exi); ! DTRACE_NFSV3_5(op__lookup__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! LOOKUP3args *, args); if (dvp == NULL) { error = ESTALE; goto out; }
*** 419,432 **** resp->status = NFS3ERR_ACCES; goto out1; } fhp = &args->what.dir; if (strcmp(args->what.name, "..") == 0 && EQFID(&exi->exi_fid, FH3TOFIDP(fhp))) { if ((exi->exi_export.ex_flags & EX_NOHIDE) && ! (dvp->v_flag & VROOT)) { /* * special case for ".." and 'nohide'exported root */ if (rfs_climb_crossmnt(&dvp, &exi, cr) != 0) { resp->status = NFS3ERR_ACCES; --- 443,457 ---- resp->status = NFS3ERR_ACCES; goto out1; } fhp = &args->what.dir; + ASSERT3U(curzone->zone_id, ==, exi->exi_zoneid); /* exi is non-NULL */ if (strcmp(args->what.name, "..") == 0 && EQFID(&exi->exi_fid, FH3TOFIDP(fhp))) { if ((exi->exi_export.ex_flags & EX_NOHIDE) && ! ((dvp->v_flag & VROOT) || VN_IS_CURZONEROOT(dvp))) { /* * special case for ".." and 'nohide'exported root */ if (rfs_climb_crossmnt(&dvp, &exi, cr) != 0) { resp->status = NFS3ERR_ACCES;
*** 453,462 **** --- 478,488 ---- */ if (PUBLIC_FH3(&args->what.dir)) { publicfh_flag = TRUE; exi_rele(exi); + exi = NULL; error = rfs_publicfh_mclookup(name, dvp, cr, &vp, &exi, &sec); /*
*** 536,546 **** } va.va_mask = AT_ALL; vap = rfs4_delegated_getattr(vp, &va, 0, cr) ? NULL : &va; - exi_rele(exi); VN_RELE(vp); resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); vattr_to_post_op_attr(dvap, &resp->resok.dir_attributes); --- 562,571 ----
*** 551,563 **** * Then set RPC status to AUTH_TOOWEAK in common_dispatch. */ if (auth_weak) resp->status = (enum nfsstat3)WNFSERR_CLNT_FLAVOR; ! DTRACE_NFSV3_4(op__lookup__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, LOOKUP3res *, resp); VN_RELE(dvp); return; out: if (curthread->t_flag & T_WOULDBLOCK) { --- 576,590 ---- * Then set RPC status to AUTH_TOOWEAK in common_dispatch. */ if (auth_weak) resp->status = (enum nfsstat3)WNFSERR_CLNT_FLAVOR; ! DTRACE_NFSV3_5(op__lookup__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! LOOKUP3res *, resp); VN_RELE(dvp); + exi_rele(exi); return; out: if (curthread->t_flag & T_WOULDBLOCK) {
*** 564,579 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: if (exi != NULL) exi_rele(exi); - DTRACE_NFSV3_4(op__lookup__done, struct svc_req *, req, - cred_t *, cr, vnode_t *, dvp, LOOKUP3res *, resp); - if (dvp != NULL) VN_RELE(dvp); vattr_to_post_op_attr(dvap, &resp->resfail.dir_attributes); } --- 591,607 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: + DTRACE_NFSV3_5(op__lookup__done, struct svc_req *, req, + cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, + LOOKUP3res *, resp); + if (exi != NULL) exi_rele(exi); if (dvp != NULL) VN_RELE(dvp); vattr_to_post_op_attr(dvap, &resp->resfail.dir_attributes); }
*** 601,612 **** vap = NULL; vp = nfs3_fhtovp(&args->object, exi); ! DTRACE_NFSV3_4(op__access__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, ACCESS3args *, args); if (vp == NULL) { error = ESTALE; goto out; } --- 629,641 ---- vap = NULL; vp = nfs3_fhtovp(&args->object, exi); ! DTRACE_NFSV3_5(op__access__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! ACCESS3args *, args); if (vp == NULL) { error = ESTALE; goto out; }
*** 712,723 **** vap = rfs4_delegated_getattr(vp, &va, 0, cr) ? NULL : &va; resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); ! DTRACE_NFSV3_4(op__access__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, ACCESS3res *, resp); VN_RELE(vp); return; --- 741,753 ---- vap = rfs4_delegated_getattr(vp, &va, 0, cr) ? NULL : &va; resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); ! DTRACE_NFSV3_5(op__access__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! ACCESS3res *, resp); VN_RELE(vp); return;
*** 725,736 **** if (curthread->t_flag & T_WOULDBLOCK) { curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); ! DTRACE_NFSV3_4(op__access__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, ACCESS3res *, resp); if (vp != NULL) VN_RELE(vp); vattr_to_post_op_attr(vap, &resp->resfail.obj_attributes); } --- 755,767 ---- if (curthread->t_flag & T_WOULDBLOCK) { curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); ! DTRACE_NFSV3_5(op__access__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! ACCESS3res *, resp); if (vp != NULL) VN_RELE(vp); vattr_to_post_op_attr(vap, &resp->resfail.obj_attributes); }
*** 759,770 **** vap = NULL; vp = nfs3_fhtovp(&args->symlink, exi); ! DTRACE_NFSV3_4(op__readlink__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READLINK3args *, args); if (vp == NULL) { error = ESTALE; goto out; } --- 790,802 ---- vap = NULL; vp = nfs3_fhtovp(&args->symlink, exi); ! DTRACE_NFSV3_5(op__readlink__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! READLINK3args *, args); if (vp == NULL) { error = ESTALE; goto out; }
*** 809,822 **** data = kmem_alloc(MAXPATHLEN + 1, KM_SLEEP); if (is_referral) { char *s; size_t strsz; /* Get an artificial symlink based on a referral */ s = build_symlink(vp, cr, &strsz); ! global_svstat_ptr[3][NFS_REFERLINKS].value.ui64++; DTRACE_PROBE2(nfs3serv__func__referral__reflink, vnode_t *, vp, char *, s); if (s == NULL) error = EINVAL; else { --- 841,855 ---- data = kmem_alloc(MAXPATHLEN + 1, KM_SLEEP); if (is_referral) { char *s; size_t strsz; + kstat_named_t *stat = exi->exi_ne->ne_globals->svstat[NFS_V3]; /* Get an artificial symlink based on a referral */ s = build_symlink(vp, cr, &strsz); ! stat[NFS_REFERLINKS].value.ui64++; DTRACE_PROBE2(nfs3serv__func__referral__reflink, vnode_t *, vp, char *, s); if (s == NULL) error = EINVAL; else {
*** 880,891 **** resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.symlink_attributes); resp->resok.data = name; ! DTRACE_NFSV3_4(op__readlink__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READLINK3res *, resp); VN_RELE(vp); if (name != data) kmem_free(data, MAXPATHLEN + 1); --- 913,925 ---- resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.symlink_attributes); resp->resok.data = name; ! DTRACE_NFSV3_5(op__readlink__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! READLINK3res *, resp); VN_RELE(vp); if (name != data) kmem_free(data, MAXPATHLEN + 1);
*** 896,907 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_4(op__readlink__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READLINK3res *, resp); if (vp != NULL) VN_RELE(vp); vattr_to_post_op_attr(vap, &resp->resfail.symlink_attributes); } --- 930,942 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_5(op__readlink__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! READLINK3res *, resp); if (vp != NULL) VN_RELE(vp); vattr_to_post_op_attr(vap, &resp->resfail.symlink_attributes); }
*** 947,959 **** vap = NULL; vp = nfs3_fhtovp(&args->file, exi); ! DTRACE_NFSV3_4(op__read__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READ3args *, args); if (vp == NULL) { error = ESTALE; goto out; } --- 982,996 ---- vap = NULL; vp = nfs3_fhtovp(&args->file, exi); ! DTRACE_NFSV3_5(op__read__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! READ3args *, args); + if (vp == NULL) { error = ESTALE; goto out; }
*** 1203,1214 **** resp->resok.data.data_val = (caddr_t)mp->b_datap->db_base; (resp->resok).wlist = NULL; } done: ! DTRACE_NFSV3_4(op__read__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READ3res *, resp); VN_RELE(vp); if (iovp != NULL) kmem_free(iovp, iovcnt * sizeof (struct iovec)); --- 1240,1252 ---- resp->resok.data.data_val = (caddr_t)mp->b_datap->db_base; (resp->resok).wlist = NULL; } done: ! DTRACE_NFSV3_5(op__read__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! READ3res *, resp); VN_RELE(vp); if (iovp != NULL) kmem_free(iovp, iovcnt * sizeof (struct iovec));
*** 1220,1231 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_4(op__read__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READ3res *, resp); if (vp != NULL) { if (need_rwunlock) VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, &ct); if (in_crit) --- 1258,1270 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_5(op__read__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! READ3res *, resp); if (vp != NULL) { if (need_rwunlock) VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, &ct); if (in_crit)
*** 1266,1275 **** --- 1305,1315 ---- void rfs3_write(WRITE3args *args, WRITE3res *resp, struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { + nfs3_srv_t *ns; int error; vnode_t *vp; struct vattr *bvap = NULL; struct vattr bva; struct vattr *avap = NULL;
*** 1286,1303 **** int rwlock_ret = -1; caller_context_t ct; vp = nfs3_fhtovp(&args->file, exi); ! DTRACE_NFSV3_4(op__write__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, WRITE3args *, args); if (vp == NULL) { error = ESTALE; goto err; } if (is_system_labeled()) { bslabel_t *clabel = req->rq_label; ASSERT(clabel != NULL); DTRACE_PROBE2(tx__rfs3__log__info__opwrite__clabel, char *, --- 1326,1347 ---- int rwlock_ret = -1; caller_context_t ct; vp = nfs3_fhtovp(&args->file, exi); ! DTRACE_NFSV3_5(op__write__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! WRITE3args *, args); if (vp == NULL) { error = ESTALE; goto err; } + ASSERT3U(curzone->zone_id, ==, exi->exi_zoneid); /* exi is 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 *,
*** 1381,1391 **** if (args->count == 0) { resp->status = NFS3_OK; vattr_to_wcc_data(bvap, avap, &resp->resok.file_wcc); resp->resok.count = 0; resp->resok.committed = args->stable; ! resp->resok.verf = write3verf; goto out; } if (args->mblk != NULL) { iovcnt = 0; --- 1425,1435 ---- if (args->count == 0) { resp->status = NFS3_OK; vattr_to_wcc_data(bvap, avap, &resp->resok.file_wcc); resp->resok.count = 0; resp->resok.committed = args->stable; ! resp->resok.verf = ns->write3verf; goto out; } if (args->mblk != NULL) { iovcnt = 0;
*** 1483,1493 **** resp->status = NFS3_OK; vattr_to_wcc_data(bvap, avap, &resp->resok.file_wcc); resp->resok.count = args->count - uio.uio_resid; resp->resok.committed = args->stable; ! resp->resok.verf = write3verf; goto out; err: if (curthread->t_flag & T_WOULDBLOCK) { curthread->t_flag &= ~T_WOULDBLOCK; --- 1527,1537 ---- resp->status = NFS3_OK; vattr_to_wcc_data(bvap, avap, &resp->resok.file_wcc); resp->resok.count = args->count - uio.uio_resid; resp->resok.committed = args->stable; ! resp->resok.verf = ns->write3verf; goto out; err: if (curthread->t_flag & T_WOULDBLOCK) { curthread->t_flag &= ~T_WOULDBLOCK;
*** 1495,1506 **** } else resp->status = puterrno3(error); err1: vattr_to_wcc_data(bvap, avap, &resp->resfail.file_wcc); out: ! DTRACE_NFSV3_4(op__write__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, WRITE3res *, resp); if (vp != NULL) { if (rwlock_ret != -1) VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, &ct); if (in_crit) --- 1539,1551 ---- } else resp->status = puterrno3(error); err1: vattr_to_wcc_data(bvap, avap, &resp->resfail.file_wcc); out: ! DTRACE_NFSV3_5(op__write__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! WRITE3res *, resp); if (vp != NULL) { if (rwlock_ret != -1) VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, &ct); if (in_crit)
*** 1541,1552 **** dbvap = NULL; davap = NULL; dvp = nfs3_fhtovp(&args->where.dir, exi); ! DTRACE_NFSV3_4(op__create__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, CREATE3args *, args); if (dvp == NULL) { error = ESTALE; goto out; } --- 1586,1598 ---- dbvap = NULL; davap = NULL; dvp = nfs3_fhtovp(&args->where.dir, exi); ! DTRACE_NFSV3_5(op__create__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! CREATE3args *, args); if (dvp == NULL) { error = ESTALE; goto out; }
*** 1841,1852 **** resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); vattr_to_wcc_data(dbvap, davap, &resp->resok.dir_wcc); ! DTRACE_NFSV3_4(op__create__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, CREATE3res *, resp); VN_RELE(dvp); return; out: --- 1887,1899 ---- resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); vattr_to_wcc_data(dbvap, davap, &resp->resok.dir_wcc); ! DTRACE_NFSV3_5(op__create__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! CREATE3res *, resp); VN_RELE(dvp); return; out:
*** 1854,1865 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_4(op__create__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, CREATE3res *, resp); if (name != NULL && name != args->where.name) kmem_free(name, MAXPATHLEN + 1); if (tvp != NULL) { --- 1901,1913 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_5(op__create__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! CREATE3res *, resp); if (name != NULL && name != args->where.name) kmem_free(name, MAXPATHLEN + 1); if (tvp != NULL) {
*** 1898,1909 **** dbvap = NULL; davap = NULL; dvp = nfs3_fhtovp(&args->where.dir, exi); ! DTRACE_NFSV3_4(op__mkdir__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, MKDIR3args *, args); if (dvp == NULL) { error = ESTALE; goto out; } --- 1946,1958 ---- dbvap = NULL; davap = NULL; dvp = nfs3_fhtovp(&args->where.dir, exi); ! DTRACE_NFSV3_5(op__mkdir__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! MKDIR3args *, args); if (dvp == NULL) { error = ESTALE; goto out; }
*** 1998,2009 **** resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); vattr_to_wcc_data(dbvap, davap, &resp->resok.dir_wcc); ! DTRACE_NFSV3_4(op__mkdir__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, MKDIR3res *, resp); VN_RELE(dvp); return; out: --- 2047,2059 ---- resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); vattr_to_wcc_data(dbvap, davap, &resp->resok.dir_wcc); ! DTRACE_NFSV3_5(op__mkdir__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! MKDIR3res *, resp); VN_RELE(dvp); return; out:
*** 2011,2022 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_4(op__mkdir__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, MKDIR3res *, resp); if (dvp != NULL) VN_RELE(dvp); vattr_to_wcc_data(dbvap, davap, &resp->resfail.dir_wcc); } --- 2061,2073 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_5(op__mkdir__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! MKDIR3res *, resp); if (dvp != NULL) VN_RELE(dvp); vattr_to_wcc_data(dbvap, davap, &resp->resfail.dir_wcc); }
*** 2047,2058 **** dbvap = NULL; davap = NULL; dvp = nfs3_fhtovp(&args->where.dir, exi); ! DTRACE_NFSV3_4(op__symlink__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, SYMLINK3args *, args); if (dvp == NULL) { error = ESTALE; goto err; } --- 2098,2110 ---- dbvap = NULL; davap = NULL; dvp = nfs3_fhtovp(&args->where.dir, exi); ! DTRACE_NFSV3_5(op__symlink__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! SYMLINK3args *, args); if (dvp == NULL) { error = ESTALE; goto err; }
*** 2185,2196 **** if (name != NULL && name != args->where.name) kmem_free(name, MAXPATHLEN + 1); if (symdata != NULL && symdata != args->symlink.symlink_data) kmem_free(symdata, MAXPATHLEN + 1); ! DTRACE_NFSV3_4(op__symlink__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, SYMLINK3res *, resp); if (dvp != NULL) VN_RELE(dvp); } --- 2237,2249 ---- if (name != NULL && name != args->where.name) kmem_free(name, MAXPATHLEN + 1); if (symdata != NULL && symdata != args->symlink.symlink_data) kmem_free(symdata, MAXPATHLEN + 1); ! DTRACE_NFSV3_5(op__symlink__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! SYMLINK3res *, resp); if (dvp != NULL) VN_RELE(dvp); }
*** 2223,2234 **** dbvap = NULL; davap = NULL; dvp = nfs3_fhtovp(&args->where.dir, exi); ! DTRACE_NFSV3_4(op__mknod__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, MKNOD3args *, args); if (dvp == NULL) { error = ESTALE; goto out; } --- 2276,2288 ---- dbvap = NULL; davap = NULL; dvp = nfs3_fhtovp(&args->where.dir, exi); ! DTRACE_NFSV3_5(op__mknod__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! MKNOD3args *, args); if (dvp == NULL) { error = ESTALE; goto out; }
*** 2370,2381 **** VN_RELE(vp); vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); vattr_to_wcc_data(dbvap, davap, &resp->resok.dir_wcc); ! DTRACE_NFSV3_4(op__mknod__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, MKNOD3res *, resp); VN_RELE(dvp); return; out: if (curthread->t_flag & T_WOULDBLOCK) { --- 2424,2436 ---- VN_RELE(vp); vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); vattr_to_wcc_data(dbvap, davap, &resp->resok.dir_wcc); ! DTRACE_NFSV3_5(op__mknod__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! MKNOD3res *, resp); VN_RELE(dvp); return; out: if (curthread->t_flag & T_WOULDBLOCK) {
*** 2382,2393 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_4(op__mknod__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, MKNOD3res *, resp); if (dvp != NULL) VN_RELE(dvp); vattr_to_wcc_data(dbvap, davap, &resp->resfail.dir_wcc); } --- 2437,2449 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_5(op__mknod__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi, ! MKNOD3res *, resp); if (dvp != NULL) VN_RELE(dvp); vattr_to_wcc_data(dbvap, davap, &resp->resfail.dir_wcc); }
*** 2415,2426 **** bvap = NULL; avap = NULL; vp = nfs3_fhtovp(&args->object.dir, exi); ! DTRACE_NFSV3_4(op__remove__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, REMOVE3args *, args); if (vp == NULL) { error = ESTALE; goto err; } --- 2471,2483 ---- bvap = NULL; avap = NULL; vp = nfs3_fhtovp(&args->object.dir, exi); ! DTRACE_NFSV3_5(op__remove__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! REMOVE3args *, args); if (vp == NULL) { error = ESTALE; goto err; }
*** 2524,2535 **** } else resp->status = puterrno3(error); err1: vattr_to_wcc_data(bvap, avap, &resp->resfail.dir_wcc); out: ! DTRACE_NFSV3_4(op__remove__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, REMOVE3res *, resp); if (name != NULL && name != args->object.name) kmem_free(name, MAXPATHLEN + 1); if (vp != NULL) --- 2581,2593 ---- } else resp->status = puterrno3(error); err1: vattr_to_wcc_data(bvap, avap, &resp->resfail.dir_wcc); out: ! DTRACE_NFSV3_5(op__remove__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! REMOVE3res *, resp); if (name != NULL && name != args->object.name) kmem_free(name, MAXPATHLEN + 1); if (vp != NULL)
*** 2559,2570 **** bvap = NULL; avap = NULL; vp = nfs3_fhtovp(&args->object.dir, exi); ! DTRACE_NFSV3_4(op__rmdir__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, RMDIR3args *, args); if (vp == NULL) { error = ESTALE; goto err; } --- 2617,2629 ---- bvap = NULL; avap = NULL; vp = nfs3_fhtovp(&args->object.dir, exi); ! DTRACE_NFSV3_5(op__rmdir__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! RMDIR3args *, args); if (vp == NULL) { error = ESTALE; goto err; }
*** 2616,2626 **** if (name == NULL) { resp->status = NFS3ERR_INVAL; goto err1; } ! error = VOP_RMDIR(vp, name, rootdir, cr, NULL, 0); if (name != args->object.name) kmem_free(name, MAXPATHLEN + 1); ava.va_mask = AT_ALL; --- 2675,2686 ---- if (name == NULL) { resp->status = NFS3ERR_INVAL; goto err1; } ! ASSERT3U(exi->exi_zoneid, ==, curzone->zone_id); ! error = VOP_RMDIR(vp, name, ZONE_ROOTVP(), cr, NULL, 0); if (name != args->object.name) kmem_free(name, MAXPATHLEN + 1); ava.va_mask = AT_ALL;
*** 2654,2665 **** } else resp->status = puterrno3(error); err1: vattr_to_wcc_data(bvap, avap, &resp->resfail.dir_wcc); out: ! DTRACE_NFSV3_4(op__rmdir__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, RMDIR3res *, resp); if (vp != NULL) VN_RELE(vp); } --- 2714,2726 ---- } else resp->status = puterrno3(error); err1: vattr_to_wcc_data(bvap, avap, &resp->resfail.dir_wcc); out: ! DTRACE_NFSV3_5(op__rmdir__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! RMDIR3res *, resp); if (vp != NULL) VN_RELE(vp); }
*** 2700,2711 **** tavap = NULL; tvp = NULL; fvp = nfs3_fhtovp(&args->from.dir, exi); ! DTRACE_NFSV3_4(op__rename__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, fvp, RENAME3args *, args); if (fvp == NULL) { error = ESTALE; goto err; } --- 2761,2773 ---- tavap = NULL; tvp = NULL; fvp = nfs3_fhtovp(&args->from.dir, exi); ! DTRACE_NFSV3_5(op__rename__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, fvp, struct exportinfo *, exi, ! RENAME3args *, args); if (fvp == NULL) { error = ESTALE; goto err; }
*** 2818,2831 **** resp->status = NFS3ERR_JUKEBOX; goto err1; } /* ! * Check for renaming over a delegated file. Check rfs4_deleg_policy * first to avoid VOP_LOOKUP if possible. */ ! if (rfs4_deleg_policy != SRV_NEVER_DELEGATE && VOP_LOOKUP(tvp, toname, &targvp, NULL, 0, NULL, cr, NULL, NULL, NULL) == 0) { if (rfs4_check_delegated(FWRITE, targvp, TRUE)) { VN_RELE(targvp); --- 2880,2893 ---- resp->status = NFS3ERR_JUKEBOX; goto err1; } /* ! * Check for renaming over a delegated file. Check nfs4_deleg_policy * first to avoid VOP_LOOKUP if possible. */ ! if (nfs4_get_deleg_policy() != SRV_NEVER_DELEGATE && VOP_LOOKUP(tvp, toname, &targvp, NULL, 0, NULL, cr, NULL, NULL, NULL) == 0) { if (rfs4_check_delegated(FWRITE, targvp, TRUE)) { VN_RELE(targvp);
*** 2885,2896 **** if (name != NULL && name != args->from.name) kmem_free(name, MAXPATHLEN + 1); if (toname != NULL && toname != args->to.name) kmem_free(toname, MAXPATHLEN + 1); ! DTRACE_NFSV3_4(op__rename__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, fvp, RENAME3res *, resp); if (fvp != NULL) VN_RELE(fvp); if (tvp != NULL) VN_RELE(tvp); } --- 2947,2959 ---- if (name != NULL && name != args->from.name) kmem_free(name, MAXPATHLEN + 1); if (toname != NULL && toname != args->to.name) kmem_free(toname, MAXPATHLEN + 1); ! DTRACE_NFSV3_5(op__rename__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, fvp, struct exportinfo *, exi, ! RENAME3res *, resp); if (fvp != NULL) VN_RELE(fvp); if (tvp != NULL) VN_RELE(tvp); }
*** 2926,2937 **** avap = NULL; dvp = NULL; vp = nfs3_fhtovp(&args->file, exi); ! DTRACE_NFSV3_4(op__link__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, LINK3args *, args); if (vp == NULL) { error = ESTALE; goto out; } --- 2989,3001 ---- avap = NULL; dvp = NULL; vp = nfs3_fhtovp(&args->file, exi); ! DTRACE_NFSV3_5(op__link__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! LINK3args *, args); if (vp == NULL) { error = ESTALE; goto out; }
*** 3039,3050 **** resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.file_attributes); vattr_to_wcc_data(bvap, avap, &resp->resok.linkdir_wcc); ! DTRACE_NFSV3_4(op__link__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, LINK3res *, resp); VN_RELE(vp); return; --- 3103,3115 ---- resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.file_attributes); vattr_to_wcc_data(bvap, avap, &resp->resok.linkdir_wcc); ! DTRACE_NFSV3_5(op__link__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! LINK3res *, resp); VN_RELE(vp); return;
*** 3056,3067 **** resp->status = puterrno3(error); out1: if (name != NULL && name != args->link.name) kmem_free(name, MAXPATHLEN + 1); ! DTRACE_NFSV3_4(op__link__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, LINK3res *, resp); if (vp != NULL) VN_RELE(vp); if (dvp != NULL) VN_RELE(dvp); --- 3121,3133 ---- resp->status = puterrno3(error); out1: if (name != NULL && name != args->link.name) kmem_free(name, MAXPATHLEN + 1); ! DTRACE_NFSV3_5(op__link__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! LINK3res *, resp); if (vp != NULL) VN_RELE(vp); if (dvp != NULL) VN_RELE(dvp);
*** 3125,3136 **** vap = NULL; vp = nfs3_fhtovp(&args->dir, exi); ! DTRACE_NFSV3_4(op__readdir__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READDIR3args *, args); if (vp == NULL) { error = ESTALE; goto out; } --- 3191,3203 ---- vap = NULL; vp = nfs3_fhtovp(&args->dir, exi); ! DTRACE_NFSV3_5(op__readdir__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! READDIR3args *, args); if (vp == NULL) { error = ESTALE; goto out; }
*** 3290,3301 **** resp->resok.reply.eof = iseof; resp->resok.size = count - uio.uio_resid; resp->resok.count = args->count; resp->resok.freecount = count; ! DTRACE_NFSV3_4(op__readdir__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READDIR3res *, resp); VN_RELE(vp); return; --- 3357,3369 ---- resp->resok.reply.eof = iseof; resp->resok.size = count - uio.uio_resid; resp->resok.count = args->count; resp->resok.freecount = count; ! DTRACE_NFSV3_5(op__readdir__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! READDIR3res *, resp); VN_RELE(vp); return;
*** 3304,3316 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_4(op__readdir__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READDIR3res *, resp); if (vp != NULL) { VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL); VN_RELE(vp); } vattr_to_post_op_attr(vap, &resp->resfail.dir_attributes); --- 3372,3387 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! vattr_to_post_op_attr(vap, &resp->resfail.dir_attributes); + DTRACE_NFSV3_5(op__readdir__done, struct svc_req *, req, + cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, + READDIR3res *, resp); + if (vp != NULL) { VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL); VN_RELE(vp); } vattr_to_post_op_attr(vap, &resp->resfail.dir_attributes);
*** 3396,3407 **** vap = NULL; vp = nfs3_fhtovp(&args->dir, exi); ! DTRACE_NFSV3_4(op__readdirplus__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READDIRPLUS3args *, args); if (vp == NULL) { error = ESTALE; goto out; } --- 3467,3479 ---- vap = NULL; vp = nfs3_fhtovp(&args->dir, exi); ! DTRACE_NFSV3_5(op__readdirplus__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! READDIRPLUS3args *, args); if (vp == NULL) { error = ESTALE; goto out; }
*** 3679,3694 **** resp->resok.reply.eof = iseof; resp->resok.size = nents; resp->resok.count = args->dircount - ret; resp->resok.maxcount = args->maxcount; ! DTRACE_NFSV3_4(op__readdirplus__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READDIRPLUS3res *, resp); ! if (ndata != data) ! kmem_free(data, args->dircount); - VN_RELE(vp); return; out: --- 3751,3764 ---- resp->resok.reply.eof = iseof; resp->resok.size = nents; resp->resok.count = args->dircount - ret; resp->resok.maxcount = args->maxcount; ! DTRACE_NFSV3_5(op__readdirplus__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! READDIRPLUS3res *, resp); VN_RELE(vp); return; out:
*** 3697,3709 **** resp->status = NFS3ERR_JUKEBOX; } else { resp->status = puterrno3(error); } out1: ! DTRACE_NFSV3_4(op__readdirplus__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, READDIRPLUS3res *, resp); if (vp != NULL) { VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL); VN_RELE(vp); } --- 3767,3782 ---- resp->status = NFS3ERR_JUKEBOX; } else { resp->status = puterrno3(error); } out1: ! vattr_to_post_op_attr(vap, &resp->resfail.dir_attributes); + DTRACE_NFSV3_5(op__readdirplus__done, struct svc_req *, req, + cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, + READDIRPLUS3res *, resp); + if (vp != NULL) { VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL); VN_RELE(vp); }
*** 3744,3755 **** vap = NULL; vp = nfs3_fhtovp(&args->fsroot, exi); ! DTRACE_NFSV3_4(op__fsstat__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, FSSTAT3args *, args); if (vp == NULL) { error = ESTALE; goto out; } --- 3817,3829 ---- vap = NULL; vp = nfs3_fhtovp(&args->fsroot, exi); ! DTRACE_NFSV3_5(op__fsstat__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! FSSTAT3args *, args); if (vp == NULL) { error = ESTALE; goto out; }
*** 3795,3806 **** resp->resok.tfiles = (size3)sb.f_files; resp->resok.ffiles = (size3)sb.f_ffree; resp->resok.afiles = (size3)sb.f_favail; resp->resok.invarsec = 0; ! DTRACE_NFSV3_4(op__fsstat__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, FSSTAT3res *, resp); VN_RELE(vp); return; out: --- 3869,3881 ---- resp->resok.tfiles = (size3)sb.f_files; resp->resok.ffiles = (size3)sb.f_ffree; resp->resok.afiles = (size3)sb.f_favail; resp->resok.invarsec = 0; ! DTRACE_NFSV3_5(op__fsstat__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! FSSTAT3res *, resp); VN_RELE(vp); return; out:
*** 3808,3819 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_4(op__fsstat__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, FSSTAT3res *, resp); if (vp != NULL) VN_RELE(vp); vattr_to_post_op_attr(vap, &resp->resfail.obj_attributes); } --- 3883,3895 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_5(op__fsstat__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! FSSTAT3res *, resp); if (vp != NULL) VN_RELE(vp); vattr_to_post_op_attr(vap, &resp->resfail.obj_attributes); }
*** 3837,3848 **** ulong_t l = 0; int error; vp = nfs3_fhtovp(&args->fsroot, exi); ! DTRACE_NFSV3_4(op__fsinfo__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, FSINFO3args *, args); if (vp == NULL) { if (curthread->t_flag & T_WOULDBLOCK) { curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; --- 3913,3925 ---- ulong_t l = 0; int error; vp = nfs3_fhtovp(&args->fsroot, exi); ! DTRACE_NFSV3_5(op__fsinfo__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! FSINFO3args *, args); if (vp == NULL) { if (curthread->t_flag & T_WOULDBLOCK) { curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX;
*** 3912,3931 **** resp->resok.time_delta.seconds = 0; resp->resok.time_delta.nseconds = 1000; resp->resok.properties = FSF3_LINK | FSF3_SYMLINK | FSF3_HOMOGENEOUS | FSF3_CANSETTIME; ! DTRACE_NFSV3_4(op__fsinfo__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, FSINFO3res *, resp); VN_RELE(vp); return; out: ! DTRACE_NFSV3_4(op__fsinfo__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, NULL, FSINFO3res *, resp); if (vp != NULL) VN_RELE(vp); } void * --- 3989,4010 ---- resp->resok.time_delta.seconds = 0; resp->resok.time_delta.nseconds = 1000; resp->resok.properties = FSF3_LINK | FSF3_SYMLINK | FSF3_HOMOGENEOUS | FSF3_CANSETTIME; ! DTRACE_NFSV3_5(op__fsinfo__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! FSINFO3res *, resp); VN_RELE(vp); return; out: ! DTRACE_NFSV3_5(op__fsinfo__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, NULL, struct exportinfo *, exi, ! FSINFO3res *, resp); if (vp != NULL) VN_RELE(vp); } void *
*** 3947,3958 **** vap = NULL; vp = nfs3_fhtovp(&args->object, exi); ! DTRACE_NFSV3_4(op__pathconf__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, PATHCONF3args *, args); if (vp == NULL) { error = ESTALE; goto out; } --- 4026,4038 ---- vap = NULL; vp = nfs3_fhtovp(&args->object, exi); ! DTRACE_NFSV3_5(op__pathconf__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! PATHCONF3args *, args); if (vp == NULL) { error = ESTALE; goto out; }
*** 4004,4015 **** resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); resp->resok.info.case_insensitive = FALSE; resp->resok.info.case_preserving = TRUE; ! DTRACE_NFSV3_4(op__pathconf__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, PATHCONF3res *, resp); VN_RELE(vp); return; out: if (curthread->t_flag & T_WOULDBLOCK) { --- 4084,4096 ---- resp->status = NFS3_OK; vattr_to_post_op_attr(vap, &resp->resok.obj_attributes); resp->resok.info.case_insensitive = FALSE; resp->resok.info.case_preserving = TRUE; ! DTRACE_NFSV3_5(op__pathconf__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! PATHCONF3res *, resp); VN_RELE(vp); return; out: if (curthread->t_flag & T_WOULDBLOCK) {
*** 4016,4027 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_4(op__pathconf__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, PATHCONF3res *, resp); if (vp != NULL) VN_RELE(vp); vattr_to_post_op_attr(vap, &resp->resfail.obj_attributes); } --- 4097,4109 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_5(op__pathconf__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! PATHCONF3res *, resp); if (vp != NULL) VN_RELE(vp); vattr_to_post_op_attr(vap, &resp->resfail.obj_attributes); }
*** 4034,4043 **** --- 4116,4126 ---- void rfs3_commit(COMMIT3args *args, COMMIT3res *resp, struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro) { + nfs3_srv_t *ns; int error; vnode_t *vp; struct vattr *bvap; struct vattr bva; struct vattr *avap;
*** 4046,4063 **** bvap = NULL; avap = NULL; vp = nfs3_fhtovp(&args->file, exi); ! DTRACE_NFSV3_4(op__commit__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, COMMIT3args *, args); if (vp == NULL) { error = ESTALE; goto out; } 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 --- 4129,4149 ---- bvap = NULL; avap = NULL; vp = nfs3_fhtovp(&args->file, exi); ! DTRACE_NFSV3_5(op__commit__start, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! COMMIT3args *, args); if (vp == NULL) { error = ESTALE; goto out; } + ASSERT3U(curzone->zone_id, ==, exi->exi_zoneid); /* exi is 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
*** 4106,4119 **** if (error) goto out; resp->status = NFS3_OK; vattr_to_wcc_data(bvap, avap, &resp->resok.file_wcc); ! resp->resok.verf = write3verf; ! DTRACE_NFSV3_4(op__commit__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, COMMIT3res *, resp); VN_RELE(vp); return; --- 4192,4206 ---- if (error) goto out; resp->status = NFS3_OK; vattr_to_wcc_data(bvap, avap, &resp->resok.file_wcc); ! resp->resok.verf = ns->write3verf; ! DTRACE_NFSV3_5(op__commit__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! COMMIT3res *, resp); VN_RELE(vp); return;
*** 4122,4133 **** curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_4(op__commit__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, COMMIT3res *, resp); if (vp != NULL) VN_RELE(vp); vattr_to_wcc_data(bvap, avap, &resp->resfail.file_wcc); } --- 4209,4221 ---- curthread->t_flag &= ~T_WOULDBLOCK; resp->status = NFS3ERR_JUKEBOX; } else resp->status = puterrno3(error); out1: ! DTRACE_NFSV3_5(op__commit__done, struct svc_req *, req, ! cred_t *, cr, vnode_t *, vp, struct exportinfo *, exi, ! COMMIT3res *, resp); if (vp != NULL) VN_RELE(vp); vattr_to_wcc_data(bvap, avap, &resp->resfail.file_wcc); }
*** 4201,4211 **** } return (0); } ! static ftype3 vt_to_nf3[] = { 0, NF3REG, NF3DIR, NF3BLK, NF3CHR, NF3LNK, NF3FIFO, 0, 0, NF3SOCK, 0 }; static int vattr_to_fattr3(struct vattr *vap, fattr3 *fap) --- 4289,4299 ---- } return (0); } ! static const ftype3 vt_to_nf3[] = { 0, NF3REG, NF3DIR, NF3BLK, NF3CHR, NF3LNK, NF3FIFO, 0, 0, NF3SOCK, 0 }; static int vattr_to_fattr3(struct vattr *vap, fattr3 *fap)
*** 4283,4306 **** } static void vattr_to_wcc_data(struct vattr *bvap, struct vattr *avap, wcc_data *wccp) { - vattr_to_pre_op_attr(bvap, &wccp->before); vattr_to_post_op_attr(avap, &wccp->after); } void ! rfs3_srvrinit(void) { struct rfs3_verf_overlay { uint_t id; /* a "unique" identifier */ int ts; /* a unique timestamp */ } *verfp; timestruc_t now; /* * The following algorithm attempts to find a unique verifier * to be used as the write verifier returned from the server * to the client. It is important that this verifier change * whenever the server reboots. Of secondary importance, it --- 4371,4413 ---- } static void vattr_to_wcc_data(struct vattr *bvap, struct vattr *avap, wcc_data *wccp) { vattr_to_pre_op_attr(bvap, &wccp->before); vattr_to_post_op_attr(avap, &wccp->after); } + static int + rdma_setup_read_data3(READ3args *args, READ3resok *rok) + { + struct clist *wcl; + int wlist_len; + count3 count = rok->count; + + wcl = args->wlist; + if (rdma_setup_read_chunks(wcl, count, &wlist_len) == FALSE) + return (FALSE); + + wcl = args->wlist; + 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 */ } *verfp; timestruc_t now; + ns = kmem_zalloc(sizeof (*ns), KM_SLEEP); + /* * The following algorithm attempts to find a unique verifier * to be used as the write verifier returned from the server * to the client. It is important that this verifier change * whenever the server reboots. Of secondary importance, it
*** 4320,4362 **** #ifndef lint /* * We ASSERT that this constant logic expression is * always true because in the past, it wasn't. */ ! ASSERT(sizeof (*verfp) <= sizeof (write3verf)); #endif gethrestime(&now); ! verfp = (struct rfs3_verf_overlay *)&write3verf; verfp->ts = (int)now.tv_sec; verfp->id = zone_get_hostid(NULL); if (verfp->id == 0) verfp->id = (uint_t)now.tv_nsec; ! nfs3_srv_caller_id = fs_new_caller_id(); ! } ! static int ! rdma_setup_read_data3(READ3args *args, READ3resok *rok) { ! struct clist *wcl; ! int wlist_len; ! count3 count = rok->count; ! wcl = args->wlist; ! if (rdma_setup_read_chunks(wcl, count, &wlist_len) == FALSE) { ! return (FALSE); ! } ! wcl = args->wlist; ! rok->wlist_len = wlist_len; ! rok->wlist = wcl; ! return (TRUE); } void rfs3_srvrfini(void) { /* Nothing to do */ } --- 4427,4466 ---- #ifndef lint /* * We ASSERT that this constant logic expression is * always true because in the past, it wasn't. */ ! ASSERT(sizeof (*verfp) <= sizeof (ns->write3verf)); #endif gethrestime(&now); ! verfp = (struct rfs3_verf_overlay *)&ns->write3verf; verfp->ts = (int)now.tv_sec; 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) { /* Nothing to do */ }