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
This commit is contained in:
Raghavendra G 2010-10-08 20:21:59 +00:00 committed by Vijay Bellur
parent 0ccb63dbc5
commit d1f938c16e

View File

@ -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;
}
}