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);
+ }
}
}