protocol/client: Remove code duplication
client_submit_vec_request() which is used by WRITEV, and PUT and client_submit_request() used by the rest of the fops have almost similar code. However, there have been some more checks - such as whether setvolume was successful or not, and one more that is send-gid-specific - that have been missed out in the vectored version of the function. This patch fixes this code duplication. Change-Id: I363a28eeead6219cb1009dc831538153e8bd7d40 fixes: bz#1591580 Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
This commit is contained in:
parent
10581852df
commit
337f5815a4
@ -22,97 +22,6 @@ int32_t client3_getspec (call_frame_t *frame, xlator_t *this, void *data);
|
||||
rpc_clnt_prog_t clnt3_3_fop_prog;
|
||||
|
||||
|
||||
int
|
||||
client_submit_vec_request (xlator_t *this, void *req, call_frame_t *frame,
|
||||
rpc_clnt_prog_t *prog, int procnum,
|
||||
fop_cbk_fn_t cbkfn,
|
||||
struct iovec *payload, int payloadcnt,
|
||||
struct iobref *iobref, xdrproc_t xdrproc)
|
||||
{
|
||||
int ret = 0;
|
||||
clnt_conf_t *conf = NULL;
|
||||
struct iovec iov = {0, };
|
||||
struct iobuf *iobuf = NULL;
|
||||
int count = 0;
|
||||
struct iobref *new_iobref = NULL;
|
||||
ssize_t xdr_size = 0;
|
||||
struct rpc_req rpcreq = {0, };
|
||||
|
||||
conf = this->private;
|
||||
|
||||
if (req && xdrproc) {
|
||||
xdr_size = xdr_sizeof (xdrproc, req);
|
||||
iobuf = iobuf_get2 (this->ctx->iobuf_pool, xdr_size);
|
||||
if (!iobuf) {
|
||||
goto unwind;
|
||||
};
|
||||
|
||||
new_iobref = iobref_new ();
|
||||
if (!new_iobref) {
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
if (iobref != NULL) {
|
||||
ret = iobref_merge (new_iobref, iobref);
|
||||
if (ret != 0) {
|
||||
gf_msg (this->name, GF_LOG_WARNING, ENOMEM,
|
||||
PC_MSG_NO_MEMORY, "cannot merge "
|
||||
"iobref passed from caller into "
|
||||
"new_iobref");
|
||||
}
|
||||
}
|
||||
|
||||
ret = iobref_add (new_iobref, iobuf);
|
||||
if (ret != 0) {
|
||||
gf_msg (this->name, GF_LOG_WARNING, ENOMEM,
|
||||
PC_MSG_NO_MEMORY, "cannot add iobuf into "
|
||||
"iobref");
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
iov.iov_base = iobuf->ptr;
|
||||
iov.iov_len = iobuf_size (iobuf);
|
||||
|
||||
/* Create the xdr payload */
|
||||
ret = xdr_serialize_generic (iov, req, xdrproc);
|
||||
if (ret == -1) {
|
||||
gf_log_callingfn ("", GF_LOG_WARNING,
|
||||
"XDR function failed");
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
iov.iov_len = ret;
|
||||
count = 1;
|
||||
}
|
||||
|
||||
/* Send the msg */
|
||||
ret = rpc_clnt_submit (conf->rpc, prog, procnum, cbkfn, &iov, count,
|
||||
payload, payloadcnt, new_iobref, frame, NULL, 0,
|
||||
NULL, 0, NULL);
|
||||
if (ret < 0) {
|
||||
gf_msg_debug (this->name, 0, "rpc_clnt_submit failed");
|
||||
}
|
||||
|
||||
if (new_iobref)
|
||||
iobref_unref (new_iobref);
|
||||
|
||||
if (iobuf)
|
||||
iobuf_unref (iobuf);
|
||||
|
||||
return ret;
|
||||
|
||||
unwind:
|
||||
rpcreq.rpc_status = -1;
|
||||
cbkfn (&rpcreq, NULL, 0, frame);
|
||||
|
||||
if (new_iobref)
|
||||
iobref_unref (new_iobref);
|
||||
|
||||
if (iobuf)
|
||||
iobuf_unref (iobuf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* CBK */
|
||||
|
||||
@ -4270,11 +4179,11 @@ client3_3_writev (call_frame_t *frame, xlator_t *this, void *data)
|
||||
op_errno = -ret;
|
||||
goto unwind;
|
||||
}
|
||||
ret = client_submit_vec_request (this, &req, frame, conf->fops,
|
||||
GFS3_OP_WRITE, client3_3_writev_cbk,
|
||||
args->vector, args->count,
|
||||
args->iobref,
|
||||
(xdrproc_t)xdr_gfs3_write_req);
|
||||
ret = client_submit_request (this, &req, frame, conf->fops,
|
||||
GFS3_OP_WRITE, client3_3_writev_cbk,
|
||||
args->iobref, args->vector, args->count,
|
||||
NULL, 0, NULL,
|
||||
(xdrproc_t)xdr_gfs3_write_req);
|
||||
if (ret) {
|
||||
/*
|
||||
* If the lower layers fail to submit a request, they'll also
|
||||
|
@ -23,13 +23,6 @@ client3_getspec (call_frame_t *frame, xlator_t *this, void *data);
|
||||
extern int32_t
|
||||
client3_3_getxattr (call_frame_t *frame, xlator_t *this, void *data);
|
||||
|
||||
extern int
|
||||
client_submit_vec_request (xlator_t *this, void *req, call_frame_t *frame,
|
||||
rpc_clnt_prog_t *prog, int procnum,
|
||||
fop_cbk_fn_t cbkfn,
|
||||
struct iovec *payload, int payloadcnt,
|
||||
struct iobref *iobref, xdrproc_t xdrproc);
|
||||
|
||||
int
|
||||
client4_0_symlink_cbk (struct rpc_req *req, struct iovec *iov, int count,
|
||||
void *myframe)
|
||||
@ -3770,11 +3763,11 @@ client4_0_writev (call_frame_t *frame, xlator_t *this, void *data)
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
ret = client_submit_vec_request (this, &req, frame, conf->fops,
|
||||
GFS3_OP_WRITE, client4_0_writev_cbk,
|
||||
args->vector, args->count,
|
||||
args->iobref,
|
||||
(xdrproc_t)xdr_gfx_write_req);
|
||||
ret = client_submit_request (this, &req, frame, conf->fops,
|
||||
GFS3_OP_WRITE, client4_0_writev_cbk,
|
||||
args->iobref, args->vector, args->count,
|
||||
NULL, 0, NULL,
|
||||
(xdrproc_t)xdr_gfx_write_req);
|
||||
if (ret) {
|
||||
/*
|
||||
* If the lower layers fail to submit a request, they'll also
|
||||
@ -5704,11 +5697,11 @@ client4_0_put (call_frame_t *frame, xlator_t *this, void *data)
|
||||
goto unwind;
|
||||
}
|
||||
|
||||
ret = client_submit_vec_request (this, &req, frame, conf->fops,
|
||||
GFS3_OP_PUT, client4_0_put_cbk,
|
||||
args->vector, args->count,
|
||||
args->iobref,
|
||||
(xdrproc_t)xdr_gfx_put_req);
|
||||
ret = client_submit_request (this, &req, frame, conf->fops,
|
||||
GFS3_OP_PUT, client4_0_put_cbk,
|
||||
args->iobref, args->vector, args->count,
|
||||
NULL, 0, NULL,
|
||||
(xdrproc_t)xdr_gfx_put_req);
|
||||
if (ret) {
|
||||
/*
|
||||
* If the lower layers fail to submit a request, they'll also
|
||||
|
@ -129,8 +129,8 @@ client_type_to_gf_type (short l_type)
|
||||
int
|
||||
client_submit_request (xlator_t *this, void *req, call_frame_t *frame,
|
||||
rpc_clnt_prog_t *prog, int procnum, fop_cbk_fn_t cbkfn,
|
||||
struct iobref *iobref, struct iovec *rsphdr,
|
||||
int rsphdr_count, struct iovec *rsp_payload,
|
||||
struct iobref *iobref, struct iovec *payload,
|
||||
int payloadcnt, struct iovec *rsp_payload,
|
||||
int rsp_payload_count, struct iobref *rsp_iobref,
|
||||
xdrproc_t xdrproc)
|
||||
{
|
||||
@ -169,7 +169,7 @@ client_submit_request (xlator_t *this, void *req, call_frame_t *frame,
|
||||
iobuf = iobuf_get2 (this->ctx->iobuf_pool, xdr_size);
|
||||
if (!iobuf) {
|
||||
goto out;
|
||||
};
|
||||
}
|
||||
|
||||
new_iobref = iobref_new ();
|
||||
if (!new_iobref) {
|
||||
@ -221,8 +221,9 @@ client_submit_request (xlator_t *this, void *req, call_frame_t *frame,
|
||||
|
||||
/* Send the msg */
|
||||
ret = rpc_clnt_submit (conf->rpc, prog, procnum, cbkfn, &iov, count,
|
||||
NULL, 0, new_iobref, frame, rsphdr, rsphdr_count,
|
||||
rsp_payload, rsp_payload_count, rsp_iobref);
|
||||
payload, payloadcnt, new_iobref, frame,
|
||||
payload, payloadcnt, rsp_payload,
|
||||
rsp_payload_count, rsp_iobref);
|
||||
|
||||
if (ret < 0) {
|
||||
gf_msg_debug (this->name, 0, "rpc_clnt_submit failed");
|
||||
@ -249,7 +250,7 @@ out:
|
||||
if (iobuf)
|
||||
iobuf_unref (iobuf);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user