diff options
| author | Raghavendra G <raghavendra@gluster.com> | 2010-10-08 20:21:59 +0000 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-10-09 06:36:58 -0700 | 
| commit | d1f938c16e309431382ab9aaa32d50bf0ccd3260 (patch) | |
| tree | 79e56063ab268acb8c2ba84057d3a94280677a84 | |
| parent | 0ccb63dbc52f66975205baf8452d2b57418da4aa (diff) | |
rpc-transport/rdma: fix the bug which was causing an ioq-entry being mem_put twice.
- in case of failure to send message, ioq-entry would be freed, but it used to
    get added to the ioq-list. Failure in sending a message (for reasons
    other than insufficient quota), would result in transport being
    disconnected. In the process of handling pollerr, when ioq-list is flushed,
    the same ioq-entry which would've already been freed, would be freed for
    second time.
  - this patch also fixes spurious disconnects happening when quota was not
    available while sending a request.
Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1854 (GlusterFS 3.1 beta crashes over Infiniband with rdma issue)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1854
| -rw-r--r-- | rpc/rpc-transport/rdma/src/rdma.c | 4 | 
1 files changed, 3 insertions, 1 deletions
diff --git a/rpc/rpc-transport/rdma/src/rdma.c b/rpc/rpc-transport/rdma/src/rdma.c index 00664963c39..30f77f33128 100644 --- a/rpc/rpc-transport/rdma/src/rdma.c +++ b/rpc/rpc-transport/rdma/src/rdma.c @@ -1682,6 +1682,8 @@ __rdma_ioq_churn_entry (rdma_peer_t *peer, rdma_ioq_t *entry)                  if (ret != 0) {                          __rdma_ioq_entry_free (entry);                  } +        } else { +                ret = 0;          }  out: @@ -1740,7 +1742,7 @@ rdma_writev (rpc_transport_t *this,                  peer = &priv->peer;                  if (list_empty (&peer->ioq)) {                          ret = __rdma_ioq_churn_entry (peer, entry); -                        if (ret > 0) { +                        if (ret != 0) {                                  need_append = 0;                          }                  }  | 
