[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