Blob Blame History Raw
commit dde47a0eca301ca97dbe03fc9a1f6328e3b127a3
Author: Andrew Beekhof <andrew@beekhof.net>
Date:   Mon Sep 23 09:23:45 2013 +1000

    Fix: Fencing: Observe pcmk_host_list during automatic unfencing

diff --git a/fencing/commands.c b/fencing/commands.c
index 73a7fc1..7d04952 100644
--- a/fencing/commands.c
+++ b/fencing/commands.c
@@ -665,7 +665,7 @@ schedule_internal_command(const char *origin,
     schedule_stonith_command(cmd, device);
 }
 
-static gboolean
+gboolean
 string_in_list(GListPtr list, const char *item)
 {
     int lpc = 0;
diff --git a/fencing/internal.h b/fencing/internal.h
index 9a8b096..11a8c58 100644
--- a/fencing/internal.h
+++ b/fencing/internal.h
@@ -164,6 +164,8 @@ int stonith_manual_ack(xmlNode * msg, remote_fencing_op_t * op);
 
 void unfence_cb(GPid pid, int rc, const char *output, gpointer user_data);
 
+gboolean string_in_list(GListPtr list, const char *item);
+
 void
 schedule_internal_command(const char *origin,
                           stonith_device_t * device,
diff --git a/fencing/main.c b/fencing/main.c
index 6401f2f..a90c43b 100644
--- a/fencing/main.c
+++ b/fencing/main.c
@@ -669,12 +669,24 @@ static void cib_device_update(resource_t *rsc, pe_working_set_t *data_set)
         if(have_fence_scsi == FALSE && safe_str_eq(agent, "fence_scsi")) {
             stonith_device_t *device = g_hash_table_lookup(device_list, rsc->id);
 
-            if(device) {
-                have_fence_scsi = TRUE;
-                crm_notice("Unfencing ourselves with %s (%s)", agent, device->id);
-                schedule_internal_command(__FUNCTION__, device, "on", stonith_our_uname, 0, NULL, unfence_cb);
+            if(stonith_our_uname == NULL) {
+                crm_trace("Cannot unfence ourselves: no local host name");
+
+            } else if(device == NULL) {
+                crm_err("Cannot unfence ourselves: no such device '%s'", rsc->id);
+
             } else {
-                crm_err("Device %s does not exist", rsc->id);
+                const char *alias = g_hash_table_lookup(device->aliases, stonith_our_uname);
+
+                if (!alias) {
+                    alias = stonith_our_uname;
+                }
+
+                if (device->targets && string_in_list(device->targets, alias)) {
+                    have_fence_scsi = TRUE;
+                    crm_notice("Unfencing ourselves with %s (%s)", agent, device->id);
+                    schedule_internal_command(__FUNCTION__, device, "on", stonith_our_uname, 0, NULL, unfence_cb);
+                }
             }
         }