From 79f8c310dfa52c035e41e46daa25ccf0419bea27 Mon Sep 17 00:00:00 2001 From: Shehjar Tikoo Date: Fri, 7 May 2010 01:53:10 +0000 Subject: rpcsvc: Support multiple vectors during reply submission RPC reply path allows attaching a single iovec to a reply. This limits the replies for certain program ops which need to return multiple vectors for eg, the NFSv3 read reply. Signed-off-by: Shehjar Tikoo Signed-off-by: Anand V. Avati BUG: 902 (iozone hangs during random read throughput test) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=902 --- xlators/nfs/lib/src/rpcsvc.c | 27 +++++++++++++++++++++++++++ xlators/nfs/lib/src/rpcsvc.h | 4 +++- 2 files changed, 30 insertions(+), 1 deletion(-) (limited to 'xlators/nfs/lib') diff --git a/xlators/nfs/lib/src/rpcsvc.c b/xlators/nfs/lib/src/rpcsvc.c index bcb8af652..4ea008b88 100644 --- a/xlators/nfs/lib/src/rpcsvc.c +++ b/xlators/nfs/lib/src/rpcsvc.c @@ -1646,6 +1646,33 @@ rpcsvc_request_attach_vector (rpcsvc_request_t *req, struct iovec msgvec, } +int +rpcsvc_request_attach_vectors (rpcsvc_request_t *req, struct iovec *payload, + int vcount, struct iobref *piobref) +{ + int c = 0; + int ret = -1; + + for (;c < (vcount-1); c++) { + ret = rpcsvc_request_attach_vector (req, payload[c], NULL, + piobref, 0); + if (ret < 0) { + gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to attach " + "vector"); + goto out; + } + } + + ret = rpcsvc_request_attach_vector (req, payload[vcount-1], NULL, + piobref, 1); + if (ret < 0) + gf_log (GF_RPCSVC, GF_LOG_ERROR, "Failed to attach final vec"); + +out: + return ret; +} + + int rpcsvc_submit_vectors (rpcsvc_request_t *req) { diff --git a/xlators/nfs/lib/src/rpcsvc.h b/xlators/nfs/lib/src/rpcsvc.h index 6e6dc9bc9..cea55746c 100644 --- a/xlators/nfs/lib/src/rpcsvc.h +++ b/xlators/nfs/lib/src/rpcsvc.h @@ -643,7 +643,9 @@ extern int rpcsvc_submit_vectors (rpcsvc_request_t *req); extern int rpcsvc_request_attach_vector (rpcsvc_request_t *req, struct iovec msgvec, struct iobuf *iob, struct iobref *ioref, int finalvector); - +extern int +rpcsvc_request_attach_vectors (rpcsvc_request_t *req, struct iovec *payload, + int vcount, struct iobref *piobref); typedef int (*auth_init_conn) (rpcsvc_conn_t *conn, void *priv); typedef int (*auth_init_request) (rpcsvc_request_t *req, void *priv); -- cgit