diff options
-rw-r--r-- | rpc/rpc-transport/socket/src/socket.c | 5 | ||||
-rw-r--r-- | xlators/protocol/client/src/client3_1-fops.c | 19 | ||||
-rw-r--r-- | xlators/protocol/server/src/server.h | 2 | ||||
-rw-r--r-- | xlators/protocol/server/src/server3_1-fops.c | 52 |
4 files changed, 49 insertions, 29 deletions
diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c index baeee735bb8..b017462a507 100644 --- a/rpc/rpc-transport/socket/src/socket.c +++ b/rpc/rpc-transport/socket/src/socket.c @@ -1057,6 +1057,10 @@ __socket_read_vectored_reply (rpc_transport_t *this) && (RPC_LASTFRAG (priv->incoming.fraghdr)))) { priv->incoming.frag.call_body.reply.status_state = SP_STATE_ACCEPTED_REPLY_INIT; + priv->incoming.payload_vector.iov_len + = (unsigned long)priv->incoming.frag.fragcurrent + - (unsigned long) + priv->incoming.payload_vector.iov_base; } break; } @@ -1230,6 +1234,7 @@ __socket_proto_state_machine (rpc_transport_t *this, priv->incoming.iobuf = iobuf; priv->incoming.iobuf_size = 0; + priv->incoming.total_bytes_read = 0; priv->incoming.payload_vector.iov_len = 0; priv->incoming.pending_vector = priv->incoming.vector; 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; diff --git a/xlators/protocol/server/src/server.h b/xlators/protocol/server/src/server.h index 20853879f8c..a35eeb166dc 100644 --- a/xlators/protocol/server/src/server.h +++ b/xlators/protocol/server/src/server.h @@ -162,7 +162,7 @@ struct _server_state { fd_t *fd; int flags; int wbflags; - struct iovec payload_vector; + struct iovec payload_vector[MAX_IOVEC]; int payload_count; struct iobuf *iobuf; struct iobref *iobref; diff --git a/xlators/protocol/server/src/server3_1-fops.c b/xlators/protocol/server/src/server3_1-fops.c index fb69cf8da28..5175251601e 100644 --- a/xlators/protocol/server/src/server3_1-fops.c +++ b/xlators/protocol/server/src/server3_1-fops.c @@ -2438,20 +2438,16 @@ int server_writev_resume (call_frame_t *frame, xlator_t *bound_xl) { server_state_t *state = NULL; - struct iovec iov = {0, }; state = CALL_STATE (frame); if (state->resolve.op_ret != 0) goto err; - if (state->payload_count) { - iov = state->payload_vector; - } - STACK_WIND (frame, server_writev_cbk, bound_xl, bound_xl->fops->writev, - state->fd, &iov, 1, state->offset, state->iobref); + state->fd, state->payload_vector, state->payload_count, + state->offset, state->iobref); return 0; err: @@ -2978,24 +2974,17 @@ out: int server_writev (rpcsvc_request_t *req) { - /* TODO : */ - assert (0); - return 0; -} - - -int -server_writev_vec (rpcsvc_request_t *req, struct iovec *payload, - int payload_count, struct iobref *iobref) -{ server_state_t *state = NULL; call_frame_t *frame = NULL; gfs3_write_req args = {0,}; + ssize_t len = 0; + int i = 0; if (!req) return 0; - if (!xdr_to_writev_req (req->msg[0], &args)) { + len = xdr_to_writev_req (req->msg[0], &args); + if (len == 0) { //failed to decode msg; req->rpc_err = GARBAGE_ARGS; goto out; @@ -3019,12 +3008,23 @@ server_writev_vec (rpcsvc_request_t *req, struct iovec *payload, state->resolve.type = RESOLVE_MUST; state->resolve.fd_no = args.fd; state->offset = args.offset; + state->iobref = iobref_ref (req->iobref); - if (payload_count != 0) { - state->iobref = iobref_ref (iobref); - state->size = req->msg[1].iov_len; - state->payload_count = payload_count; - state->payload_vector = *payload; + if (len < req->msg[0].iov_len) { + state->payload_vector[0].iov_base + = (req->msg[0].iov_base + len); + state->payload_vector[0].iov_len + = req->msg[0].iov_len - len; + state->payload_count = 1; + } + + for (i = 1; i < req->count; i++) { + state->payload_vector[state->payload_count++] + = req->msg[i]; + } + + for (i = 0; i < state->payload_count; i++) { + state->size += state->payload_vector[i].iov_len; } resolve_and_resume (frame, server_writev_resume); @@ -3034,6 +3034,14 @@ out: int +server_writev_vec (rpcsvc_request_t *req, struct iovec *payload, + int payload_count, struct iobref *iobref) +{ + return server_writev (req); +} + + +int server_release (rpcsvc_request_t *req) { server_connection_t *conn = NULL; |