1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

Implement an external locking interface.

This commit is contained in:
Patrick Caulfield 2002-04-08 16:04:50 +00:00
parent c34d34e6a0
commit 2fab033e9b
4 changed files with 125 additions and 5 deletions

View File

@ -39,6 +39,7 @@ SOURCES=\
label/label.c \
label/uuid-map.c \
locking/file_locking.c \
locking/external_locking.c \
locking/locking.c \
log/log.c \
metadata/lv_manip.c \

View File

@ -0,0 +1,119 @@
/*
* Copyright (C) 2002 Sistina Software (UK) Limited.
*
* This file is released under the LGPL.
*
*/
#include "log.h"
#include "locking.h"
#include "locking_types.h"
#include "activate.h"
#include "config.h"
#include "defaults.h"
#include "lvm-file.h"
#include "lvm-string.h"
#include "dbg_malloc.h"
#include <limits.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <fcntl.h>
#include <dlfcn.h>
#include <signal.h>
static void *locking_module = NULL;
static void (*end_fn)(void) = NULL;
static int (*lock_fn)(struct cmd_context *cmd, const char *resource, int flags) = NULL;
static int (*init_fn)(int type, struct config_file *cf) = NULL;
static int lock_resource(struct cmd_context *cmd, const char *resource, int flags)
{
if (lock_fn)
return lock_fn(cmd, resource, flags);
else
return 0;
}
static void fin_external_locking(void)
{
if (end_fn)
end_fn();
dlclose(locking_module);
locking_module = NULL;
end_fn = NULL;
lock_fn = NULL;
}
int init_external_locking(struct locking_type *locking, struct config_file *cf)
{
char _lock_lib[PATH_MAX];
if (locking_module)
{
log_error("External locking already initialised\n");
return 1;
}
locking->lock_resource = lock_resource;
locking->fin_locking = fin_external_locking;
/* Get locking module name from config file */
strncpy(_lock_lib, find_config_str(cf->root, "global/locking_library",
'/', "lvm2_locking.so"),
sizeof(_lock_lib));
/* If there is a module_dir in the config file then
look for the locking module in there first and then
using the normal dlopen(3) mechanism of looking
down LD_LIBRARY_PATH and /lib, /usr/lib.
If course, if the library name starts with a slash then
just use the name... */
if (_lock_lib[0] != '/')
{
struct stat st;
char _lock_lib1[PATH_MAX];
lvm_snprintf(_lock_lib1, sizeof(_lock_lib1),
"%s/%s",
find_config_str(cf->root, "global/module_dir",
'/', "RUBBISH"),
_lock_lib);
/* Does it exist ? */
if (stat(_lock_lib1, &st) == 0)
{
strcpy(_lock_lib, _lock_lib1);
}
}
log_very_verbose("Opening locking library %s\n", _lock_lib);
locking_module = dlopen(_lock_lib, RTLD_LAZY);
if (!locking_module)
{
log_error("Unable to open external locking module %s\n", _lock_lib);
return 0;
}
/* Get the functions we need */
init_fn = dlsym(locking_module, "init_locking");
lock_fn = dlsym(locking_module, "lock_resource");
end_fn = dlsym(locking_module, "end_locking");
/* Are they all there ? */
if (!end_fn || !init_fn || !lock_fn)
{
log_error("shared library %s does not contain locking functions\n", _lock_lib);
dlclose(locking_module);
return 0;
}
log_verbose("Opened external locking module %s\n", _lock_lib);
return init_fn(2, cf);
}

View File

@ -101,13 +101,13 @@ int init_locking(int type, struct config_file *cf)
return 0;
log_very_verbose("File-based locking enabled.");
break;
/******
case 2:
if (!init_other_locking(&_locking, cf))
if (!init_external_locking(&_locking, cf))
return 0;
log_very_verbose("Other locking enabled.");
log_very_verbose("External locking enabled.");
break;
******/
default:
log_error("Unknown locking type requested.");
return 0;

View File

@ -62,7 +62,7 @@ include ../make.tmpl
lvm: $(OBJECTS) $(top_srcdir)/lib/liblvm.a
$(CC) -o lvm $(OBJECTS) $(LD_FLAGS) -L$(top_srcdir)/lib \
-L$(DESTDIR)/lib -llvm -ldevmapper $(LIBS)
-L$(DESTDIR)/lib -llvm -ldevmapper $(LIBS) -ldl -rdynamic
.commands: commands.h cmdnames.h
$(CC) -E -P cmdnames.h | grep -v help > .commands