[Ocfs2-tools-commits] jlbec commits r1111 - in trunk: libo2cb libo2cb/include vendor/common

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Sat Nov 5 16:56:29 CST 2005


Author: jlbec
Date: 2005-11-05 16:56:27 -0600 (Sat, 05 Nov 2005)
New Revision: 1111

Modified:
   trunk/libo2cb/include/o2cb_abi.h
   trunk/libo2cb/o2cb_abi.c
   trunk/vendor/common/o2cb.init
Log:

o Teach o2cb.init to determine /sys/kernel/config vs /config
o Teach libo2cb the same.



Modified: trunk/libo2cb/include/o2cb_abi.h
===================================================================
--- trunk/libo2cb/include/o2cb_abi.h	2005-11-03 04:19:04 UTC (rev 1110)
+++ trunk/libo2cb/include/o2cb_abi.h	2005-11-05 22:56:27 UTC (rev 1111)
@@ -25,9 +25,13 @@
 #ifndef _O2CB_ABI_H
 #define _O2CB_ABI_H
 
-#define CONFIGFS_PATH "/config"
+/*
+ * The latest place is /sys/kernel/config, but older O2CB put it
+ * at /config.  So, libo2cb has to handle detection
+ */
+#define CONFIGFS_FORMAT_PATH "%s/config"
 
-#define O2CB_FORMAT_CLUSTER_DIR		CONFIGFS_PATH "/cluster"
+#define O2CB_FORMAT_CLUSTER_DIR		CONFIGFS_FORMAT_PATH "/cluster"
 #define O2CB_FORMAT_CLUSTER		O2CB_FORMAT_CLUSTER_DIR "/%s"
 #define O2CB_FORMAT_NODE_DIR		O2CB_FORMAT_CLUSTER "/node"
 #define O2CB_FORMAT_NODE		O2CB_FORMAT_NODE_DIR "/%s"

Modified: trunk/libo2cb/o2cb_abi.c
===================================================================
--- trunk/libo2cb/o2cb_abi.c	2005-11-03 04:19:04 UTC (rev 1110)
+++ trunk/libo2cb/o2cb_abi.c	2005-11-05 22:56:27 UTC (rev 1111)
@@ -30,6 +30,7 @@
 #include <stdlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/statfs.h>
 #include <sys/ioctl.h>
 #include <sys/ipc.h>
 #include <sys/sem.h>
@@ -42,13 +43,12 @@
 #include <linux/types.h>
 
 #include "o2cb.h"
-
 #include "o2cb_abi.h"
-
 #include "o2cb_crc32.h"
-
 #include "ocfs2_nodemanager.h"
 
+static char *configfs_path;
+
 errcode_t o2cb_create_cluster(const char *cluster_name)
 {
 	char path[PATH_MAX];
@@ -56,7 +56,7 @@
 	errcode_t err = 0;
 
 	ret = snprintf(path, PATH_MAX - 1, O2CB_FORMAT_CLUSTER,
-		       cluster_name);
+		       configfs_path, cluster_name);
 	if ((ret <= 0) || (ret == (PATH_MAX - 1)))
 		return O2CB_ET_INTERNAL_FAILURE;
 
@@ -99,7 +99,7 @@
 	errcode_t err = 0;
 
 	ret = snprintf(path, PATH_MAX - 1, O2CB_FORMAT_CLUSTER,
-		       cluster_name);
+		       configfs_path, cluster_name);
 	if ((ret <= 0) || (ret == (PATH_MAX - 1)))
 		return O2CB_ET_INTERNAL_FAILURE;
 
@@ -265,7 +265,8 @@
 	char attr_path[PATH_MAX];
 
 	ret = snprintf(attr_path, PATH_MAX - 1, O2CB_FORMAT_NODE_ATTR,
-		       cluster_name, node_name, attr_name);
+		       configfs_path, cluster_name, node_name,
+		       attr_name);
 	if ((ret <= 0) || (ret == (PATH_MAX - 1)))
 		return O2CB_ET_INTERNAL_FAILURE;
 
@@ -282,7 +283,8 @@
 	char attr_path[PATH_MAX];
 
 	ret = snprintf(attr_path, PATH_MAX - 1, O2CB_FORMAT_NODE_ATTR,
-		       cluster_name, node_name, attr_name);
+		       configfs_path, cluster_name, node_name,
+		       attr_name);
 	if ((ret <= 0) || (ret == (PATH_MAX - 1)))
 		return O2CB_ET_INTERNAL_FAILURE;
 
@@ -303,7 +305,7 @@
 
 	ret = snprintf(node_path, PATH_MAX - 1,
 		       O2CB_FORMAT_NODE,
-		       cluster_name, node_name);
+		       configfs_path, cluster_name, node_name);
 	if (ret <= 0 || ret == PATH_MAX - 1) {
 		err = O2CB_ET_INTERNAL_FAILURE;
 		goto out;
@@ -372,7 +374,7 @@
 	errcode_t err = 0;
 
 	ret = snprintf(node_path, PATH_MAX - 1, O2CB_FORMAT_NODE,
-		       cluster_name, node_name);
+		       configfs_path, cluster_name, node_name);
 	if (ret <= 0 || ret == PATH_MAX - 1) {
 		err = O2CB_ET_INTERNAL_FAILURE;
 		goto out;
@@ -442,6 +444,46 @@
 	return err;
 }
 
