diff options
author | Krishnan Parthasarathi <kparthas@redhat.com> | 2015-05-20 18:23:58 +0530 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2015-05-30 07:05:06 -0700 |
commit | 0308c7a2800f52810093af780c42b6c6616c2aed (patch) | |
tree | 11912e3a54a35e2d9d01f96622da68667c819ef2 /xlators/mgmt/glusterd/src/glusterd-utils.c | |
parent | af7e88ad4a3a1cd0b965fdbadb59c923e98550bc (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.c | 57 |
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) { |