summaryrefslogtreecommitdiffstats
path: root/xlators/mgmt/glusterd/src/glusterd-utils.c
diff options
context:
space:
mode:
authorKrishnan Parthasarathi <kparthas@redhat.com>2015-05-20 18:23:58 +0530
committerVijay Bellur <vbellur@redhat.com>2015-05-30 07:05:06 -0700
commit0308c7a2800f52810093af780c42b6c6616c2aed (patch)
tree11912e3a54a35e2d9d01f96622da68667c819ef2 /xlators/mgmt/glusterd/src/glusterd-utils.c
parentaf7e88ad4a3a1cd0b965fdbadb59c923e98550bc (diff)
glusterd: fix double-free of rebalance process' rpc object
Change-Id: I0c79c4de47a160b1ecf3a8994eedc02e3f5002a9 BUG: 1225318 Signed-off-by: Krishnan Parthasarathi <kparthas@redhat.com> Reviewed-on: http://review.gluster.org/10872 Reviewed-by: Atin Mukherjee <amukherj@redhat.com> Reviewed-by: Kaushal M <kaushal@redhat.com> Reviewed-on: http://review.gluster.org/10932 Tested-by: NetBSD Build System Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c')
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c57
1 files changed, 54 insertions, 3 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index deb0123c435..1c2299db016 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -3677,8 +3677,9 @@ gd_check_and_update_rebalance_info (glusterd_volinfo_t *old_volinfo,
new = &(new_volinfo->rebal);
//Disconnect from rebalance process
- if (old->defrag && old->defrag->rpc) {
+ if (glusterd_defrag_rpc_get (old->defrag)) {
rpc_transport_disconnect (old->defrag->rpc->conn.trans);
+ glusterd_defrag_rpc_put (old->defrag);
}
if (!gf_uuid_is_null (old->rebalance_id) &&
@@ -3960,6 +3961,39 @@ out:
}
struct rpc_clnt*
+glusterd_defrag_rpc_get (glusterd_defrag_info_t *defrag)
+{
+ struct rpc_clnt *rpc = NULL;
+
+ if (!defrag)
+ return NULL;
+
+ LOCK (&defrag->lock);
+ {
+ rpc = rpc_clnt_ref (defrag->rpc);
+ }
+ UNLOCK (&defrag->lock);
+ return rpc;
+}
+
+struct rpc_clnt*
+glusterd_defrag_rpc_put (glusterd_defrag_info_t *defrag)
+{
+ struct rpc_clnt *rpc = NULL;
+
+ if (!defrag)
+ return NULL;
+
+ LOCK (&defrag->lock);
+ {
+ rpc = rpc_clnt_unref (defrag->rpc);
+ defrag->rpc = rpc;
+ }
+ UNLOCK (&defrag->lock);
+ return rpc;
+}
+
+struct rpc_clnt*
glusterd_pending_node_get_rpc (glusterd_pending_node_t *pending_node)
{
struct rpc_clnt *rpc = NULL;
@@ -3981,8 +4015,8 @@ glusterd_pending_node_get_rpc (glusterd_pending_node_t *pending_node)
rpc = svc->conn.rpc;
} else if (pending_node->type == GD_NODE_REBALANCE) {
volinfo = pending_node->node;
- if (volinfo->rebal.defrag)
- rpc = volinfo->rebal.defrag->rpc;
+ rpc = glusterd_defrag_rpc_get (volinfo->rebal.defrag);
+
} else if (pending_node->type == GD_NODE_SNAPD) {
volinfo = pending_node->node;
rpc = volinfo->snapd.svc.conn.rpc;
@@ -3994,6 +4028,23 @@ out:
return rpc;
}
+void
+glusterd_pending_node_put_rpc (glusterd_pending_node_t *pending_node)
+{
+ glusterd_volinfo_t *volinfo = NULL;
+
+ switch (pending_node->type) {
+ case GD_NODE_REBALANCE:
+ volinfo = pending_node->node;
+ glusterd_defrag_rpc_put (volinfo->rebal.defrag);
+ break;
+
+ default:
+ break;
+ }
+
+}
+
int32_t
glusterd_unlink_file (char *sockfpath)
{