diff options
Diffstat (limited to 'rpc/rpc-lib/src')
| -rw-r--r-- | rpc/rpc-lib/src/rpc-clnt.c | 25 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 49 | 
2 files changed, 40 insertions, 34 deletions
diff --git a/rpc/rpc-lib/src/rpc-clnt.c b/rpc/rpc-lib/src/rpc-clnt.c index 631d7fcf7e1..540c72c82d6 100644 --- a/rpc/rpc-lib/src/rpc-clnt.c +++ b/rpc/rpc-lib/src/rpc-clnt.c @@ -1117,7 +1117,7 @@ ret:  int -rpc_clnt_fill_request (int prognum, int progver, int procnum, int payload, +rpc_clnt_fill_request (int prognum, int progver, int procnum,                         uint64_t xid, struct auth_glusterfs_parms_v2 *au,                         struct rpc_msg *request, char *auth_data)  { @@ -1197,7 +1197,7 @@ out:  struct iobuf *  rpc_clnt_record_build_record (struct rpc_clnt *clnt, int prognum, int progver, -                              int procnum, size_t payload, uint64_t xid, +                              int procnum, size_t hdrsize, uint64_t xid,                                struct auth_glusterfs_parms_v2 *au,                                struct iovec *recbuf)  { @@ -1207,16 +1207,19 @@ rpc_clnt_record_build_record (struct rpc_clnt *clnt, int prognum, int progver,          struct iovec    recordhdr                    = {0, };          size_t          pagesize                     = 0;          int             ret                          = -1; +        size_t          xdr_size                     = 0;          char            auth_data[GF_MAX_AUTH_BYTES] = {0, };          if ((!clnt) || (!recbuf) || (!au)) {                  goto out;          } +        xdr_size = xdr_sizeof ((xdrproc_t)xdr_callmsg, &request); +          /* First, try to get a pointer into the buffer which the RPC           * layer can use.           */ -        request_iob = iobuf_get (clnt->ctx->iobuf_pool); +        request_iob = iobuf_get2 (clnt->ctx->iobuf_pool, (xdr_size + hdrsize));          if (!request_iob) {                  goto out;          } @@ -1226,7 +1229,7 @@ rpc_clnt_record_build_record (struct rpc_clnt *clnt, int prognum, int progver,          record = iobuf_ptr (request_iob);  /* Now we have it. */          /* Fill the rpc structure and XDR it into the buffer got above. */ -        ret = rpc_clnt_fill_request (prognum, progver, procnum, payload, xid, +        ret = rpc_clnt_fill_request (prognum, progver, procnum, xid,                                       au, &request, auth_data);          if (ret == -1) {                  gf_log (clnt->conn.trans->name, GF_LOG_WARNING, @@ -1235,7 +1238,7 @@ rpc_clnt_record_build_record (struct rpc_clnt *clnt, int prognum, int progver,          }          recordhdr = rpc_clnt_record_build_header (record, pagesize, &request, -                                                  payload); +                                                  hdrsize);          if (!recordhdr.iov_base) {                  gf_log (clnt->conn.trans->name, GF_LOG_ERROR, @@ -1256,7 +1259,7 @@ out:  struct iobuf *  rpc_clnt_record (struct rpc_clnt *clnt, call_frame_t *call_frame, -                 rpc_clnt_prog_t *prog,int procnum, size_t payload_len, +                 rpc_clnt_prog_t *prog, int procnum, size_t hdrlen,                   struct iovec *rpchdr, uint64_t callid)  {          struct auth_glusterfs_parms_v2  au          = {0, }; @@ -1292,12 +1295,9 @@ rpc_clnt_record (struct rpc_clnt *clnt, call_frame_t *call_frame,                  ", gid: %d, owner: %s", au.pid, au.uid, au.gid,                  lkowner_utoa (&call_frame->root->lk_owner)); -        /* Assuming the client program would like to speak to the same version of -         * program on server. -         */          request_iob = rpc_clnt_record_build_record (clnt, prog->prognum,                                                      prog->progver, -                                                    procnum, payload_len, +                                                    procnum, hdrlen,                                                      callid, &au,                                                      rpchdr);          if (!request_iob) { @@ -1432,11 +1432,6 @@ rpc_clnt_submit (struct rpc_clnt *rpc, rpc_clnt_prog_t *prog,                  proglen += iov_length (proghdr, proghdrcount);          } -        if (progpayload) { -                proglen += iov_length (progpayload, -                                       progpayloadcount); -        } -          request_iob = rpc_clnt_record (rpc, frame, prog,                                         procnum, proglen,                                         &rpchdr, callid); diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index e0fc2918473..ca6a6ca4cdb 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -768,16 +768,28 @@ rpcsvc_callback_build_record (rpcsvc_t *rpc, int prognum, int progver,          char                    *record      = NULL;          struct iovec             recordhdr   = {0, };          size_t                   pagesize    = 0; +        size_t                   xdr_size    = 0;          int                      ret         = -1;          if ((!rpc) || (!recbuf)) {                  goto out;          } +        /* Fill the rpc structure and XDR it into the buffer got above. */ +        ret = rpcsvc_fill_callback (prognum, progver, procnum, payload, xid, +                                    &request); +        if (ret == -1) { +                gf_log ("rpcsvc", GF_LOG_WARNING, "cannot build a rpc-request " +                        "xid (%"PRIu64")", xid); +                goto out; +        } +          /* First, try to get a pointer into the buffer which the RPC           * layer can use.           */ -        request_iob = iobuf_get (rpc->ctx->iobuf_pool); +        xdr_size = xdr_sizeof ((xdrproc_t)xdr_callmsg, &request); + +        request_iob = iobuf_get2 (rpc->ctx->iobuf_pool, (xdr_size + payload));          if (!request_iob) {                  goto out;          } @@ -786,15 +798,6 @@ rpcsvc_callback_build_record (rpcsvc_t *rpc, int prognum, int progver,          record = iobuf_ptr (request_iob);  /* Now we have it. */ -        /* Fill the rpc structure and XDR it into the buffer got above. */ -        ret = rpcsvc_fill_callback (prognum, progver, procnum, payload, xid, -                                    &request); -        if (ret == -1) { -                gf_log ("rpcsvc", GF_LOG_WARNING, "cannot build a rpc-request " -                        "xid (%"PRIu64")", xid); -                goto out; -        } -          recordhdr = rpcsvc_callback_build_header (record, pagesize, &request,                                                    payload); @@ -938,13 +941,14 @@ out:   */  struct iobuf *  rpcsvc_record_build_record (rpcsvc_request_t *req, size_t payload, -                            struct iovec *recbuf) +                            size_t hdrlen, struct iovec *recbuf)  {          struct rpc_msg          reply;          struct iobuf            *replyiob = NULL;          char                    *record = NULL;          struct iovec            recordhdr = {0, };          size_t                  pagesize = 0; +        size_t                  xdr_size = 0;          rpcsvc_t                *svc = NULL;          int                     ret = -1; @@ -952,19 +956,25 @@ rpcsvc_record_build_record (rpcsvc_request_t *req, size_t payload,                  return NULL;          svc = req->svc; -        replyiob = iobuf_get (svc->ctx->iobuf_pool); -        pagesize = iobuf_pagesize (replyiob); -        if (!replyiob) { -                goto err_exit; -        } - -        record = iobuf_ptr (replyiob);  /* Now we have it. */          /* Fill the rpc structure and XDR it into the buffer got above. */          ret = rpcsvc_fill_reply (req, &reply);          if (ret)                  goto err_exit; +        xdr_size = xdr_sizeof ((xdrproc_t)xdr_replymsg, &reply); + +        /* Payload would include 'readv' size etc too, where as +           that comes as another payload iobuf */ +        replyiob = iobuf_get2 (svc->ctx->iobuf_pool, (xdr_size + hdrlen)); +        if (!replyiob) { +                goto err_exit; +        } + +        pagesize = iobuf_pagesize (replyiob); + +        record = iobuf_ptr (replyiob);  /* Now we have it. */ +          recordhdr = rpcsvc_record_build_header (record, pagesize, reply,                                                  payload);          if (!recordhdr.iov_base) { @@ -1019,6 +1029,7 @@ rpcsvc_submit_generic (rpcsvc_request_t *req, struct iovec *proghdr,          struct iovec            recordhdr  = {0, };          rpc_transport_t        *trans      = NULL;          size_t                  msglen     = 0; +        size_t                  hdrlen     = 0;          char                    new_iobref = 0;          if ((!req) || (!req->trans)) @@ -1037,7 +1048,7 @@ rpcsvc_submit_generic (rpcsvc_request_t *req, struct iovec *proghdr,          gf_log (GF_RPCSVC, GF_LOG_TRACE, "Tx message: %zu", msglen);          /* Build the buffer containing the encoded RPC reply. */ -        replyiob = rpcsvc_record_build_record (req, msglen, &recordhdr); +        replyiob = rpcsvc_record_build_record (req, msglen, hdrlen, &recordhdr);          if (!replyiob) {                  gf_log (GF_RPCSVC, GF_LOG_ERROR,"Reply record creation failed");                  goto disconnect_exit;  | 
