[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