[Ocfs2-tools-devel] [PATCH 1/6] libo2dlm: Provide capability queries

Joel Becker joel.becker at oracle.com
Wed Feb 10 01:34:21 PST 2010


ocfs2_dlmfs can now report added capabilities via a module parameter.
libo2dlm now can query them before trying to use them.

The two known capabilities at this time are 'bast' and 'stackglue'.

Signed-off-by: Joel Becker <joel.becker at oracle.com>
---
 include/o2dlm/o2dlm.h   |    7 +++
 libo2dlm/.gitignore     |    1 +
 libo2dlm/Makefile       |    2 +-
 libo2dlm/capabilities.c |  131 +++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 140 insertions(+), 1 deletions(-)
 create mode 100644 libo2dlm/capabilities.c

diff --git a/include/o2dlm/o2dlm.h b/include/o2dlm/o2dlm.h
index 99bee5f..eada3fb 100644
--- a/include/o2dlm/o2dlm.h
+++ b/include/o2dlm/o2dlm.h
@@ -106,4 +106,11 @@ errcode_t o2dlm_write_lvb(struct o2dlm_ctxt *ctxt,
  * Unlocks all pending locks and frees the lock context.
  */
 errcode_t o2dlm_destroy(struct o2dlm_ctxt *ctxt);
+
+/*
+ * Optional features that libo2dlm and dlmfs can support.
+ */
+errcode_t o2dlm_supports_bast(int *supports);
+errcode_t o2dlm_supports_stackglue(int *supports);
+
 #endif /* _O2DLM_H_ */
diff --git a/libo2dlm/.gitignore b/libo2dlm/.gitignore
index 944a5fb..91241ca 100644
--- a/libo2dlm/.gitignore
+++ b/libo2dlm/.gitignore
@@ -4,3 +4,4 @@ o2dlm_err.*
 *.d
 o2dlm_test
 libdlm.h
+debug_*
diff --git a/libo2dlm/Makefile b/libo2dlm/Makefile
index 1bea796..92d6016 100644
--- a/libo2dlm/Makefile
+++ b/libo2dlm/Makefile
@@ -30,7 +30,7 @@ debug_%: debug_%.o libo2dlm.a
 
 endif
 
-CFILES = o2dlm.c
+CFILES = o2dlm.c capabilities.c
 HFILES = libdlm-compat.h
 
 TESTING_CFILES = o2dlm_test.c
diff --git a/libo2dlm/capabilities.c b/libo2dlm/capabilities.c
new file mode 100644
index 0000000..6840d61
--- /dev/null
+++ b/libo2dlm/capabilities.c
@@ -0,0 +1,131 @@
+/* -*- mode: c; c-basic-offset: 8; -*-
+ * vim: noexpandtab sw=8 ts=8 sts=0:
+ *
+ * capabilities.c
+ *
+ * Read dlmfs capabilities.
+ *
+ * Copyright (C) 2010 Oracle.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+
+#include "o2dlm/o2dlm.h"
+
+#define CAPABILITIES_FILE	"/sys/module/ocfs2_dlmfs/parameters/capabilities"
+
+static ssize_t read_single_line_file(const char *file, char *line,
+				     size_t count)
+{
+	ssize_t ret = 0;
+	FILE *f;
+
+	f = fopen(file, "r");
+	if (f) {
+		if (fgets(line, count, f))
+			ret = strlen(line);
+		fclose(f);
+	} else
+		ret = -errno;
+
+	return ret;
+}
+
+static ssize_t o2dlm_read_capabilities(char *line, size_t count)
+{
+	ssize_t got;
+
+	got = read_single_line_file(CAPABILITIES_FILE, line, count);
+	if ((got > 0) && (line[got - 1] == '\n')) {
+		got--;
+		line[got] = '\0';
+	}
+	return got;
+}
+
+static errcode_t o2dlm_has_capability(const char *cap_name, int *found)
+{
+	char line[PATH_MAX];
+	char *p;
+	ssize_t got;
+
+	got = o2dlm_read_capabilities(line, PATH_MAX);
+	if (got == -ENOENT) {
+		got = 0;
+		line[0] = '\0';
+	}
+	if (got < 0)
+		return O2DLM_ET_SERVICE_UNAVAILABLE;
+
+	*found = 0;
+	p = strstr(line, cap_name);
+	if (p) {
+		p += strlen(cap_name);
+		if (!*p || (*p == ' '))
+			*found = 1;
+	}
+	return 0;
+}
+
+errcode_t o2dlm_supports_bast(int *supports)
+{
+	return o2dlm_has_capability("bast", supports);
+}
+
+errcode_t o2dlm_supports_stackglue(int *supports)
+{
+	return o2dlm_has_capability("stackglue", supports);
+}
+
+#ifdef DEBUG_EXE
+int main(int argc, char *argv[])
+{
+	errcode_t ret;
+	int i, rc = 0;
+	char **caps;
+
+	initialize_o2dl_error_table();
+
+	ret = o2dlm_supports_bast(&i);
+	if (!ret)
+		fprintf(stdout, "bast: %s\n", i ? "yes" : "no");
+	else {
+		rc = 1;
+		com_err("debug_capabilities", ret,
+			"while testing bast capability");
+	}
+
+	ret = o2dlm_supports_stackglue(&i);
+	if (!ret)
+		fprintf(stdout, "stackglue: %s\n", i ? "yes" : "no");
+	else {
+		rc = 1;
+		com_err("debug_capabilities", ret,
+			"while testing stackglue capability");
+	}
+
+	ret = o2dlm_has_capability("invalid", &i);
+	if (!ret)
+		fprintf(stdout, "invalid: %s\n", i ? "yes" : "no");
+	else {
+		rc = 1;
+		com_err("debug_capabilities", ret,
+			"while testing invalid capability");
+	}
+
+	return ret;
+}
+#endif
-- 
1.6.6.1




More information about the Ocfs2-tools-devel mailing list