[Ocfs2-tools-devel] [PATCH 26/39] o2cb: o2cb_list_clusters() for user stacks.

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


Add list_clusters functionality to the user stack in libo2cb.  Use it to
back join/leave in the mount path.  This is, of course, temporary to a
better API for querying the cluster info.

Signed-off-by: Joel Becker <joel.becker at oracle.com>
---
 libo2cb/o2cb_abi.c     |   73 ++++++++++++++++++++++++++++++++++++++++++++---
 ocfs2_controld/mount.c |   13 +++++---
 2 files changed, 76 insertions(+), 10 deletions(-)

diff --git a/libo2cb/o2cb_abi.c b/libo2cb/o2cb_abi.c
index 0851635..0a9bc3e 100644
--- a/libo2cb/o2cb_abi.c
+++ b/libo2cb/o2cb_abi.c
@@ -46,7 +46,8 @@
 #define OCFS2_STACK_LABEL_LEN	4
 
 
-struct o2cb_group_ops {
+struct o2cb_stack_ops {
+	errcode_t (*list_clusters)(char ***clusters);
 	errcode_t (*begin_group_join)(const char *cluster_name,
 				      struct o2cb_region_desc *desc);
 	errcode_t (*complete_group_join)(const char *cluster_name,
@@ -58,9 +59,10 @@ struct o2cb_group_ops {
 
 struct o2cb_stack {
 	char s_name[OCFS2_STACK_LABEL_LEN + 1];
-	struct o2cb_group_ops *s_ops;
+	struct o2cb_stack_ops *s_ops;
 };
 
+static errcode_t classic_list_clusters(char ***clusters);
 static errcode_t classic_begin_group_join(const char *cluster_name,
 					  struct o2cb_region_desc *desc);
 static errcode_t classic_complete_group_join(const char *cluster_name,
@@ -68,7 +70,8 @@ static errcode_t classic_complete_group_join(const char *cluster_name,
 					     int result);
 static errcode_t classic_group_leave(const char *cluster_name,
 				     struct o2cb_region_desc *desc);
-static struct o2cb_group_ops classic_ops = {
+static struct o2cb_stack_ops classic_ops = {
+	.list_clusters		= classic_list_clusters,
 	.begin_group_join	= classic_begin_group_join,
 	.complete_group_join	= classic_complete_group_join,
 	.group_leave		= classic_group_leave,
@@ -78,6 +81,7 @@ static struct o2cb_stack classic_stack = {
 	.s_ops		= &classic_ops,
 };
 
+static errcode_t user_list_clusters(char ***clusters);
 static errcode_t user_begin_group_join(const char *cluster_name,
 				       struct o2cb_region_desc *desc);
 static errcode_t user_complete_group_join(const char *cluster_name,
@@ -85,7 +89,8 @@ static errcode_t user_complete_group_join(const char *cluster_name,
 					  int result);
 static errcode_t user_group_leave(const char *cluster_name,
 				  struct o2cb_region_desc *desc);
-static struct o2cb_group_ops user_ops = {
+static struct o2cb_stack_ops user_ops = {
+	.list_clusters		= user_list_clusters,
 	.begin_group_join	= user_begin_group_join,
 	.complete_group_join	= user_complete_group_join,
 	.group_leave		= user_group_leave,
@@ -1662,7 +1667,7 @@ static void o2cb_free_dir_list(char **objs)
 	free(objs);
 }
 
-errcode_t o2cb_list_clusters(char ***clusters)
+static errcode_t classic_list_clusters(char ***clusters)
 {
 	char path[PATH_MAX];
 	errcode_t ret;
@@ -1678,6 +1683,64 @@ errcode_t o2cb_list_clusters(char ***clusters)
 	return o2cb_list_dir(path, clusters);
 }
 
+static errcode_t user_list_clusters(char ***clusters)
+{
+	errcode_t err = O2CB_ET_SERVICE_UNAVAILABLE;
+	int rc, fd = -1;
+	char buf[OCFS2_CONTROLD_MAXLINE];
+
+	rc = ocfs2_client_connect();
+	if (rc < 0) {
+		/* fprintf(stderr, "Unable to connect to ocfs2_controld: %s\n",
+			strerror(-rc)); */
+		switch (rc) {
+			case -EACCES:
+			case -EPERM:
+				err = O2CB_ET_PERMISSION_DENIED;
+				break;
+
+			default:
+				err = O2CB_ET_SERVICE_UNAVAILABLE;
+				break;
+		}
+		goto out;
+	}
+	fd = rc;
+
+	rc = send_message(fd, CM_LISTCLUSTERS);
+	if (rc) {
+		/* fprintf(stderr,
+			"Unable to send LISTCLUSTERS message: %s\n",
+			strerror(-rc)); */
+		err = O2CB_ET_IO;
+		goto out;
+	}
+
+	rc = receive_list(fd, buf, clusters);
+	if (rc) {
+		/* fprintf(stderr, "Error reading from daemon: %s\n",
+			strerror(-rc)); */
+		err = O2CB_ET_IO;
+		goto out;
+	}
+
+	err = 0;
+
+out:
+	if (fd != -1)
+		close(fd);
+
+	return err;
+}
+
+errcode_t o2cb_list_clusters(char ***clusters)
+{
+	if (!current_stack)
+		return O2CB_ET_SERVICE_UNAVAILABLE;
+
+	return current_stack->s_ops->list_clusters(clusters);
+}
+
 void o2cb_free_cluster_list(char **clusters)
 {
 	o2cb_free_dir_list(clusters);
diff --git a/ocfs2_controld/mount.c b/ocfs2_controld/mount.c
index 7f0ece2..88343c5 100644
--- a/ocfs2_controld/mount.c
+++ b/ocfs2_controld/mount.c
@@ -29,6 +29,9 @@
 
 #include "ocfs2_controld.h"
 
+/* OCFS2_VOL_UUID_LEN is in bytes.  The hex string representation uses
+ * two characters per byte */
+#define OCFS2_UUID_STR_LEN	(OCFS2_VOL_UUID_LEN * 2)
 
 struct mountpoint {
 	struct list_head	mp_list;
@@ -40,7 +43,7 @@ struct mountgroup {
 	struct cgroup		*mg_group;
 	int			mg_leave_on_join;
 
-	char			mg_uuid[OCFS2_VOL_UUID_LEN + 1];
+	char			mg_uuid[OCFS2_UUID_STR_LEN + 1];
 	char			mg_device[PATH_MAX + 1];
 
 	struct list_head	mg_mountpoints;
@@ -120,7 +123,7 @@ static struct mountgroup *create_mg(const char *uuid, const char *device)
 {
 	struct mountgroup *mg = NULL;
 
-	if (strlen(uuid) > OCFS2_VOL_UUID_LEN) {
+	if (strlen(uuid) > OCFS2_UUID_STR_LEN) {
 		log_error("uuid too long!");
 		goto out;
 	}
@@ -468,7 +471,7 @@ int start_mount(int ci, int fd, const char *uuid, const char *device,
 	log_debug("start_mount: uuid \"%s\", device \"%s\", mountpoint \"%s\"",
 		  uuid, device, mountpoint);
 
-	if (strlen(uuid) > OCFS2_VOL_UUID_LEN) {
+	if (strlen(uuid) > OCFS2_UUID_STR_LEN) {
 		fill_error(mg, ENAMETOOLONG, "UUID too long: %s", uuid);
 		goto out;
 	}
@@ -578,7 +581,7 @@ int complete_mount(int ci, int fd, const char *uuid, const char *errcode,
 		goto out;
 	}
 
-	if (strlen(uuid) > OCFS2_VOL_UUID_LEN) {
+	if (strlen(uuid) > OCFS2_UUID_STR_LEN) {
 		fill_error(mg, EINVAL,
 			   "UUID too long: %s", uuid);
 		goto out;
@@ -675,7 +678,7 @@ int remove_mount(int ci, int fd, const char *uuid, const char *mountpoint)
 	log_debug("remove_mount: uuid \"%s\", mountpoint \"%s\"",
 		  uuid, mountpoint);
 
-	if (strlen(uuid) > OCFS2_VOL_UUID_LEN) {
+	if (strlen(uuid) > OCFS2_UUID_STR_LEN) {
 		fill_error(&mg_error, ENAMETOOLONG, "UUID too long: %s",
 			   uuid);
 		goto out;
-- 
1.5.3.8




More information about the Ocfs2-tools-devel mailing list