From 9b95a5a9390b8fb21664ecfbc6126d570284852a Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Fri, 2 Jul 2010 02:09:57 +0000 Subject: Always pass unsuspended dm devices through persistent filter to other filters. Move test for suspended dm devices ahead of other filters. --- lib/filters/filter-persistent.c | 28 +++++++++++++++++++++++----- lib/filters/filter.c | 13 +++++-------- lib/filters/filter.h | 1 + 3 files changed, 29 insertions(+), 13 deletions(-) (limited to 'lib/filters') 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 #include @@ -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); -- cgit