summaryrefslogtreecommitdiffstats
path: root/daemons
diff options
context:
space:
mode:
authorPatrick Caulfield <pcaulfie@redhat.com>2005-02-07 10:04:27 +0000
committerPatrick Caulfield <pcaulfie@redhat.com>2005-02-07 10:04:27 +0000
commit2cf7b80d8fbb633d025b28b308b5064493405b9a (patch)
tree5ba72eb10c33cc7101d492651432704de3b4ff4b /daemons
parent3ef1aceed68601c6746d2e9ee9cac4e9239270e7 (diff)
downloadlvm2-2cf7b80d8fbb633d025b28b308b5064493405b9a.tar.gz
lvm2-2cf7b80d8fbb633d025b28b308b5064493405b9a.tar.xz
lvm2-2cf7b80d8fbb633d025b28b308b5064493405b9a.zip
Make clvmd use the command library rather than popen() to
preload the lock state.
Diffstat (limited to 'daemons')
-rw-r--r--daemons/clvmd/Makefile.in2
-rw-r--r--daemons/clvmd/lvm-functions.c57
2 files changed, 37 insertions, 22 deletions
diff --git a/daemons/clvmd/Makefile.in b/daemons/clvmd/Makefile.in
index 7ffd5156..81dd3fc4 100644
--- a/daemons/clvmd/Makefile.in
+++ b/daemons/clvmd/Makefile.in
@@ -52,7 +52,7 @@ TARGETS = \
include $(top_srcdir)/make.tmpl
CFLAGS += -D_REENTRANT -fno-strict-aliasing
-LIBS += -ldevmapper -llvm -lpthread
+LIBS += -L../../tools -ldevmapper -llvm -Wl,-Bstatic -llvm2cmd -Wl,-Bdynamic -lpthread
INSTALL_TARGETS = \
install_clvmd
diff --git a/daemons/clvmd/lvm-functions.c b/daemons/clvmd/lvm-functions.c
index a3635d30..59bdedd8 100644
--- a/daemons/clvmd/lvm-functions.c
+++ b/daemons/clvmd/lvm-functions.c
@@ -43,6 +43,7 @@
#include "activate.h"
#include "hash.h"
#include "locking.h"
+#include "../tools/lvm2cmd.h"
static struct cmd_context *cmd = NULL;
static struct hash_table *lv_hash = NULL;
@@ -388,29 +389,19 @@ int do_check_lvm1(char *vgname)
return status == 1 ? 0 : EBUSY;
}
-/*
- * Ideally, clvmd should be started before any LVs are active
- * but this may not be the case...
- * I suppose this also comes in handy if clvmd crashes, not that it would!
- */
-static void *get_initial_state()
+static void cmdline_output(int level, const char *file, int line,
+ const char *message)
{
- char lv[64], vg[64], flags[25];
- char uuid[65];
- char line[255];
- FILE *lvs =
- popen
- ("/sbin/lvm lvs --nolocking --noheadings -o vg_uuid,lv_uuid,lv_attr",
- "r");
-
- if (!lvs)
- return NULL;
+ DEBUGLOG("lvm2output: %d: %s\n", level, message);
+ if (level == LVM2_LOG_PRINT)
+ {
+ char lv[64], vg[64], flags[25];
+ char uuid[65];
- while (fgets(line, sizeof(line), lvs)) {
- if (sscanf(line, "%s %s %s\n", vg, lv, flags) == 3) {
+ if (sscanf(message, "%s %s %s\n", vg, lv, flags) == 3) {
/* States: s:suspended a:active S:dropped snapshot I:invalid snapshot */
- if (strlen(vg) == 38 && /* is is a valid UUID ? */
+ if (strlen(vg) == 38 && /* is is a valid UUID ? */
(flags[4] == 'a' || flags[4] == 's')) { /* is it active or suspended? */
/* Convert hyphen-separated UUIDs into one */
memcpy(&uuid[0], &vg[0], 6);
@@ -434,8 +425,32 @@ static void *get_initial_state()
}
}
}
- fclose(lvs);
- return NULL;
+}
+
+/*
+ * Ideally, clvmd should be started before any LVs are active
+ * but this may not be the case...
+ * I suppose this also comes in handy if clvmd crashes, not that it would!
+ */
+static void get_initial_state()
+{
+ void *lvm2_handle;
+
+ lvm2_handle = lvm2_init();
+ if (!lvm2_handle) {
+ syslog(LOG_ERR, "Cannot get lvm2 context to initialise lock state\n");
+ return;
+ }
+
+ lvm2_log_fn(cmdline_output);
+
+ /* This doesn't seem to do what I think it does */
+ lvm2_log_level(lvm2_handle, LVM2_LOG_PRINT);
+
+ DEBUGLOG("Getting currently active LVs for lock state\n");
+ lvm2_run(lvm2_handle, "lvs --nolocking --noheadings -o vg_uuid,lv_uuid,lv_attr");
+
+ lvm2_exit(lvm2_handle);
}
/* This checks some basic cluster-LVM configuration stuff */