summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.in1
-rw-r--r--lib/commands/toolcontext.c9
-rw-r--r--lib/filters/filter-internal.c81
-rw-r--r--lib/filters/filter.h4
-rw-r--r--lib/misc/lvm-globals.c11
-rw-r--r--lib/misc/lvm-globals.h2
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);