diff options
author | Alasdair Kergon <agk@redhat.com> | 2010-01-21 22:15:45 +0000 |
---|---|---|
committer | Alasdair Kergon <agk@redhat.com> | 2010-01-21 22:15:45 +0000 |
commit | d3d98fdc1e6a8ec1128bf51a522011f5cf2c416b (patch) | |
tree | 499b59f87e77b710a83cb8836dd1cd389c8cf9bd /daemons | |
parent | a7ca10151795b4c4ed6fa4bf7d3d6b1a687430b0 (diff) | |
download | lvm2-d3d98fdc1e6a8ec1128bf51a522011f5cf2c416b.tar.gz lvm2-d3d98fdc1e6a8ec1128bf51a522011f5cf2c416b.tar.xz lvm2-d3d98fdc1e6a8ec1128bf51a522011f5cf2c416b.zip |
Add libdevmapper-event-lvm2.so to serialise dmeventd plugin liblvm2cmd use.
Diffstat (limited to 'daemons')
-rw-r--r-- | daemons/dmeventd/plugins/Makefile.in | 5 | ||||
-rw-r--r-- | daemons/dmeventd/plugins/lvm2/.exported_symbols | 6 | ||||
-rw-r--r-- | daemons/dmeventd/plugins/lvm2/Makefile.in | 39 | ||||
-rw-r--r-- | daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c | 127 | ||||
-rw-r--r-- | daemons/dmeventd/plugins/lvm2/dmeventd_lvm.h | 39 | ||||
-rw-r--r-- | daemons/dmeventd/plugins/mirror/Makefile.in | 8 | ||||
-rw-r--r-- | daemons/dmeventd/plugins/mirror/dmeventd_mirror.c | 107 | ||||
-rw-r--r-- | daemons/dmeventd/plugins/snapshot/Makefile.in | 8 | ||||
-rw-r--r-- | daemons/dmeventd/plugins/snapshot/dmeventd_snapshot.c | 94 |
9 files changed, 246 insertions, 187 deletions
diff --git a/daemons/dmeventd/plugins/Makefile.in b/daemons/dmeventd/plugins/Makefile.in index d6590410..8a6e151d 100644 --- a/daemons/dmeventd/plugins/Makefile.in +++ b/daemons/dmeventd/plugins/Makefile.in @@ -17,7 +17,10 @@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ -SUBDIRS += mirror snapshot +SUBDIRS += lvm2 mirror snapshot + +mirror: lvm2 +snapshot: lvm2 include ../../../make.tmpl diff --git a/daemons/dmeventd/plugins/lvm2/.exported_symbols b/daemons/dmeventd/plugins/lvm2/.exported_symbols new file mode 100644 index 00000000..fe508125 --- /dev/null +++ b/daemons/dmeventd/plugins/lvm2/.exported_symbols @@ -0,0 +1,6 @@ +init_lvm +fini_lvm +lock_lvm +unlock_lvm +lvm_pool +lvm_handle diff --git a/daemons/dmeventd/plugins/lvm2/Makefile.in b/daemons/dmeventd/plugins/lvm2/Makefile.in new file mode 100644 index 00000000..96c60e08 --- /dev/null +++ b/daemons/dmeventd/plugins/lvm2/Makefile.in @@ -0,0 +1,39 @@ +# +# Copyright (C) 2010 Red Hat, Inc. All rights reserved. +# +# This file is part of LVM2. +# +# This copyrighted material is made available to anyone wishing to use, +# modify, copy, or redistribute it subject to the terms and conditions +# of the GNU General Public License v.2. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = @top_builddir@ +VPATH = @srcdir@ + +CLDFLAGS += -L${top_builddir}/tools + +SOURCES = dmeventd_lvm.c + +ifeq ("@LIB_SUFFIX@","dylib") + LIB_SHARED = libdevmapper-event-lvm2.dylib +else + LIB_SHARED = libdevmapper-event-lvm2.so +endif +LIB_VERSION = $(LIB_VERSION_LVM) + +include $(top_builddir)/make.tmpl + +LIBS += -ldevmapper @LIB_PTHREAD@ @LVM2CMD_LIB@ + +install_lvm2: libdevmapper-event-lvm2.$(LIB_SUFFIX) + $(INSTALL) -D $(OWNER) $(GROUP) -m 555 $(STRIP) $< \ + $(libdir)/$<.$(LIB_VERSION) + $(LN_S) -f $<.$(LIB_VERSION) $(libdir)/$< + +install: install_lvm2 diff --git a/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c b/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c new file mode 100644 index 00000000..37900e48 --- /dev/null +++ b/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2010 Red Hat, Inc. All rights reserved. + * + * This file is part of LVM2. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License v.2.1. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "lib.h" + +#include "lvm2cmd.h" +#include "errors.h" +#include "libdevmapper-event.h" +#include "dmeventd_lvm.h" + +#include <pthread.h> +#include <syslog.h> + +/* + * register_device() is called first and performs initialisation. + * Only one device may be registered or unregistered at a time. + */ +static pthread_mutex_t _register_mutex = PTHREAD_MUTEX_INITIALIZER; + +/* + * Number of active registrations. + */ +static int _register_count = 0; +static struct dm_pool *_mem_pool = NULL; +static void *_lvm_handle = NULL; + +/* + * Currently only one event can be processed at a time. + */ +static pthread_mutex_t _event_mutex = PTHREAD_MUTEX_INITIALIZER; + +/* FIXME Remove this: Pass messages back to dmeventd core for processing. */ +static void _temporary_log_fn(int level, + const char *file __attribute((unused)), + int line __attribute((unused)), + int dm_errno __attribute((unused)), + const char *format) +{ + level &= ~_LOG_STDERR; + + if (!strncmp(format, "WARNING: ", 9) && (level < 5)) + syslog(LOG_CRIT, "%s", format); + else + syslog(LOG_DEBUG, "%s", format); +} + +void dmeventd_lvm2_lock(void) +{ + if (pthread_mutex_trylock(&_event_mutex)) { + syslog(LOG_NOTICE, "Another thread is handling an event. Waiting..."); + pthread_mutex_lock(&_event_mutex); + } +} + +void dmeventd_lvm2_unlock(void) +{ + pthread_mutex_unlock(&_event_mutex); +} + +int dmeventd_lvm2_init(void) +{ + int r = 0; + + pthread_mutex_lock(&_register_mutex); + + /* + * Need some space for allocations. 1024 should be more + * than enough for what we need (device mapper name splitting) + */ + if (!_mem_pool && !(_mem_pool = dm_pool_create("mirror_dso", 1024))) + goto out; + + if (!_lvm_handle) { + lvm2_log_fn(_temporary_log_fn); + if (!(_lvm_handle = lvm2_init())) { + dm_pool_destroy(_mem_pool); + _mem_pool = NULL; + goto out; + } + /* FIXME Temporary: move to dmeventd core */ + lvm2_run(_lvm_handle, "_memlock_inc"); + } + + _register_count++; + r = 1; + +out: + pthread_mutex_unlock(&_register_mutex); + return r; +} + +void dmeventd_lvm2_exit(void) +{ + pthread_mutex_lock(&_register_mutex); + + if (!--_register_count) { + dm_pool_destroy(_mem_pool); + _mem_pool = NULL; + lvm2_run(_lvm_handle, "_memlock_dec"); + lvm2_exit(_lvm_handle); + _lvm_handle = NULL; + } + + pthread_mutex_unlock(&_register_mutex); +} + +struct dm_pool *dmeventd_lvm2_pool(void) +{ + return _mem_pool; +} + +int dmeventd_lvm2_run(const char *cmdline) +{ + return lvm2_run(_lvm_handle, cmdline); +} + diff --git a/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.h b/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.h new file mode 100644 index 00000000..8efcb9b6 --- /dev/null +++ b/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2010 Red Hat, Inc. All rights reserved. + * + * This file is part of LVM2. + * + * This copyrighted material is made available to anyone wishing to use, + * modify, copy, or redistribute it subject to the terms and conditions + * of the GNU Lesser General Public License v.2.1. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Wrappers around liblvm2cmd functions for dmeventd plug-ins. + * + * liblvm2cmd is not thread-safe so the locking in this library helps dmeventd + * threads to co-operate in sharing a single instance. + * + * FIXME Either support this properly as a generic liblvm2cmd wrapper or make + * liblvm2cmd thread-safe so this can go away. + */ + +#include "libdevmapper.h" + +#ifndef _DMEVENTD_LVMWRAP_H +#define _DMEVENTD_LVMWRAP_H + +int dmeventd_lvm2_init(void); +void dmeventd_lvm2_exit(void); +int dmeventd_lvm2_run(const char *cmdline); + +void dmeventd_lvm2_lock(void); +void dmeventd_lvm2_unlock(void); + +struct dm_pool *dmeventd_lvm2_pool(void); + +#endif /* _DMEVENTD_LVMWRAP_H */ diff --git a/daemons/dmeventd/plugins/mirror/Makefile.in b/daemons/dmeventd/plugins/mirror/Makefile.in index 1fcb5c85..2c42e036 100644 --- a/daemons/dmeventd/plugins/mirror/Makefile.in +++ b/daemons/dmeventd/plugins/mirror/Makefile.in @@ -1,6 +1,6 @@ # # Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. -# Copyright (C) 2004-2005, 2008 Red Hat, Inc. All rights reserved. +# Copyright (C) 2004-2005, 2008-2010 Red Hat, Inc. All rights reserved. # # This file is part of LVM2. # @@ -17,8 +17,8 @@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ -INCLUDES += -I${top_srcdir}/tools -CLDFLAGS += -L${top_builddir}/tools +INCLUDES += -I${top_srcdir}/tools -I$(top_srcdir)/daemons/dmeventd/plugins/lvm2 +CLDFLAGS += -L${top_builddir}/tools -L${top_builddir}/daemons/dmeventd/plugins/lvm2 SOURCES = dmeventd_mirror.c @@ -32,7 +32,7 @@ LIB_VERSION = $(LIB_VERSION_LVM) include $(top_builddir)/make.tmpl -LIBS += -ldevmapper @LIB_PTHREAD@ @LVM2CMD_LIB@ +LIBS += -ldevmapper @LIB_PTHREAD@ @LVM2CMD_LIB@ -ldevmapper-event-lvm2 install_lvm2: libdevmapper-event-lvm2mirror.$(LIB_SUFFIX) $(INSTALL) -D $(OWNER) $(GROUP) -m 555 $(STRIP) $< \ diff --git a/daemons/dmeventd/plugins/mirror/dmeventd_mirror.c b/daemons/dmeventd/plugins/mirror/dmeventd_mirror.c index d1d9ca62..00e8e1c4 100644 --- a/daemons/dmeventd/plugins/mirror/dmeventd_mirror.c +++ b/daemons/dmeventd/plugins/mirror/dmeventd_mirror.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2009 Red Hat, Inc. All rights reserved. + * Copyright (C) 2005-2010 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -12,18 +12,14 @@ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "lib.h" + #include "lvm2cmd.h" #include "errors.h" +#include "libdevmapper-event.h" +#include "dmeventd_lvm.h" -#include <libdevmapper.h> -#include <libdevmapper-event.h> -#include <errno.h> -#include <signal.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> #include <pthread.h> -#include <unistd.h> #include <syslog.h> /* FIXME Replace syslog with multilog */ /* FIXME Missing openlog? */ @@ -34,25 +30,6 @@ #define ME_INSYNC 1 #define ME_FAILURE 2 -/* - * register_device() is called first and performs initialisation. - * Only one device may be registered or unregistered at a time. - */ -static pthread_mutex_t _register_mutex = PTHREAD_MUTEX_INITIALIZER; - -/* - * Number of active registrations. - */ -static int _register_count = 0; - -static struct dm_pool *_mem_pool = NULL; -static void *_lvm_handle = NULL; - -/* - * Currently only one event can be processed at a time. - */ -static pthread_mutex_t _event_mutex = PTHREAD_MUTEX_INITIALIZER; - static int _process_status_code(const char status_code, const char *dev_name, const char *dev_type, int r) { @@ -155,18 +132,6 @@ out_parse: return ME_IGNORE; } -static void _temporary_log_fn(int level, - const char *file __attribute((unused)), - int line __attribute((unused)), - int dm_errno __attribute((unused)), - const char *format) -{ - if (!strncmp(format, "WARNING: ", 9) && (level < 5)) - syslog(LOG_CRIT, "%s", format); - else - syslog(LOG_DEBUG, "%s", format); -} - static int _remove_failed_devices(const char *device) { int r; @@ -177,7 +142,7 @@ static int _remove_failed_devices(const char *device) if (strlen(device) > 200) /* FIXME Use real restriction */ return -ENAMETOOLONG; /* FIXME These return code distinctions are not used so remove them! */ - if (!dm_split_lvm_name(_mem_pool, device, &vg, &lv, &layer)) { + if (!dm_split_lvm_name(dmeventd_lvm2_pool(), device, &vg, &lv, &layer)) { syslog(LOG_ERR, "Unable to determine VG name from %s", device); return -ENOMEM; /* FIXME Replace with generic error return - reason for failure has already got logged */ @@ -187,15 +152,13 @@ static int _remove_failed_devices(const char *device) if (CMD_SIZE <= snprintf(cmd_str, CMD_SIZE, "lvconvert --config devices{ignore_suspended_devices=1} --repair --use-policies %s/%s", vg, lv)) { /* this error should be caught above, but doesn't hurt to check again */ syslog(LOG_ERR, "Unable to form LVM command: Device name too long"); - dm_pool_empty(_mem_pool); /* FIXME: not safe with multiple threads */ return -ENAMETOOLONG; /* FIXME Replace with generic error return - reason for failure has already got logged */ } - r = lvm2_run(_lvm_handle, cmd_str); + r = dmeventd_lvm2_run(cmd_str); syslog(LOG_INFO, "Repair of mirrored LV %s/%s %s.", vg, lv, (r == ECMD_PROCESSED) ? "finished successfully" : "failed"); - dm_pool_empty(_mem_pool); /* FIXME: not safe with multiple threads */ return (r == ECMD_PROCESSED) ? 0 : -1; } @@ -209,10 +172,8 @@ void process_event(struct dm_task *dmt, char *params; const char *device = dm_task_get_name(dmt); - if (pthread_mutex_trylock(&_event_mutex)) { - syslog(LOG_NOTICE, "Another thread is handling an event. Waiting..."); - pthread_mutex_lock(&_event_mutex); - } + dmeventd_lvm2_lock(); + do { next = dm_get_next_target(dmt, next, &start, &length, &target_type, ¶ms); @@ -255,7 +216,7 @@ void process_event(struct dm_task *dmt, } } while (next); - pthread_mutex_unlock(&_event_mutex); + dmeventd_lvm2_unlock(); } int register_device(const char *device, @@ -264,38 +225,8 @@ int register_device(const char *device, int minor __attribute((unused)), void **unused __attribute((unused))) { - int r = 0; - - pthread_mutex_lock(&_register_mutex); - - /* - * Need some space for allocations. 1024 should be more - * than enough for what we need (device mapper name splitting) - */ - if (!_mem_pool && !(_mem_pool = dm_pool_create("mirror_dso", 1024))) - goto out; - - if (!_lvm_handle) { - lvm2_log_fn(_temporary_log_fn); - if (!(_lvm_handle = lvm2_init())) { - dm_pool_destroy(_mem_pool); - _mem_pool = NULL; - goto out; - } - lvm2_log_level(_lvm_handle, LVM2_LOG_SUPPRESS); - /* FIXME Temporary: move to dmeventd core */ - lvm2_run(_lvm_handle, "_memlock_inc"); - } - - syslog(LOG_INFO, "Monitoring mirror device %s for events\n", device); - - _register_count++; - r = 1; - -out: - pthread_mutex_unlock(&_register_mutex); - - return r; + syslog(LOG_INFO, "Monitoring mirror device %s for events", device); + return dmeventd_lvm2_init(); } int unregister_device(const char *device, @@ -304,20 +235,8 @@ int unregister_device(const char *device, int minor __attribute((unused)), void **unused __attribute((unused))) { - pthread_mutex_lock(&_register_mutex); - syslog(LOG_INFO, "No longer monitoring mirror device %s for events\n", device); - - if (!--_register_count) { - dm_pool_destroy(_mem_pool); - _mem_pool = NULL; - lvm2_run(_lvm_handle, "_memlock_dec"); - lvm2_exit(_lvm_handle); - _lvm_handle = NULL; - } - - pthread_mutex_unlock(&_register_mutex); - + dmeventd_lvm2_exit(); return 1; } diff --git a/daemons/dmeventd/plugins/snapshot/Makefile.in b/daemons/dmeventd/plugins/snapshot/Makefile.in index a422314e..5f08ab3d 100644 --- a/daemons/dmeventd/plugins/snapshot/Makefile.in +++ b/daemons/dmeventd/plugins/snapshot/Makefile.in @@ -1,6 +1,6 @@ # # Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. -# Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. +# Copyright (C) 2004-2010 Red Hat, Inc. All rights reserved. # # This file is part of the LVM2. # @@ -17,8 +17,8 @@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ -INCLUDES += -I${top_srcdir}/tools -CLDFLAGS += -L${top_builddir}/tools +INCLUDES += -I${top_srcdir}/tools -I$(top_srcdir)/daemons/dmeventd/plugins/lvm2 +CLDFLAGS += -L${top_builddir}/tools -L${top_builddir}/daemons/dmeventd/plugins/lvm2 SOURCES = dmeventd_snapshot.c @@ -32,7 +32,7 @@ LIB_VERSION = $(LIB_VERSION_LVM) include $(top_builddir)/make.tmpl -LIBS += -ldevmapper @LIB_PTHREAD@ @LVM2CMD_LIB@ +LIBS += -ldevmapper @LIB_PTHREAD@ @LVM2CMD_LIB@ -ldevmapper-event-lvm2 install_lvm2: libdevmapper-event-lvm2snapshot.$(LIB_SUFFIX) $(INSTALL) -D $(OWNER) $(GROUP) -m 555 $(STRIP) $< \ diff --git a/daemons/dmeventd/plugins/snapshot/dmeventd_snapshot.c b/daemons/dmeventd/plugins/snapshot/dmeventd_snapshot.c index 96c4688f..23784fff 100644 --- a/daemons/dmeventd/plugins/snapshot/dmeventd_snapshot.c +++ b/daemons/dmeventd/plugins/snapshot/dmeventd_snapshot.c @@ -12,19 +12,16 @@ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "libdevmapper.h" -#include "libdevmapper-event.h" +#include "dmlib.h" + #include "lvm2cmd.h" +#include "errors.h" +#include "libdevmapper-event.h" +#include "dmeventd_lvm.h" + #include "lvm-string.h" -#include <errno.h> -#include <signal.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> #include <pthread.h> -#include <unistd.h> - #include <syslog.h> /* FIXME Replace syslog with multilog */ /* FIXME Missing openlog? */ @@ -33,39 +30,12 @@ /* Further warnings at 85%, 90% and 95% fullness. */ #define WARNING_STEP 5 -static pthread_mutex_t _register_mutex = PTHREAD_MUTEX_INITIALIZER; - -/* - * Number of active registrations. - */ -static int _register_count = 0; - -static struct dm_pool *_mem_pool = NULL; -static void *_lvm_handle = NULL; - struct snap_status { int invalid; int used; int max; }; -/* - * Currently only one event can be processed at a time. - */ -static pthread_mutex_t _event_mutex = PTHREAD_MUTEX_INITIALIZER; - -static void _temporary_log_fn(int level, - const char *file __attribute((unused)), - int line __attribute((unused)), - int dm_errno __attribute((unused)), - const char *format) -{ - if (!strncmp(format, "WARNING: ", 9) && (level < 5)) - syslog(LOG_CRIT, "%s", format); - else - syslog(LOG_DEBUG, "%s", format); -} - /* FIXME possibly reconcile this with target_percent when we gain access to regular LVM library here. */ static void _parse_snapshot_params(char *params, struct snap_status *stat) @@ -116,10 +86,7 @@ void process_event(struct dm_task *dmt, if (!*percent_warning) return; - if (pthread_mutex_trylock(&_event_mutex)) { - syslog(LOG_NOTICE, "Another thread is handling an event. Waiting..."); - pthread_mutex_lock(&_event_mutex); - } + dmeventd_lvm2_lock(); dm_get_next_target(dmt, next, &start, &length, &target_type, ¶ms); if (!target_type) @@ -143,7 +110,7 @@ void process_event(struct dm_task *dmt, *percent_warning = (percent / WARNING_STEP) * WARNING_STEP + WARNING_STEP; } out: - pthread_mutex_unlock(&_event_mutex); + dmeventd_lvm2_unlock(); } int register_device(const char *device, @@ -152,41 +119,12 @@ int register_device(const char *device, int minor __attribute((unused)), void **private) { - int r = 0; int *percent_warning = (int*)private; - pthread_mutex_lock(&_register_mutex); - - /* - * Need some space for allocations. 1024 should be more - * than enough for what we need (device mapper name splitting) - */ - if (!_mem_pool && !(_mem_pool = dm_pool_create("snapshot_dso", 1024))) - goto out; - *percent_warning = WARNING_THRESH; /* Print warning if snapshot is full */ - if (!_lvm_handle) { - lvm2_log_fn(_temporary_log_fn); - if (!(_lvm_handle = lvm2_init())) { - dm_pool_destroy(_mem_pool); - _mem_pool = NULL; - goto out; - } - lvm2_log_level(_lvm_handle, LVM2_LOG_SUPPRESS); - /* FIXME Temporary: move to dmeventd core */ - lvm2_run(_lvm_handle, "_memlock_inc"); - } - syslog(LOG_INFO, "Monitoring snapshot %s\n", device); - - _register_count++; - r = 1; - -out: - pthread_mutex_unlock(&_register_mutex); - - return r; + return dmeventd_lvm2_init(); } int unregister_device(const char *device, @@ -195,20 +133,8 @@ int unregister_device(const char *device, int minor __attribute((unused)), void **unused __attribute((unused))) { - pthread_mutex_lock(&_register_mutex); - syslog(LOG_INFO, "No longer monitoring snapshot %s\n", device); - - if (!--_register_count) { - dm_pool_destroy(_mem_pool); - _mem_pool = NULL; - lvm2_run(_lvm_handle, "_memlock_dec"); - lvm2_exit(_lvm_handle); - _lvm_handle = NULL; - } - - pthread_mutex_unlock(&_register_mutex); - + dmeventd_lvm2_exit(); return 1; } |