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,20 +4299,33 @@
 }
 
 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:
-                return (xdr_decode_nfs_fh4(xdrs,
-                    &objp->nfs_argop4_u.opputfh.object));
+                ret = xdr_decode_nfs_fh4(xdrs,
+                    &objp->nfs_argop4_u.opputfh.object);
+                break;
         default:
-                return (xdr_nfs_argop4(xdrs, objp));
+                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,25 +4773,39 @@
 }
 
 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)
-                        return (TRUE);
-                return (xdr_encode_nfs_fh4(xdrs,
-                    &objp->nfs_resop4_u.opgetfh.object));
+                        ret = TRUE;
+                else
+                        ret = xdr_encode_nfs_fh4(xdrs,
+                            &objp->nfs_resop4_u.opgetfh.object);
+                break;
         default:
-                return (xdr_nfs_resop4(xdrs, objp));
+                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)
 {