From d1f938c16e309431382ab9aaa32d50bf0ccd3260 Mon Sep 17 00:00:00 2001 From: Raghavendra G Date: Fri, 8 Oct 2010 20:21:59 +0000 Subject: 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 Signed-off-by: Vijay Bellur 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 --- rpc/rpc-transport/rdma/src/rdma.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'rpc') 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; } } -- cgit