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>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/nfs/nfs4_xdr.c
          +++ new/usr/src/uts/common/fs/nfs/nfs4_xdr.c
↓ open down ↓ 4293 lines elided ↑ open up ↑
4294 4294  {
4295 4295          if (!xdr_int(xdrs, (int *)&objp->argop))
4296 4296                  return (FALSE);
4297 4297  
4298 4298          return (xdr_nfs_argop4(xdrs, objp));
4299 4299  }
4300 4300  
4301 4301  static bool_t
4302 4302  xdr_snfs_argop4(XDR *xdrs, nfs_argop4 *objp)
4303 4303  {
     4304 +        uint_t pos;
     4305 +        bool_t ret;
     4306 +
     4307 +        if (xdrs->x_op == XDR_DECODE)
     4308 +                pos = XDR_GETPOS(xdrs);
     4309 +
4304 4310          if (!xdr_int(xdrs, (int *)&objp->argop))
4305 4311                  return (FALSE);
4306 4312  
4307 4313          switch (objp->argop) {
4308 4314          case OP_PUTFH:
4309      -                return (xdr_decode_nfs_fh4(xdrs,
4310      -                    &objp->nfs_argop4_u.opputfh.object));
     4315 +                ret = xdr_decode_nfs_fh4(xdrs,
     4316 +                    &objp->nfs_argop4_u.opputfh.object);
     4317 +                break;
4311 4318          default:
4312      -                return (xdr_nfs_argop4(xdrs, objp));
     4319 +                ret = xdr_nfs_argop4(xdrs, objp);
     4320 +                break;
4313 4321          }
     4322 +
     4323 +        if (ret && xdrs->x_op == XDR_DECODE)
     4324 +                objp->opsize = XDR_GETPOS(xdrs) - pos;
     4325 +
     4326 +        return (ret);
4314 4327  }
4315 4328  
4316 4329  /*
4317 4330   * Client side encode only arg op processing
4318 4331   */
4319 4332  static bool_t
4320 4333  xdr_cnfs_argop4(XDR *xdrs, nfs_argop4 *objp)
4321 4334  {
4322 4335          int len;
4323 4336          int op;
↓ open down ↓ 431 lines elided ↑ open up ↑
4755 4768          case OP_ILLEGAL:
4756 4769                  return (xdr_int(xdrs,
4757 4770                      (int32_t *)&objp->nfs_resop4_u.opillegal.status));
4758 4771          }
4759 4772          return (FALSE);
4760 4773  }
4761 4774  
4762 4775  static bool_t
4763 4776  xdr_snfs_resop4(XDR *xdrs, nfs_resop4 *objp)
4764 4777  {
     4778 +        uint_t pos;
     4779 +        bool_t ret;
     4780 +
     4781 +        if (xdrs->x_op == XDR_ENCODE)
     4782 +                pos = XDR_GETPOS(xdrs);
     4783 +
4765 4784          if (!xdr_int(xdrs, (int *)&objp->resop))
4766 4785                  return (FALSE);
4767 4786  
4768 4787          switch (objp->resop) {
4769 4788          case OP_GETFH:
4770 4789                  if (!XDR_PUTINT32(xdrs,
4771 4790                      (int32_t *)&objp->nfs_resop4_u.opgetfh.status))
4772 4791                          return (FALSE);
4773 4792                  if (objp->nfs_resop4_u.opgetfh.status != NFS4_OK)
4774      -                        return (TRUE);
4775      -                return (xdr_encode_nfs_fh4(xdrs,
4776      -                    &objp->nfs_resop4_u.opgetfh.object));
     4793 +                        ret = TRUE;
     4794 +                else
     4795 +                        ret = xdr_encode_nfs_fh4(xdrs,
     4796 +                            &objp->nfs_resop4_u.opgetfh.object);
     4797 +                break;
4777 4798          default:
4778      -                return (xdr_nfs_resop4(xdrs, objp));
     4799 +                ret = xdr_nfs_resop4(xdrs, objp);
     4800 +                break;
4779 4801          }
     4802 +
     4803 +        if (ret && xdrs->x_op == XDR_ENCODE)
     4804 +                objp->opsize = XDR_GETPOS(xdrs) - pos;
     4805 +
     4806 +        return (ret);
4780 4807  }
4781 4808  
4782 4809  static bool_t
4783 4810  xdr_nfs_resop4_clnt(XDR *xdrs, nfs_resop4 *objp, nfs_argop4 *aobjp)
4784 4811  {
4785 4812          if (!xdr_int(xdrs, (int *)&objp->resop))
4786 4813                  return (FALSE);
4787 4814          /*
4788 4815           * These should be ordered by frequency of use
4789 4816           */
↓ open down ↓ 466 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX