diff options
-rw-r--r-- | xlators/protocol/client/src/client.c | 43 | ||||
-rw-r--r-- | xlators/protocol/client/src/client3_1-fops.c | 44 |
2 files changed, 55 insertions, 32 deletions
diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index 56ac45a4d27..51c35ef8c70 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -49,12 +49,13 @@ client_submit_request (xlator_t *this, void *req, call_frame_t *frame, struct iovec *rsp_payload, int rsp_payload_count, struct iobref *rsp_iobref) { - int ret = -1; - clnt_conf_t *conf = NULL; - struct iovec iov = {0, }; - struct iobuf *iobuf = NULL; - int count = 0; - char new_iobref = 0, start_ping = 0; + int ret = -1; + clnt_conf_t *conf = NULL; + struct iovec iov = {0, }; + struct iobuf *iobuf = NULL; + int count = 0; + char start_ping = 0; + struct iobref *new_iobref = NULL; if (!this || !prog || !frame) goto out; @@ -75,16 +76,26 @@ client_submit_request (xlator_t *this, void *req, call_frame_t *frame, goto out; }; - if (!iobref) { - iobref = iobref_new (); - if (!iobref) { - goto out; - } + new_iobref = iobref_new (); + if (!new_iobref) { + goto out; + } - new_iobref = 1; + if (iobref != NULL) { + ret = iobref_merge (new_iobref, iobref); + if (ret != 0) { + gf_log (this->name, GF_LOG_WARNING, + "cannot merge iobref passed from caller " + "into new_iobref"); + } } - iobref_add (iobref, iobuf); + ret = iobref_add (new_iobref, iobuf); + if (ret != 0) { + gf_log (this->name, GF_LOG_WARNING, + "cannot add iobuf into iobref"); + goto out; + } iov.iov_base = iobuf->ptr; iov.iov_len = 128 * GF_UNIT_KB; @@ -100,7 +111,7 @@ client_submit_request (xlator_t *this, void *req, call_frame_t *frame, } /* Send the msg */ ret = rpc_clnt_submit (conf->rpc, prog, procnum, cbk, &iov, count, NULL, - 0, iobref, frame, rsphdr, rsphdr_count, + 0, new_iobref, frame, rsphdr, rsphdr_count, rsp_payload, rsp_payload_count, rsp_iobref); if (ret == 0) { @@ -118,8 +129,8 @@ client_submit_request (xlator_t *this, void *req, call_frame_t *frame, ret = 0; out: - if (new_iobref) - iobref_unref (iobref); + if (new_iobref != NULL) + iobref_unref (new_iobref); if (iobuf) iobuf_unref (iobuf); diff --git a/xlators/protocol/client/src/client3_1-fops.c b/xlators/protocol/client/src/client3_1-fops.c index b1fe7fe1e99..6f7808ebb1b 100644 --- a/xlators/protocol/client/src/client3_1-fops.c +++ b/xlators/protocol/client/src/client3_1-fops.c @@ -37,13 +37,13 @@ client_submit_vec_request (xlator_t *this, void *req, call_frame_t *frame, struct iovec *payload, int payloadcnt, struct iobref *iobref, gfs_serialize_t sfunc) { - int ret = 0; - clnt_conf_t *conf = NULL; - struct iovec iov = {0, }; - struct iobuf *iobuf = NULL; - int count = 0; - char new_iobref = 0; - int start_ping = 0; + int ret = 0; + clnt_conf_t *conf = NULL; + struct iovec iov = {0, }; + struct iobuf *iobuf = NULL; + int count = 0; + int start_ping = 0; + struct iobref *new_iobref = NULL; start_ping = 0; @@ -54,16 +54,27 @@ client_submit_vec_request (xlator_t *this, void *req, call_frame_t *frame, goto out; }; - if (!iobref) { - iobref = iobref_new (); - if (!iobref) { + new_iobref = iobref_new (); + if (!new_iobref) { + goto out; + } + + if (iobref != NULL) { + ret = iobref_merge (new_iobref, iobref); + if (ret != 0) { + gf_log (this->name, GF_LOG_WARNING, + "cannot merge iobref passed from caller into " + "new_iobref"); goto out; } - - new_iobref = 1; } - iobref_add (iobref, iobuf); + ret = iobref_add (new_iobref, iobuf); + if (ret != 0) { + gf_log (this->name, GF_LOG_WARNING, + "cannot add iobuf into iobref"); + goto out; + } iov.iov_base = iobuf->ptr; iov.iov_len = 128 * GF_UNIT_KB; @@ -74,12 +85,13 @@ client_submit_vec_request (xlator_t *this, void *req, call_frame_t *frame, if (ret == -1) { goto out; } + iov.iov_len = ret; count = 1; } /* Send the msg */ ret = rpc_clnt_submit (conf->rpc, prog, procnum, cbk, &iov, count, - payload, payloadcnt, iobref, frame, NULL, 0, + payload, payloadcnt, new_iobref, frame, NULL, 0, NULL, 0, NULL); if (ret == 0) { @@ -96,8 +108,8 @@ client_submit_vec_request (xlator_t *this, void *req, call_frame_t *frame, client_start_ping ((void *) this); out: - if (new_iobref) { - iobref_unref (iobref); + if (new_iobref != NULL) { + iobref_unref (new_iobref); } iobuf_unref (iobuf); |