Blob Blame History Raw
commit 5cc40550ed6f385eb25042b1ab14339a760de1e8
Author: David Vossel <dvossel@redhat.com>
Date:   Thu Oct 17 20:34:48 2013 -0500

    Fix: fencing: Deep copy current topology level list on remote op
    
    (cherry picked from commit ef29a502e0e0506fd52fc60e51e06ffd6c375f4a)

diff --git a/fencing/internal.h b/fencing/internal.h
index 11a8c58..da510c3 100644
--- a/fencing/internal.h
+++ b/fencing/internal.h
@@ -105,6 +105,8 @@ typedef struct remote_fencing_op_s {
     /*! The current topology level being executed */
     guint level;
     /*! The device list of all the devices at the current executing topology level. */
+    GListPtr devices_list;
+    /*! Current entry in the topology device list */
     GListPtr devices;
 
     /*! List of duplicate operations attached to this operation. Once this operation
diff --git a/fencing/remote.c b/fencing/remote.c
index af4fb9e..8c8df6d 100644
--- a/fencing/remote.c
+++ b/fencing/remote.c
@@ -124,6 +124,10 @@ free_remote_op(gpointer data)
         free_xml(op->request);
         op->request = NULL;
     }
+    if (op->devices_list) {
+        g_list_free_full(op->devices_list, free);
+        op->devices_list = NULL;
+    }
     free(op);
 }
 
@@ -391,6 +395,22 @@ topology_is_empty(stonith_topology_t *tp)
     return TRUE;
 }
 
+/* deep copy the device list */
+static void
+set_op_device_list(remote_fencing_op_t * op, GListPtr devices)
+{
+    GListPtr lpc = NULL;
+
+    if (op->devices_list) {
+        g_list_free_full(op->devices_list, free);
+        op->devices_list = NULL;
+    }
+    for (lpc = devices; lpc != NULL; lpc = lpc->next) {
+        op->devices_list = g_list_append(op->devices_list, strdup(lpc->data));
+    }
+    op->devices = op->devices_list;
+}
+
 static int
 stonith_topology_next(remote_fencing_op_t * op)
 {
@@ -415,7 +435,7 @@ stonith_topology_next(remote_fencing_op_t * op)
         crm_trace("Attempting fencing level %d for %s (%d devices) - %s@%s.%.8s",
                   op->level, op->target, g_list_length(tp->levels[op->level]),
                   op->client_name, op->originator, op->id);
-        op->devices = tp->levels[op->level];
+        set_op_device_list(op, tp->levels[op->level]);
         return pcmk_ok;
     }