diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile.in | 1 | ||||
-rw-r--r-- | lib/commands/toolcontext.c | 9 | ||||
-rw-r--r-- | lib/filters/filter-internal.c | 81 | ||||
-rw-r--r-- | lib/filters/filter.h | 4 | ||||
-rw-r--r-- | lib/misc/lvm-globals.c | 11 | ||||
-rw-r--r-- | lib/misc/lvm-globals.h | 2 |
6 files changed, 107 insertions, 1 deletions
diff --git a/lib/Makefile.in b/lib/Makefile.in index 467ef9077..451d96d8f 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -76,6 +76,7 @@ SOURCES =\ filters/filter-partitioned.c \ filters/filter-type.c \ filters/filter-usable.c \ + filters/filter-internal.c \ format_text/archive.c \ format_text/archiver.c \ format_text/export.c \ diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c index 1e3f14a79..2df73c145 100644 --- a/lib/commands/toolcontext.c +++ b/lib/commands/toolcontext.c @@ -1053,7 +1053,7 @@ static int _init_dev_cache(struct cmd_context *cmd) return 1; } -#define MAX_FILTERS 8 +#define MAX_FILTERS 9 static struct dev_filter *_init_lvmetad_filter_chain(struct cmd_context *cmd) { @@ -1078,6 +1078,13 @@ static struct dev_filter *_init_lvmetad_filter_chain(struct cmd_context *cmd) nr_filt++; } + /* internal filter used by command processing. */ + if (!(filters[nr_filt] = internal_filter_create())) { + log_error("Failed to create internal device filter"); + goto bad; + } + nr_filt++; + /* global regex filter. Optional. */ if ((cn = find_config_tree_node(cmd, devices_global_filter_CFG, NULL))) { if (!(filters[nr_filt] = regex_filter_create(cn->v))) { diff --git a/lib/filters/filter-internal.c b/lib/filters/filter-internal.c new file mode 100644 index 000000000..513370942 --- /dev/null +++ b/lib/filters/filter-internal.c @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "lib.h" +#include "filter.h" + +static DM_LIST_INIT(_allow_devs); + +int internal_filter_allow(struct dm_pool *mem, struct device *dev) +{ + struct device_list *devl; + + if (!(devl = dm_pool_alloc(mem, sizeof(*devl)))) { + log_error("device_list element allocation failed"); + return 0; + } + devl->dev = dev; + + dm_list_add(&_allow_devs, &devl->list); + return 1; +} + +void internal_filter_clear(void) +{ + dm_list_init(&_allow_devs); +} + +static int _ignore_internal(struct dev_filter *f __attribute__((unused)), + struct device *dev) +{ + struct device_list *devl; + + if (!internal_filtering()) + return 1; + + dm_list_iterate_items(devl, &_allow_devs) { + if (devl->dev == dev) + return 1; + } + + log_debug_devs("%s: Skipping to import clone devices.", dev_name(dev)); + return 0; +} + +static void _destroy(struct dev_filter *f) +{ + if (f->use_count) + log_error(INTERNAL_ERROR "Destroying internal filter while in use %u times.", f->use_count); + + dm_free(f); +} + +struct dev_filter *internal_filter_create(void) +{ + struct dev_filter *f; + + if (!(f = dm_zalloc(sizeof(*f)))) { + log_error("md filter allocation failed"); + return NULL; + } + + f->passes_filter = _ignore_internal; + f->destroy = _destroy; + f->use_count = 0; + + log_debug_devs("internal filter initialised."); + + return f; +} + diff --git a/lib/filters/filter.h b/lib/filters/filter.h index ebd25e2be..d75f6e11c 100644 --- a/lib/filters/filter.h +++ b/lib/filters/filter.h @@ -32,6 +32,10 @@ struct dev_filter *persistent_filter_create(struct dev_types *dt, const char *file); struct dev_filter *sysfs_filter_create(void); +struct dev_filter *internal_filter_create(void); +int internal_filter_allow(struct dm_pool *mem, struct device *dev); +void internal_filter_clear(void); + /* * patterns must be an array of strings of the form: * [ra]<sep><regex><sep>, eg, diff --git a/lib/misc/lvm-globals.c b/lib/misc/lvm-globals.c index b7af353ae..9c78f3e33 100644 --- a/lib/misc/lvm-globals.c +++ b/lib/misc/lvm-globals.c @@ -26,6 +26,7 @@ static int _verbose_level = VERBOSE_BASE_LEVEL; static int _silent = 0; static int _test = 0; static int _md_filtering = 0; +static int _internal_filtering = 0; static int _fwraid_filtering = 0; static int _pvmove = 0; static int _full_scan_done = 0; /* Restrict to one full scan during each cmd */ @@ -79,6 +80,11 @@ void init_md_filtering(int level) _md_filtering = level; } +void init_internal_filtering(int level) +{ + _internal_filtering = level; +} + void init_fwraid_filtering(int level) { _fwraid_filtering = level; @@ -242,6 +248,11 @@ int md_filtering(void) return _md_filtering; } +int internal_filtering(void) +{ + return _internal_filtering; +} + int fwraid_filtering(void) { return _fwraid_filtering; diff --git a/lib/misc/lvm-globals.h b/lib/misc/lvm-globals.h index 77c01b413..14a7d4366 100644 --- a/lib/misc/lvm-globals.h +++ b/lib/misc/lvm-globals.h @@ -26,6 +26,7 @@ void init_verbose(int level); void init_silent(int silent); void init_test(int level); void init_md_filtering(int level); +void init_internal_filtering(int level); void init_fwraid_filtering(int level); void init_pvmove(int level); void init_full_scan_done(int level); @@ -60,6 +61,7 @@ void set_sysfs_dir_path(const char *path); int test_mode(void); int md_filtering(void); +int internal_filtering(void); int fwraid_filtering(void); int pvmove_mode(void); int full_scan_done(void); |