[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