summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronniesahlberg@gmail.com>2012-02-27 07:18:19 +1100
committerRonnie Sahlberg <ronniesahlberg@gmail.com>2012-02-27 07:21:26 +1100
commit91c9371f2dcae686527c73d4812ade3de63483c4 (patch)
tree6df5c37555db2a7e48b94a381acc9b610ae67a2f
parent93ec9c589c55edfed1a04ceb2217108ceb690089 (diff)
downloadsamba-91c9371f2dcae686527c73d4812ade3de63483c4.tar.gz
samba-91c9371f2dcae686527c73d4812ade3de63483c4.tar.xz
samba-91c9371f2dcae686527c73d4812ade3de63483c4.zip
Make KILLTCP structure a child of VNN so that it is freed at the same time
the referenced VNN structure is. Also, remove the circular reference between the two objects KIPPCTP and VNN (This used to be ctdb commit 02b62482164a3c69715949074feb7f191a29d534)
-rw-r--r--ctdb/server/ctdb_takeover.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/ctdb/server/ctdb_takeover.c b/ctdb/server/ctdb_takeover.c
index 830b751b03..c91d2f7de5 100644
--- a/ctdb/server/ctdb_takeover.c
+++ b/ctdb/server/ctdb_takeover.c
@@ -2934,9 +2934,25 @@ static void ctdb_tickle_sentenced_connections(struct event_context *ev, struct t
*/
static int ctdb_killtcp_destructor(struct ctdb_kill_tcp *killtcp)
{
- if (killtcp->vnn) {
- killtcp->vnn->killtcp = NULL;
+ struct ctdb_vnn *tmpvnn;
+
+ /* verify that this vnn is still active */
+ for (tmpvnn = killtcp->ctdb->vnn; tmpvnn; tmpvnn = tmpvnn->next) {
+ if (tmpvnn == killtcp->vnn) {
+ break;
+ }
+ }
+
+ if (tmpvnn == NULL) {
+ return 0;
}
+
+ if (killtcp->vnn->killtcp != killtcp) {
+ return 0;
+ }
+
+ killtcp->vnn->killtcp = NULL;
+
return 0;
}
@@ -2991,7 +3007,7 @@ static int ctdb_killtcp_add_connection(struct ctdb_context *ctdb,
a new structure
*/
if (killtcp == NULL) {
- killtcp = talloc_zero(ctdb, struct ctdb_kill_tcp);
+ killtcp = talloc_zero(vnn, struct ctdb_kill_tcp);
CTDB_NO_MEMORY(ctdb, killtcp);
killtcp->vnn = vnn;