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

*** 22,31 **** --- 22,35 ---- /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ + /* + * Copyright 2018 Nexenta Systems, Inc. + */ + #include <sys/systm.h> #include <sys/sdt.h> #include <rpc/types.h> #include <rpc/auth.h> #include <rpc/auth_unix.h>
*** 37,51 **** #include <nfs/nfs4_drc.h> #define NFS4_MAX_MINOR_VERSION 0 /* - * This is the duplicate request cache for NFSv4 - */ - rfs4_drc_t *nfs4_drc = NULL; - - /* * The default size of the duplicate request cache */ uint32_t nfs4_drc_max = 8 * 1024; /* --- 41,50 ----
*** 92,107 **** /* * Destroy a duplicate request cache. */ void ! rfs4_fini_drc(rfs4_drc_t *drc) { rfs4_dupreq_t *drp, *drp_next; - ASSERT(drc); - /* iterate over the dr_cache and free the enties */ for (drp = list_head(&(drc->dr_cache)); drp != NULL; drp = drp_next) { if (drp->dr_state == NFS4_DUP_REPLAY) rfs4_compound_free(&(drp->dr_res)); --- 91,106 ---- /* * Destroy a duplicate request cache. */ void ! rfs4_fini_drc(void) { + nfs4_srv_t *nsrv4 = nfs4_get_srv(); + rfs4_drc_t *drc = nsrv4->nfs4_drc; rfs4_dupreq_t *drp, *drp_next; /* iterate over the dr_cache and free the enties */ for (drp = list_head(&(drc->dr_cache)); drp != NULL; drp = drp_next) { if (drp->dr_state == NFS4_DUP_REPLAY) rfs4_compound_free(&(drp->dr_res));
*** 371,382 **** * * drp is the duplicate request entry * */ int ! rfs4_dispatch(struct rpcdisp *disp, struct svc_req *req, ! SVCXPRT *xprt, char *ap) { COMPOUND4res res_buf; COMPOUND4res *rbp; COMPOUND4args *cap; --- 370,381 ---- * * drp is the duplicate request entry * */ int ! rfs4_dispatch(struct rpcdisp *disp, struct svc_req *req, SVCXPRT *xprt, ! char *ap) { COMPOUND4res res_buf; COMPOUND4res *rbp; COMPOUND4args *cap;
*** 384,393 **** --- 383,394 ---- int error = 0; int dis_flags = 0; int dr_stat = NFS4_NOT_DUP; rfs4_dupreq_t *drp = NULL; int rv; + nfs4_srv_t *nsrv4 = nfs4_get_srv(); + rfs4_drc_t *nfs4_drc = nsrv4->nfs4_drc; ASSERT(disp); /* * Short circuit the RPC_NULL proc.
*** 542,558 **** return (FALSE); resp = &res_buf; /* ! * Form a reply tag by copying over the reqeuest tag. */ resp->tag.utf8string_val = kmem_alloc(argsp->tag.utf8string_len, KM_SLEEP); - resp->tag.utf8string_len = argsp->tag.utf8string_len; bcopy(argsp->tag.utf8string_val, resp->tag.utf8string_val, resp->tag.utf8string_len); resp->array_len = 0; resp->array = NULL; resp->status = NFS4ERR_MINOR_VERS_MISMATCH; if (!svc_sendreply(xprt, xdr_COMPOUND4res_srv, (char *)resp)) { DTRACE_PROBE2(nfss__e__minorvers_mismatch, --- 543,563 ---- return (FALSE); resp = &res_buf; /* ! * Form a reply tag by copying over the request tag. */ + resp->tag.utf8string_len = argsp->tag.utf8string_len; + if (argsp->tag.utf8string_len != 0) { resp->tag.utf8string_val = kmem_alloc(argsp->tag.utf8string_len, KM_SLEEP); bcopy(argsp->tag.utf8string_val, resp->tag.utf8string_val, resp->tag.utf8string_len); + } else { + resp->tag.utf8string_val = NULL; + } resp->array_len = 0; resp->array = NULL; resp->status = NFS4ERR_MINOR_VERS_MISMATCH; if (!svc_sendreply(xprt, xdr_COMPOUND4res_srv, (char *)resp)) { DTRACE_PROBE2(nfss__e__minorvers_mismatch,
*** 573,587 **** rbp = &res_buf; /* * Form a reply tag by copying over the request tag. */ rbp->tag.utf8string_val = kmem_alloc(argsp->tag.utf8string_len, KM_SLEEP); - rbp->tag.utf8string_len = argsp->tag.utf8string_len; bcopy(argsp->tag.utf8string_val, rbp->tag.utf8string_val, rbp->tag.utf8string_len); rbp->array_len = 1; rbp->array = kmem_zalloc(rbp->array_len * sizeof (nfs_resop4), KM_SLEEP); resop = &rbp->array[0]; --- 578,596 ---- rbp = &res_buf; /* * Form a reply tag by copying over the request tag. */ + rbp->tag.utf8string_len = argsp->tag.utf8string_len; + if (argsp->tag.utf8string_len != 0) { rbp->tag.utf8string_val = kmem_alloc(argsp->tag.utf8string_len, KM_SLEEP); bcopy(argsp->tag.utf8string_val, rbp->tag.utf8string_val, rbp->tag.utf8string_len); + } else { + rbp->tag.utf8string_val = NULL; + } rbp->array_len = 1; rbp->array = kmem_zalloc(rbp->array_len * sizeof (nfs_resop4), KM_SLEEP); resop = &rbp->array[0];