diff options
Diffstat (limited to 'xlators/protocol/client')
| -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;  | 
