[Ocfs2-tools-commits] jlbec commits r648 - in branches/usysfsify/libo2cb: . include

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Wed Mar 16 20:18:25 CST 2005


Author: jlbec
Date: 2005-03-16 20:18:23 -0600 (Wed, 16 Mar 2005)
New Revision: 648

Modified:
   branches/usysfsify/libo2cb/include/o2cb.h
   branches/usysfsify/libo2cb/include/o2cb_abi.h
   branches/usysfsify/libo2cb/o2cb_abi.c
   branches/usysfsify/libo2cb/o2cb_err.et.in
Log:

o Add heartbeat registration stuff.



Modified: branches/usysfsify/libo2cb/include/o2cb.h
===================================================================
--- branches/usysfsify/libo2cb/include/o2cb.h	2005-03-17 00:01:50 UTC (rev 647)
+++ branches/usysfsify/libo2cb/include/o2cb.h	2005-03-17 02:18:23 UTC (rev 648)
@@ -51,6 +51,13 @@
 errcode_t o2cb_add_node(const char *cluster_name,
 			const char *node_name, const char *node_num,
 			const char *ip_address, const char *ip_port);
-errcode_t o2cb_activate_networking(void);
 
+errcode_t o2cb_create_heartbeat_region_disk(const char *cluster_name,
+					    const char *region_name,
+					    const char *device_name,
+					    int block_bytes,
+					    uint64_t start_block,
+					    uint64_t blocks);
+
+
 #endif  /* _O2CB_H */

Modified: branches/usysfsify/libo2cb/include/o2cb_abi.h
===================================================================
--- branches/usysfsify/libo2cb/include/o2cb_abi.h	2005-03-17 00:01:50 UTC (rev 647)
+++ branches/usysfsify/libo2cb/include/o2cb_abi.h	2005-03-17 02:18:23 UTC (rev 648)
@@ -33,5 +33,7 @@
 #define O2CB_FORMAT_NODE		O2CB_FORMAT_NODE_DIR "/%s"
 #define O2CB_FORMAT_NODE_ATTR		O2CB_FORMAT_NODE "/%s"
 #define O2CB_FORMAT_HEARTBEAT_DIR	O2CB_FORMAT_CLUSTER "/heartbeat"
+#define O2CB_FORMAT_HEARTBEAT_REGION	O2CB_FORMAT_HEARTBEAT_DIR "/%s"
+#define O2CB_FORMAT_HEARTBEAT_REGION_ATTR	O2CB_FORMAT_HEARTBEAT_REGION "/%s"
 
 #endif  /* _O2CB_ABI_H */

Modified: branches/usysfsify/libo2cb/o2cb_abi.c
===================================================================
--- branches/usysfsify/libo2cb/o2cb_abi.c	2005-03-17 00:01:50 UTC (rev 647)
+++ branches/usysfsify/libo2cb/o2cb_abi.c	2005-03-17 02:18:23 UTC (rev 648)
@@ -87,29 +87,6 @@
 	return err;
 }
 
-
-static errcode_t write_thingy(const char *path, void *bytes, size_t len)
-{
-	int fd = -1;
-	errcode_t err = O2CB_ET_INTERNAL_FAILURE;
-	ssize_t ret;
-
-	fd = open(path, O_WRONLY);
-	if (fd < 0)
-		goto out;
-
-	ret = write(fd, bytes, len);
-	if (ret != len)
-		goto out;
-
-	err = 0;
-
-out:
-	if (fd >= 0)
-		close(fd);
-	return err;
-}
-
 static int do_read(int fd, void *bytes, size_t count)
 {
 	int total = 0;
@@ -318,3 +295,235 @@
 	return err;
 }
 
