summaryrefslogtreecommitdiffstats
path: root/lib/filters
diff options
context:
space:
mode:
authorAlasdair Kergon <agk@redhat.com>2010-07-02 02:09:57 +0000
committerAlasdair Kergon <agk@redhat.com>2010-07-02 02:09:57 +0000
commit9b95a5a9390b8fb21664ecfbc6126d570284852a (patch)
treec5fa0d922a9fce3a99b9844d134aba940f111347 /lib/filters
parentb5243aac02ad18a4d7e7e1467747d7bc5998aa54 (diff)
downloadlvm2-9b95a5a9390b8fb21664ecfbc6126d570284852a.tar.gz
lvm2-9b95a5a9390b8fb21664ecfbc6126d570284852a.tar.xz
lvm2-9b95a5a9390b8fb21664ecfbc6126d570284852a.zip
Always pass unsuspended dm devices through persistent filter to other filters.
Move test for suspended dm devices ahead of other filters.
Diffstat (limited to 'lib/filters')
-rw-r--r--lib/filters/filter-persistent.c28
-rw-r--r--lib/filters/filter.c13
-rw-r--r--lib/filters/filter.h1
3 files changed, 29 insertions, 13 deletions
diff --git a/lib/filters/filter-persistent.c b/lib/filters/filter-persistent.c
index 6574d698..5a016f84 100644
--- a/lib/filters/filter-persistent.c
+++ b/lib/filters/filter-persistent.c
@@ -16,9 +16,11 @@
#include "lib.h"
#include "config.h"
#include "dev-cache.h"
+#include "filter.h"
#include "filter-persistent.h"
#include "lvm-file.h"
#include "lvm-string.h"
+#include "activate.h"
#include <sys/stat.h>
#include <fcntl.h>
@@ -266,15 +268,31 @@ static int _lookup_p(struct dev_filter *f, struct device *dev)
void *l = dm_hash_lookup(pf->devices, dev_name(dev));
struct str_list *sl;
+ /* Cached BAD? */
+ if (l == PF_BAD_DEVICE) {
+ log_debug("%s: Skipping (cached)", dev_name(dev));
+ return 0;
+ }
+
+ /* Test dm devices every time, so cache them as GOOD. */
+ if (MAJOR(dev->dev) == dm_major()) {
+ if (!l)
+ dm_list_iterate_items(sl, &dev->aliases)
+ dm_hash_insert(pf->devices, sl->str, PF_GOOD_DEVICE);
+ if (ignore_suspended_devices() && !device_is_usable(dev)) {
+ log_debug("%s: Skipping (suspended/internal)", dev_name(dev));
+ return 0;
+ }
+ return pf->real->passes_filter(pf->real, dev);
+ }
+
+ /* Uncached */
if (!l) {
- l = pf->real->passes_filter(pf->real, dev) ?
- PF_GOOD_DEVICE : PF_BAD_DEVICE;
+ l = pf->real->passes_filter(pf->real, dev) ? PF_GOOD_DEVICE : PF_BAD_DEVICE;
dm_list_iterate_items(sl, &dev->aliases)
dm_hash_insert(pf->devices, sl->str, l);
-
- } else if (l == PF_BAD_DEVICE)
- log_debug("%s: Skipping (cached)", dev_name(dev));
+ }
return (l == PF_BAD_DEVICE) ? 0 : 1;
}
diff --git a/lib/filters/filter.c b/lib/filters/filter.c
index 889cb0db..eafa7260 100644
--- a/lib/filters/filter.c
+++ b/lib/filters/filter.c
@@ -42,6 +42,11 @@ static int _blkext_major = -1;
static int _drbd_major = -1;
static int _device_mapper_major = -1;
+int dm_major(void)
+{
+ return _device_mapper_major;
+}
+
int md_major(void)
{
return _md_major;
@@ -130,14 +135,6 @@ static int _passes_lvm_type_device_filter(struct dev_filter *f __attribute((unus
return 0;
}
- /* FIXME Always check 'layer' regardless of ignore_suspended_devices */
- /* Skip suspended devices */
- if (MAJOR(dev->dev) == _device_mapper_major &&
- ignore_suspended_devices() && !device_is_usable(dev)) {
- log_debug("%s: Skipping: Suspended or internal dm device", name);
- return 0;
- }
-
/* Check it's accessible */
if (!dev_open_flags(dev, O_RDONLY, 0, 1)) {
log_debug("%s: Skipping: open failed", name);
diff --git a/lib/filters/filter.h b/lib/filters/filter.h
index 4da33252..07611f9e 100644
--- a/lib/filters/filter.h
+++ b/lib/filters/filter.h
@@ -35,6 +35,7 @@ struct dev_filter *lvm_type_filter_create(const char *proc,
void lvm_type_filter_destroy(struct dev_filter *f);
+int dm_major(void);
int md_major(void);
int blkext_major(void);
int max_partitions(int major);