diff options
author | Raghavendra G <raghavendra@gluster.com> | 2012-05-28 16:55:52 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-06-01 15:58:31 -0700 |
commit | 7150f4197bd709da0a8887d5ad35e58ee2eeb72e (patch) | |
tree | 77dcb3f0c53d9aa1168387651b81a4011b332fc4 /xlators/protocol | |
parent | 10ca7875b8c003ccc7d11f0406d9867d1f5a1223 (diff) |
protocol/client: provide a buffer for storing reply of readlink.
since a readlink response can be bigger than size of rdma-msges
that can be inlined, we need to provide a buffer where server
can do an rdma-write of response.
Change-Id: I6ab06c3a94702f810ab0c57b409aaaf35cc93057
BUG: 822337
Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Reviewed-on: http://review.gluster.com/3464
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/protocol')
-rw-r--r-- | xlators/protocol/client/src/client3_1-fops.c | 53 |
1 files changed, 46 insertions, 7 deletions
diff --git a/xlators/protocol/client/src/client3_1-fops.c b/xlators/protocol/client/src/client3_1-fops.c index fb3d61703c6..7a0c41dd8ce 100644 --- a/xlators/protocol/client/src/client3_1-fops.c +++ b/xlators/protocol/client/src/client3_1-fops.c @@ -3238,11 +3238,17 @@ int32_t client3_1_readlink (call_frame_t *frame, xlator_t *this, void *data) { - clnt_conf_t *conf = NULL; - clnt_args_t *args = NULL; - gfs3_readlink_req req = {{0,},}; - int ret = 0; - int op_errno = ESTALE; + clnt_conf_t *conf = NULL; + clnt_args_t *args = NULL; + gfs3_readlink_req req = {{0,},}; + int ret = 0; + int op_errno = ESTALE; + clnt_local_t *local = NULL; + struct iobuf *rsp_iobuf = NULL; + struct iobref *rsp_iobref = NULL; + struct iovec *rsphdr = NULL; + int count = 0; + struct iovec vector[MAX_IOVEC] = {{0}, }; if (!frame || !this || !data) goto unwind; @@ -3263,14 +3269,43 @@ client3_1_readlink (call_frame_t *frame, xlator_t *this, req.size = args->size; conf = this->private; + local = mem_get0 (this->local_pool); + if (!local) { + op_errno = ENOMEM; + goto unwind; + } + + frame->local = local; + GF_PROTOCOL_DICT_SERIALIZE (this, args->xdata, (&req.xdata.xdata_val), req.xdata.xdata_len, op_errno, unwind); + rsp_iobref = iobref_new (); + if (rsp_iobref == NULL) { + goto unwind; + } + + rsp_iobuf = iobuf_get (this->ctx->iobuf_pool); + if (rsp_iobuf == NULL) { + goto unwind; + } + + iobref_add (rsp_iobref, rsp_iobuf); + iobuf_unref (rsp_iobuf); + rsphdr = &vector[0]; + rsphdr->iov_base = iobuf_ptr (rsp_iobuf); + rsphdr->iov_len = iobuf_pagesize (rsp_iobuf); + count = 1; + local->iobref = rsp_iobref; + rsp_iobuf = NULL; + rsp_iobref = NULL; + ret = client_submit_request (this, &req, frame, conf->fops, GFS3_OP_READLINK, client3_1_readlink_cbk, NULL, - NULL, 0, NULL, 0, - NULL, (xdrproc_t)xdr_gfs3_readlink_req); + rsphdr, count, NULL, 0, + local->iobref, + (xdrproc_t)xdr_gfs3_readlink_req); if (ret) { gf_log (this->name, GF_LOG_WARNING, "failed to send the fop"); } @@ -3280,6 +3315,10 @@ client3_1_readlink (call_frame_t *frame, xlator_t *this, return 0; unwind: + if (rsp_iobref != NULL) { + iobref_unref (rsp_iobref); + } + CLIENT_STACK_UNWIND (readlink, frame, -1, op_errno, NULL, NULL, NULL); if (req.xdata.xdata_val) GF_FREE (req.xdata.xdata_val); |