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)
{