Print this page
NEX-5669 xdr_READDIR4res() bypass the XDR mblk API
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-3097 IOPS, bandwidth, and latency kstats for NFS server
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>

*** 4299,4318 **** } static bool_t xdr_snfs_argop4(XDR *xdrs, nfs_argop4 *objp) { if (!xdr_int(xdrs, (int *)&objp->argop)) return (FALSE); switch (objp->argop) { case OP_PUTFH: ! return (xdr_decode_nfs_fh4(xdrs, ! &objp->nfs_argop4_u.opputfh.object)); default: ! return (xdr_nfs_argop4(xdrs, objp)); } } /* * Client side encode only arg op processing */ --- 4299,4331 ---- } static bool_t xdr_snfs_argop4(XDR *xdrs, nfs_argop4 *objp) { + uint_t pos; + bool_t ret; + + if (xdrs->x_op == XDR_DECODE) + pos = XDR_GETPOS(xdrs); + if (!xdr_int(xdrs, (int *)&objp->argop)) return (FALSE); switch (objp->argop) { case OP_PUTFH: ! ret = xdr_decode_nfs_fh4(xdrs, ! &objp->nfs_argop4_u.opputfh.object); ! break; default: ! ret = xdr_nfs_argop4(xdrs, objp); ! break; } + + if (ret && xdrs->x_op == XDR_DECODE) + objp->opsize = XDR_GETPOS(xdrs) - pos; + + return (ret); } /* * Client side encode only arg op processing */
*** 4760,4784 **** } static bool_t xdr_snfs_resop4(XDR *xdrs, nfs_resop4 *objp) { if (!xdr_int(xdrs, (int *)&objp->resop)) return (FALSE); switch (objp->resop) { case OP_GETFH: if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->nfs_resop4_u.opgetfh.status)) return (FALSE); if (objp->nfs_resop4_u.opgetfh.status != NFS4_OK) ! return (TRUE); ! return (xdr_encode_nfs_fh4(xdrs, ! &objp->nfs_resop4_u.opgetfh.object)); default: ! return (xdr_nfs_resop4(xdrs, objp)); } } static bool_t xdr_nfs_resop4_clnt(XDR *xdrs, nfs_resop4 *objp, nfs_argop4 *aobjp) { --- 4773,4811 ---- } static bool_t xdr_snfs_resop4(XDR *xdrs, nfs_resop4 *objp) { + uint_t pos; + bool_t ret; + + if (xdrs->x_op == XDR_ENCODE) + pos = XDR_GETPOS(xdrs); + if (!xdr_int(xdrs, (int *)&objp->resop)) return (FALSE); switch (objp->resop) { case OP_GETFH: if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->nfs_resop4_u.opgetfh.status)) return (FALSE); if (objp->nfs_resop4_u.opgetfh.status != NFS4_OK) ! ret = TRUE; ! else ! ret = xdr_encode_nfs_fh4(xdrs, ! &objp->nfs_resop4_u.opgetfh.object); ! break; default: ! ret = xdr_nfs_resop4(xdrs, objp); ! break; } + + if (ret && xdrs->x_op == XDR_ENCODE) + objp->opsize = XDR_GETPOS(xdrs) - pos; + + return (ret); } static bool_t xdr_nfs_resop4_clnt(XDR *xdrs, nfs_resop4 *objp, nfs_argop4 *aobjp) {