|
@@ -35,6 +35,10 @@
|
|
|
* cluster references throughout where nodes are looked up */
|
|
|
struct o2nm_cluster *o2nm_single_cluster = NULL;
|
|
|
|
|
|
+char *o2nm_fence_method_desc[O2NM_FENCE_METHODS] = {
|
|
|
+ "reset", /* O2NM_FENCE_RESET */
|
|
|
+ "panic", /* O2NM_FENCE_PANIC */
|
|
|
+};
|
|
|
|
|
|
struct o2nm_node *o2nm_get_node_by_num(u8 node_num)
|
|
|
{
|
|
@@ -579,6 +583,43 @@ static ssize_t o2nm_cluster_attr_reconnect_delay_ms_write(
|
|
|
return o2nm_cluster_attr_write(page, count,
|
|
|
&cluster->cl_reconnect_delay_ms);
|
|
|
}
|
|
|
+
|
|
|
+static ssize_t o2nm_cluster_attr_fence_method_read(
|
|
|
+ struct o2nm_cluster *cluster, char *page)
|
|
|
+{
|
|
|
+ ssize_t ret = 0;
|
|
|
+
|
|
|
+ if (cluster)
|
|
|
+ ret = sprintf(page, "%s\n",
|
|
|
+ o2nm_fence_method_desc[cluster->cl_fence_method]);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t o2nm_cluster_attr_fence_method_write(
|
|
|
+ struct o2nm_cluster *cluster, const char *page, size_t count)
|
|
|
+{
|
|
|
+ unsigned int i;
|
|
|
+
|
|
|
+ if (page[count - 1] != '\n')
|
|
|
+ goto bail;
|
|
|
+
|
|
|
+ for (i = 0; i < O2NM_FENCE_METHODS; ++i) {
|
|
|
+ if (count != strlen(o2nm_fence_method_desc[i]) + 1)
|
|
|
+ continue;
|
|
|
+ if (strncasecmp(page, o2nm_fence_method_desc[i], count - 1))
|
|
|
+ continue;
|
|
|
+ if (cluster->cl_fence_method != i) {
|
|
|
+ printk(KERN_INFO "ocfs2: Changing fence method to %s\n",
|
|
|
+ o2nm_fence_method_desc[i]);
|
|
|
+ cluster->cl_fence_method = i;
|
|
|
+ }
|
|
|
+ return count;
|
|
|
+ }
|
|
|
+
|
|
|
+bail:
|
|
|
+ return -EINVAL;
|
|
|
+}
|
|
|
+
|
|
|
static struct o2nm_cluster_attribute o2nm_cluster_attr_idle_timeout_ms = {
|
|
|
.attr = { .ca_owner = THIS_MODULE,
|
|
|
.ca_name = "idle_timeout_ms",
|
|
@@ -603,10 +644,19 @@ static struct o2nm_cluster_attribute o2nm_cluster_attr_reconnect_delay_ms = {
|
|
|
.store = o2nm_cluster_attr_reconnect_delay_ms_write,
|
|
|
};
|
|
|
|
|
|
+static struct o2nm_cluster_attribute o2nm_cluster_attr_fence_method = {
|
|
|
+ .attr = { .ca_owner = THIS_MODULE,
|
|
|
+ .ca_name = "fence_method",
|
|
|
+ .ca_mode = S_IRUGO | S_IWUSR },
|
|
|
+ .show = o2nm_cluster_attr_fence_method_read,
|
|
|
+ .store = o2nm_cluster_attr_fence_method_write,
|
|
|
+};
|
|
|
+
|
|
|
static struct configfs_attribute *o2nm_cluster_attrs[] = {
|
|
|
&o2nm_cluster_attr_idle_timeout_ms.attr,
|
|
|
&o2nm_cluster_attr_keepalive_delay_ms.attr,
|
|
|
&o2nm_cluster_attr_reconnect_delay_ms.attr,
|
|
|
+ &o2nm_cluster_attr_fence_method.attr,
|
|
|
NULL,
|
|
|
};
|
|
|
static ssize_t o2nm_cluster_show(struct config_item *item,
|
|
@@ -778,6 +828,7 @@ static struct config_group *o2nm_cluster_group_make_group(struct config_group *g
|
|
|
cluster->cl_reconnect_delay_ms = O2NET_RECONNECT_DELAY_MS_DEFAULT;
|
|
|
cluster->cl_idle_timeout_ms = O2NET_IDLE_TIMEOUT_MS_DEFAULT;
|
|
|
cluster->cl_keepalive_delay_ms = O2NET_KEEPALIVE_DELAY_MS_DEFAULT;
|
|
|
+ cluster->cl_fence_method = O2NM_FENCE_RESET;
|
|
|
|
|
|
ret = &cluster->cl_group;
|
|
|
o2nm_single_cluster = cluster;
|