diff options
| -rw-r--r-- | rpc/rpc-lib/src/rpc-transport.h | 1 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 21 | 
2 files changed, 19 insertions, 3 deletions
diff --git a/rpc/rpc-lib/src/rpc-transport.h b/rpc/rpc-lib/src/rpc-transport.h index 227911a5935..f0add065065 100644 --- a/rpc/rpc-lib/src/rpc-transport.h +++ b/rpc/rpc-lib/src/rpc-transport.h @@ -205,6 +205,7 @@ struct rpc_transport {          uint64_t                   total_bytes_read;          uint64_t                   total_bytes_write; +        uint32_t                   xid; /* RPC/XID used for callbacks */          struct list_head           list;          int                        bind_insecure; diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index 05d269609c5..f07e745a4b3 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -870,6 +870,20 @@ err:          return txrecord;  } +static uint32_t +rpc_callback_new_callid (struct rpc_transport *trans) +{ +        uint32_t callid = 0; + +        pthread_mutex_lock (&trans->lock); +        { +                callid = ++trans->xid; +        } +        pthread_mutex_unlock (&trans->lock); + +        return callid; +} +  int  rpcsvc_fill_callback (int prognum, int progver, int procnum, int payload,                        uint32_t xid, struct rpc_msg *request) @@ -1048,6 +1062,7 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,          rpc_transport_req_t    req;          int                    ret         = -1;          int                    proglen     = 0; +        uint32_t               xid         = 0;          if (!rpc) {                  goto out; @@ -1059,11 +1074,11 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,                  proglen += iov_length (proghdr, proghdrcount);          } +        xid = rpc_callback_new_callid (trans); +          request_iob = rpcsvc_callback_build_record (rpc, prog->prognum,                                                      prog->progver, procnum, -                                                    proglen, -                                                    GF_UNIVERSAL_ANSWER, -                                                    &rpchdr); +                                                    proglen, xid, &rpchdr);          if (!request_iob) {                  gf_log ("rpcsvc", GF_LOG_WARNING,                          "cannot build rpc-record");  | 
