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 */ } +