+#define O2CB_NEW_CONFIGFS_PATH "/sys/kernel"
+#define O2CB_OLD_CONFIGFS_PATH ""
+#define CONFIGFS_MAGIC 0x62656570
+static errcode_t try_configfs_path(const char *path)
+{
+	errcode_t ret;
+	char attr_path[PATH_MAX];
+	struct stat64 stat_buf;
+	struct statfs64 statfs_buf;
+
+	ret = snprintf(attr_path, PATH_MAX - 1, CONFIGFS_FORMAT_PATH,
+		       path);
+	if ((ret <= 0) || (ret == (PATH_MAX - 1)))
+		return O2CB_ET_INTERNAL_FAILURE;
+
+	ret = stat64(attr_path, &stat_buf);
+	if (ret || !S_ISDIR(stat_buf.st_mode))
+		return O2CB_ET_SERVICE_UNAVAILABLE;
+	ret = statfs64(attr_path, &statfs_buf);
+	if (ret || (statfs_buf.f_type != CONFIGFS_MAGIC))
+		return O2CB_ET_SERVICE_UNAVAILABLE;
+
+	return 0;
+}
+
+static errcode_t init_configfs(void)
+{
+	configfs_path = O2CB_NEW_CONFIGFS_PATH;
+	if (!try_configfs_path(configfs_path))
+		return 0;
+
+	configfs_path = O2CB_OLD_CONFIGFS_PATH;
+	if (!try_configfs_path(configfs_path))
+		return 0;
+
+	configfs_path = NULL;
+
+	return O2CB_ET_SERVICE_UNAVAILABLE;
+}
+
 #define O2CB_INTERFACE_REVISION_PATH_OLD	"/proc/fs/ocfs2_nodemanager/interface_revision"
 #define O2CB_INTERFACE_REVISION_PATH		"/sys/o2cb/interface_revision"
 errcode_t o2cb_init(void)
@@ -476,7 +518,7 @@
 	if (O2NM_API_VERSION < module_version)
 		return O2CB_ET_BAD_VERSION;
 
-	return 0;
+	return init_configfs();
 }
 
 /* o2cb_get_region_attribute() would just be s/set/get/ of this function */
@@ -490,7 +532,8 @@
 
 	ret = snprintf(attr_path, PATH_MAX - 1,
 		       O2CB_FORMAT_HEARTBEAT_REGION_ATTR,
-		       cluster_name, region_name, attr_name);
+		       configfs_path, cluster_name, region_name,
+		       attr_name);
 	if ((ret <= 0) || (ret == (PATH_MAX - 1)))
 		return O2CB_ET_INTERNAL_FAILURE;
 
@@ -547,7 +590,7 @@
 
 	ret = snprintf(region_path, PATH_MAX - 1,
 		       O2CB_FORMAT_HEARTBEAT_REGION,
-		       cluster_name, region_name);
+		       configfs_path, cluster_name, region_name);
 	if (ret <= 0 || ret == PATH_MAX - 1) {
 		err = O2CB_ET_INTERNAL_FAILURE;
 		goto out;
@@ -909,7 +952,7 @@
 
 	ret = snprintf(region_path, PATH_MAX - 1,
 		       O2CB_FORMAT_HEARTBEAT_REGION,
-		       cluster_name, region_name);
+		       configfs_path, cluster_name, region_name);
 	if (ret <= 0 || ret == PATH_MAX - 1) {
 		err = O2CB_ET_INTERNAL_FAILURE;
 		goto out;
@@ -1188,7 +1231,7 @@
 	errcode_t ret;
 
 	ret = snprintf(path, PATH_MAX - 1, O2CB_FORMAT_NODE_DIR,
-		       cluster_name);
+		       configfs_path, cluster_name);
 	if ((ret <= 0) || (ret == (PATH_MAX - 1)))
 		return O2CB_ET_INTERNAL_FAILURE;
 

Modified: trunk/vendor/common/o2cb.init
===================================================================
--- trunk/vendor/common/o2cb.init	2005-11-03 04:19:04 UTC (rev 1110)
+++ trunk/vendor/common/o2cb.init	2005-11-05 22:56:27 UTC (rev 1111)
@@ -35,9 +35,20 @@
 # Source configuration, 
 [ -f "${CONFIGURATION}" ] && . "${CONFIGURATION}"
 
+configfs_path()
+{
+    # Note that this is only valid *after* configfs is loaded
+    if [ -d /sys/kernel/config ]
+    then
+        echo /sys/kernel/config
+    else
+        echo /config
+    fi
+}
+
 # XXX some description of what this does
 LOAD_ACTIONS=("load_module configfs"
-		"mount_fs configfs /config"
+		"mount_fs configfs "'`configfs_path`'
 		"load_module ocfs2_nodemanager"
 		"load_module ocfs2_dlm"
 		"load_module ocfs2_dlmfs"



More information about the Ocfs2-tools-commits mailing list