Update the delip command
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Thu, 28 Jul 2011 22:41:35 +0000 (08:41 +1000)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Thu, 28 Jul 2011 22:45:18 +0000 (08:45 +1000)
Dont talloc_free(vnn) immediately but postphone it until later when
the eventscript callback has completed.

CQ S1026664

server/ctdb_takeover.c

index bed2ab9f670a718a8b623c0119a339a29c8fc4c1..bb9f05ca4e4e9b473abb9ee2e9e5185978d8c673 100644 (file)
@@ -2875,12 +2875,16 @@ int32_t ctdb_control_del_public_address(struct ctdb_context *ctdb, TDB_DATA inda
                        TALLOC_CTX *mem_ctx;
 
                        DLIST_REMOVE(ctdb->vnn, vnn);
-                       if (vnn->iface == NULL) {
+                       if (vnn->iface != NULL) {
+                               ctdb_vnn_unassign_iface(ctdb, vnn);
+                       }
+                       if (vnn->pnn != ctdb->pnn) {
                                talloc_free(vnn);
                                return 0;
                        }
 
                        mem_ctx = talloc_new(ctdb);
+                       talloc_steal(mem_ctx, vnn);
                        ret = ctdb_event_script_callback(ctdb, 
                                         mem_ctx, delete_ip_callback, mem_ctx,
                                         false,
@@ -2889,8 +2893,6 @@ int32_t ctdb_control_del_public_address(struct ctdb_context *ctdb, TDB_DATA inda
                                         ctdb_vnn_iface_string(vnn),
                                         ctdb_addr_to_str(&vnn->public_address),
                                         vnn->public_netmask_bits);
-                       ctdb_vnn_unassign_iface(ctdb, vnn);
-                       talloc_free(vnn);
                        if (ret != 0) {
                                return -1;
                        }