[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