[Ocfs2-tools-devel] [PATCH 33/39] o2cb: Provide the o2cb_control_node_down() API.

Joel Becker joel.becker at oracle.com
Fri Mar 14 16:52:56 PDT 2008


The o2cb_control_node_down() function passes node death through to the
ocfs2_control device.  Thus, ocfs2_controld can now tell the kernel to
start recovery.

Signed-off-by: Joel Becker <joel.becker at oracle.com>
---
 include/o2cb/o2cb.h    |    1 +
 libo2cb/o2cb_abi.c     |   21 +++++++++++++++++++++
 ocfs2_controld/mount.c |    7 ++++++-
 3 files changed, 28 insertions(+), 1 deletions(-)

diff --git a/include/o2cb/o2cb.h b/include/o2cb/o2cb.h
index 9373f0c..cc465d1 100644
--- a/include/o2cb/o2cb.h
+++ b/include/o2cb/o2cb.h
@@ -115,6 +115,7 @@ errcode_t o2cb_get_node_num(const char *cluster_name,
 
 errcode_t o2cb_control_open(unsigned int this_node);
 void o2cb_control_close(void);
+errcode_t o2cb_control_node_down(const char *uuid, unsigned int nodeid);
 
 errcode_t o2cb_get_hb_ctl_path(char *buf, int count);
 
diff --git a/libo2cb/o2cb_abi.c b/libo2cb/o2cb_abi.c
index 65383db..d6f7b3f 100644
--- a/libo2cb/o2cb_abi.c
+++ b/libo2cb/o2cb_abi.c
@@ -1876,6 +1876,8 @@ errcode_t o2cb_get_node_num(const char *cluster_name, const char *node_name,
 #define OCFS2_CONTROL_PROTO_LEN			4
 #define OCFS2_CONTROL_MESSAGE_SETNODE_OP	"SETN"
 #define OCFS2_CONTROL_MESSAGE_SETNODE_TOTAL_LEN	14
+#define OCFS2_CONTROL_MESSAGE_DOWN_OP		"DOWN"
+#define OCFS2_CONTROL_MESSAGE_DOWN_TOTAL_LEN	47
 #define OCFS2_CONTROL_MESSAGE_NODENUM_LEN	8
 static errcode_t o2cb_control_handshake(unsigned int this_node)
 {
@@ -1983,6 +1985,25 @@ void o2cb_control_close(void)
 	}
 }
 
+errcode_t o2cb_control_node_down(const char *uuid, unsigned int nodeid)
+{
+	errcode_t err = 0;
+	size_t ret;
+	char buf[OCFS2_CONTROL_MESSAGE_DOWN_TOTAL_LEN + 1];
+
+	if (control_device_fd == -1)
+		return O2CB_ET_INTERNAL_FAILURE;
+
+	snprintf(buf, OCFS2_CONTROL_MESSAGE_DOWN_TOTAL_LEN + 1,
+		 "DOWN %.32s %08X\n", uuid, nodeid);
+	ret = write(control_device_fd, buf,
+		    OCFS2_CONTROL_MESSAGE_DOWN_TOTAL_LEN);
+	if (ret != OCFS2_CONTROL_MESSAGE_DOWN_TOTAL_LEN)
+		err = O2CB_ET_IO;
+
+	return err;
+}
+
 errcode_t o2cb_get_hb_ctl_path(char *buf, int count)
 {
 	int fd;
diff --git a/ocfs2_controld/mount.c b/ocfs2_controld/mount.c
index 88343c5..6a5eeb1 100644
--- a/ocfs2_controld/mount.c
+++ b/ocfs2_controld/mount.c
@@ -25,6 +25,7 @@
 #include "ocfs2-kernel/kernel-list.h"
 #include "ocfs2-kernel/sparse_endian_types.h"
 #include "ocfs2-kernel/ocfs2_fs.h"
+#include "o2cb/o2cb.h"
 #include "o2cb/o2cb_client_proto.h"
 
 #include "ocfs2_controld.h"
@@ -344,10 +345,14 @@ static void finish_join(struct mountgroup *mg, struct cgroup *cg)
 static void mount_node_down(int nodeid, void *user_data)
 {
 	struct mountgroup *mg = user_data;
+	errcode_t err;
 
 	log_debug("Node %d has left mountgroup %s", nodeid, mg->mg_uuid);
 
-	/* XXX Write to sysfs */
+	err = o2cb_control_node_down(mg->mg_uuid, nodeid);
+	if (err)
+		log_debug("%s while trying to send DOWN message",
+			  error_message(err));
 }
 
 static void force_node_down(int nodeid, void *user_data)
-- 
1.5.3.8




More information about the Ocfs2-tools-devel mailing list