diff options
| author | Shehjar Tikoo <shehjart@gluster.com> | 2010-05-07 01:53:10 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2010-05-08 06:37:38 -0700 | 
| commit | 79f8c310dfa52c035e41e46daa25ccf0419bea27 (patch) | |
| tree | bf463524f3aca4488d7f53fbee322b9612c62eb5 /xlators/nfs | |
| parent | c1f052da3652595effee1e514b1e9fb9055e13a1 (diff) | |
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 <shehjart@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 902 (iozone hangs during random read throughput test)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=902
Diffstat (limited to 'xlators/nfs')
| -rw-r--r-- | xlators/nfs/lib/src/rpcsvc.c | 27 | ||||
| -rw-r--r-- | xlators/nfs/lib/src/rpcsvc.h | 4 | 
2 files changed, 30 insertions, 1 deletions
diff --git a/xlators/nfs/lib/src/rpcsvc.c b/xlators/nfs/lib/src/rpcsvc.c index bcb8af65241..4ea008b882c 100644 --- a/xlators/nfs/lib/src/rpcsvc.c +++ b/xlators/nfs/lib/src/rpcsvc.c @@ -1647,6 +1647,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)  {          int                     ret = -1; diff --git a/xlators/nfs/lib/src/rpcsvc.h b/xlators/nfs/lib/src/rpcsvc.h index 6e6dc9bc95b..cea55746c90 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);  | 
