diff options
| author | Raghavendra G <raghavendra@gluster.com> | 2010-08-04 04:45:25 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2010-08-06 03:37:20 -0700 | 
| commit | b04d963e91f8b3c72343e1043d6ed8c68699c4fe (patch) | |
| tree | 42ae4cadaa016efd7f11ea0745d457ee79d3aaf3 /xlators/protocol/client/src | |
| parent | 21e4580c24b3e4a1270ad482e1d905afffb00fba (diff) | |
rpc: changes to glusterfs programs that can take an optional payload argument.
- The existing interface required the transport to separate the procedure
    header and procedure payload into two different buffers. Making this
    separation can prove cumbersome for transports like rdma wherein the header
    and payload can be received in a single buffer (For eg., header and payload
    of write fop sent as inline msg using rdma-send). This patch delegates the
    responsiblity of separating out header and payload to programs.
Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 875 (Implement a new protocol to provide proper backward/forward compatibility)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=875
Diffstat (limited to 'xlators/protocol/client/src')
| -rw-r--r-- | xlators/protocol/client/src/client3_1-fops.c | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/xlators/protocol/client/src/client3_1-fops.c b/xlators/protocol/client/src/client3_1-fops.c index 52d5c093a60..32ebb0b1e7f 100644 --- a/xlators/protocol/client/src/client3_1-fops.c +++ b/xlators/protocol/client/src/client3_1-fops.c @@ -1980,10 +1980,12 @@ client3_1_readv_cbk (struct rpc_req *req, struct iovec *iov, int count,  {          call_frame_t  *frame  = NULL;          struct iobref *iobref = NULL; -        struct iovec   vector = {0,}; +        struct iovec   vector[MAX_IOVEC];          struct iatt    stat   = {0,};          gfs3_read_rsp  rsp    = {0,}; -        int            ret    = 0; +        int            ret    = 0, rspcount = 0, i = 0; + +        memset (vector, 0, sizeof (vector));          frame = myframe; @@ -2004,15 +2006,20 @@ client3_1_readv_cbk (struct rpc_req *req, struct iovec *iov, int count,          if (rsp.op_ret != -1) {                  iobref = req->rsp_iobref;                  gf_stat_to_iatt (&rsp.stat, &stat); -                vector.iov_len  = rsp.op_ret; -                if (rsp.op_ret > 0) { -                        vector.iov_base = req->rsp[1].iov_base; +                if (ret < req->rsp[0].iov_len) { +                        vector[0].iov_base = req->rsp[0].iov_base + ret; +                        vector[0].iov_len = req->rsp[0].iov_len - ret; +                        rspcount = 1; +                } + +                for (i = 1; i < req->rspcnt; i++) { +                        vector[rspcount++] = req->rsp[i];                  }          }  out:          STACK_UNWIND_STRICT (readv, frame, rsp.op_ret, -                             gf_error_to_errno (rsp.op_errno), &vector, 1, +                             gf_error_to_errno (rsp.op_errno), vector, rspcount,                               &stat, iobref);          return 0;  | 
