diff options
author | Patrick Caulfield <pcaulfie@redhat.com> | 2005-02-07 10:04:27 +0000 |
---|---|---|
committer | Patrick Caulfield <pcaulfie@redhat.com> | 2005-02-07 10:04:27 +0000 |
commit | 2cf7b80d8fbb633d025b28b308b5064493405b9a (patch) | |
tree | 5ba72eb10c33cc7101d492651432704de3b4ff4b /daemons | |
parent | 3ef1aceed68601c6746d2e9ee9cac4e9239270e7 (diff) | |
download | lvm2-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.in | 2 | ||||
-rw-r--r-- | daemons/clvmd/lvm-functions.c | 57 |
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 */ |