Cdiff nfs3_srv.c
*** /webrev/webrev/usr/src/uts/common/fs/nfs/nfs3_srv.c- Mon Aug 14 13:12:12 2006
--- nfs3_srv.c Sun Jul 23 00:43:22 2006
*** 25,35 ****
*/
/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
! #pragma ident "@(#)nfs3_srv.c 1.114 05/12/16 SMI"
#include <sys/param.h>
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/cred.h>
--- 25,47 ----
*/
/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
! /* Copyright (c) 2006, The Ohio State University. All rights reserved.
! *
! * Portions of this source code is developed by the team members of
! * The Ohio State University's Network-Based Computing Laboratory (NBCL),
! * headed by Professor Dhabaleswar K. (DK) Panda.
! *
! * Acknowledgements to contributions from developors:
! * Ranjit Noronha: noronha@cse.ohio-state.edu
! * Lei Chai : chail@cse.ohio-state.edu
! * Weikuan Yu : yuw@cse.ohio-state.edu
! *
! */
! #pragma ident "@(#)nfs3_srv.c 1.113 05/07/25 SMI"
#include <sys/param.h>
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/cred.h>
*** 56,65 ****
--- 68,79 ----
#include <nfs/nfs.h>
#include <nfs/export.h>
#include <sys/strsubr.h>
+ /* #define RPC_RDMA_INLINE 1 */
+
/*
* 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.
*/
*** 847,868 ****
*/
if (args->count > rfs3_tsize(req))
args->count = rfs3_tsize(req);
/*
* mp will contain the data to be sent out in the read reply.
* This will be freed after the reply has been sent out (by the
* driver).
* Let's roundup the data to a BYTES_PER_XDR_UNIT multiple, so
* that the call to xdrmblk_putmblk() never fails.
*/
! mp = allocb_wait(RNDUP(args->count), BPRI_MED, STR_NOSIG, &alloc_err);
ASSERT(mp != NULL);
ASSERT(alloc_err == 0);
iov.iov_base = (caddr_t)mp->b_datap->db_base;
iov.iov_len = args->count;
uio.uio_iov = &iov;
uio.uio_iovcnt = 1;
uio.uio_segflg = UIO_SYSSPACE;
uio.uio_extflg = UIO_COPY_CACHED;
uio.uio_loffset = args->offset;
--- 861,891 ----
*/
if (args->count > rfs3_tsize(req))
args->count = rfs3_tsize(req);
/*
+ * If we aren't returning READ data w/RDMA_WRITE, then grab
+ * a mblk.
+ */
+ if (SVC_GET_WCHUNK(req->rq_xprt, req, &iov) == FALSE) {
+
+ /*
* mp will contain the data to be sent out in the read reply.
* This will be freed after the reply has been sent out (by the
* driver).
* Let's roundup the data to a BYTES_PER_XDR_UNIT multiple, so
* that the call to xdrmblk_putmblk() never fails.
*/
! mp = allocb_wait(RNDUP(args->count), BPRI_MED, STR_NOSIG,
! &alloc_err);
ASSERT(mp != NULL);
ASSERT(alloc_err == 0);
iov.iov_base = (caddr_t)mp->b_datap->db_base;
iov.iov_len = args->count;
+ } else
+ mp = NULL;
uio.uio_iov = &iov;
uio.uio_iovcnt = 1;
uio.uio_segflg = UIO_SYSSPACE;
uio.uio_extflg = UIO_COPY_CACHED;
uio.uio_loffset = args->offset;
*** 917,928 ****
if (!error && offset + resp->resok.count == va.va_size)
resp->resok.eof = TRUE;
else
resp->resok.eof = FALSE;
resp->resok.data.data_len = resp->resok.count;
! resp->resok.data.data_val = (char *)mp->b_datap->db_base;
!
resp->resok.data.mp = mp;
resp->resok.size = (uint_t)args->count;
return;
--- 940,954 ----
if (!error && offset + resp->resok.count == va.va_size)
resp->resok.eof = TRUE;
else
resp->resok.eof = FALSE;
resp->resok.data.data_len = resp->resok.count;
! #ifndef RPC_RDMA_INLINE
! resp->resok.data.data_val = (caddr_t)iov.iov_base;
! #else
! resp->resok.data.data_val = (caddr_t)mp->b_datap->db_base;
! #endif
resp->resok.data.mp = mp;
resp->resok.size = (uint_t)args->count;
return;
*** 2411,2420 ****
--- 2437,2447 ----
vn_setpath(rootdir, tvp, srcvp, args->to.name,
strlen(args->to.name));
if (tmp != NULL)
kmem_free(tmp, strlen(tmp) + 1);
}
+
VN_RELE(srcvp);
srcvp = NULL;
#ifdef DEBUG
if (rfs3_do_post_op_attr) {
*** 3740,3744 ****
--- 3767,3772 ----
void
rfs3_srvrfini(void)
{
/* Nothing to do */
}
+