+static errcode_t o2cb_set_region_attribute(const char *cluster_name,
+					   const char *region_name,
+					   const char *attr_name,
+					   const char *attr_value)
+{
+	int ret;
+	errcode_t err = 0;
+	char attr_path[PATH_MAX];
+	int fd;
+
+	ret = snprintf(attr_path, PATH_MAX - 1,
+		       O2CB_FORMAT_HEARTBEAT_REGION_ATTR,
+		       cluster_name, region_name, attr_name);
+	if ((ret <= 0) || (ret == (PATH_MAX - 1)))
+		return O2CB_ET_INTERNAL_FAILURE;
+
+	fd = open(attr_path, O_WRONLY);
+	if (fd < 0) {
+		switch (errno) {
+			default:
+				err = O2CB_ET_INTERNAL_FAILURE;
+				break;
+
+			case ENOTDIR:
+			case ENOENT:
+			case EISDIR:
+				err = O2CB_ET_SERVICE_UNAVAILABLE;
+				break;
+
+			case EACCES:
+			case EPERM:
+			case EROFS:
+				err = O2CB_ET_PERMISSION_DENIED;
+				break;
+		}
+	} else {
+		err = do_write(fd, attr_value, strlen(attr_value));
+		close(fd);
+	}
+
+	return err;
+}
+
+static errcode_t o2cb_get_region_attribute(const char *cluster_name,
+					   const char *region_name,
+					   const char *attr_name,
+					   char *attr_value,
+					   size_t count)
+{
+	int ret;
+	errcode_t err = 0;
+	char attr_path[PATH_MAX];
+	int fd;
+
+	ret = snprintf(attr_path, PATH_MAX - 1,
+		       O2CB_FORMAT_HEARTBEAT_REGION_ATTR,
+		       cluster_name, region_name, attr_name);
+	if ((ret <= 0) || (ret == (PATH_MAX - 1)))
+		return O2CB_ET_INTERNAL_FAILURE;
+
+	fd = open(attr_path, O_RDONLY);
+	if (fd < 0) {
+		switch (errno) {
+			default:
+				err = O2CB_ET_INTERNAL_FAILURE;
+				break;
+
+			case ENOTDIR:
+			case ENOENT:
+			case EISDIR:
+				err = O2CB_ET_SERVICE_UNAVAILABLE;
+				break;
+
+			case EACCES:
+			case EPERM:
+			case EROFS:
+				err = O2CB_ET_PERMISSION_DENIED;
+				break;
+		}
+	} else {
+		ret = do_read(fd, attr_value, count);
+		close(fd);
+		if (ret == -EIO)
+			err = O2CB_ET_IO;
+		else if (ret < 0)
+			err = O2CB_ET_INTERNAL_FAILURE;
+		else if (ret < count)
+			attr_value[ret] = '\0';
+	}
+
+	return err;
+}
+
+errcode_t o2cb_create_heartbeat_region_disk(const char *cluster_name,
+					    const char *region_name,
+					    const char *device_name,
+					    int block_bytes,
+					    uint64_t start_block,
+					    uint64_t blocks)
+{
+	char region_path[PATH_MAX];
+	char num_buf[NAME_MAX];
+	int ret, fd;
+	errcode_t err;
+
+#define O2CB_MAXIMUM_HEARTBEAT_BLOCKSIZE 4096
+	if (block_bytes > O2CB_MAXIMUM_HEARTBEAT_BLOCKSIZE) {
+		err = O2CB_ET_INVALID_BLOCK_SIZE;
+		goto out;
+	}
+
+#define O2CB_MAX_NODE_COUNT 255
+	if (!blocks || (blocks > O2CB_MAX_NODE_COUNT)) {
+		err = O2CB_ET_INVALID_BLOCK_COUNT;
+		goto out;
+	}
+
+	ret = snprintf(region_path, PATH_MAX - 1,
+		       O2CB_FORMAT_HEARTBEAT_REGION,
+		       cluster_name, region_name);
+	if (ret <= 0 || ret == PATH_MAX - 1) {
+		err = O2CB_ET_INTERNAL_FAILURE;
+		goto out;
+	}
+
+	ret = mkdir(region_path,
+		    S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+	if (ret) {
+		switch (errno) {
+			case EEXIST:
+				err = O2CB_ET_REGION_EXISTS;
+				break;
+
+			case EACCES:
+			case EPERM:
+			case EROFS:
+				err = O2CB_ET_PERMISSION_DENIED;
+				break;
+
+			case ENOMEM:
+				err = O2CB_ET_NO_MEMORY;
+				break;
+
+			case ENOTDIR:
+			case ENOENT:
+				err = O2CB_ET_SERVICE_UNAVAILABLE;
+				break;
+
+			default:
+				err = O2CB_ET_INTERNAL_FAILURE;
+				break;
+		}
+
+		goto out;
+	}
+
+	ret = snprintf(num_buf, NAME_MAX - 1, "%d", block_bytes);
+	if (ret <= 0 || ret == PATH_MAX - 1) {
+		err = O2CB_ET_INTERNAL_FAILURE;
+		goto out_rmdir;
+	}
+
+	err = o2cb_set_region_attribute(cluster_name, region_name,
+					"block_bytes", num_buf);
+	if (err)
+		goto out_rmdir;
+
+	ret = snprintf(num_buf, NAME_MAX - 1, "%"PRIu64, start_block);
+	if (ret <= 0 || ret == PATH_MAX - 1) {
+		err = O2CB_ET_INTERNAL_FAILURE;
+		goto out_rmdir;
+	}
+
+	err = o2cb_set_region_attribute(cluster_name, region_name,
+					"start_block", num_buf);
+	if (err)
+		goto out_rmdir;
+
+	ret = snprintf(num_buf, NAME_MAX - 1, "%"PRIu64, blocks);
+	if (ret <= 0 || ret == PATH_MAX - 1) {
+		err = O2CB_ET_INTERNAL_FAILURE;
+		goto out_rmdir;
+	}
+
+	err = o2cb_set_region_attribute(cluster_name, region_name,
+					"blocks", num_buf);
+	if (err)
+		goto out_rmdir;
+
+	fd = open(device_name, O_RDWR);
+	if (fd < 0) {
+		switch (errno) {
+			default:
+				err = O2CB_ET_INTERNAL_FAILURE;
+				break;
+
+			case ENOTDIR:
+			case ENOENT:
+			case EISDIR:
+				err = O2CB_ET_SERVICE_UNAVAILABLE;
+				break;
+
+			case EACCES:
+			case EPERM:
+			case EROFS:
+				err = O2CB_ET_PERMISSION_DENIED;
+				break;
+		}
+
+		goto out_rmdir;
+	}
+
+	ret = snprintf(num_buf, NAME_MAX - 1, "%d", fd);
+	if (ret <= 0 || ret == PATH_MAX - 1) {
+		err = O2CB_ET_INTERNAL_FAILURE;
+		goto out_close;
+	}
+
+	err = o2cb_set_region_attribute(cluster_name, region_name,
+					"dev", num_buf);
+
+out_close:
+	close(fd);
+
+out_rmdir:
+	if (err)
+		rmdir(region_path);
+
+out:
+	return err;
+}
+

Modified: branches/usysfsify/libo2cb/o2cb_err.et.in
===================================================================
--- branches/usysfsify/libo2cb/o2cb_err.et.in	2005-03-17 00:01:50 UTC (rev 647)
+++ branches/usysfsify/libo2cb/o2cb_err.et.in	2005-03-17 02:18:23 UTC (rev 648)
@@ -48,4 +48,13 @@
 ec	O2CB_ET_NODE_EXISTS,
 	"Node already exists"
 
+ec	O2CB_ET_REGION_EXISTS,
+	"Heartbeat region already exists"
+
+ec	O2CB_ET_INVALID_BLOCK_SIZE,
+	"Block size is invalid"
+
+ec	O2CB_ET_INVALID_BLOCK_COUNT,
+	"Block count is invalid"
+
 	end



More information about the Ocfs2-tools-commits mailing list