diff options
Diffstat (limited to 'lib/filters/filter-persistent.c')
-rw-r--r-- | lib/filters/filter-persistent.c | 28 |
1 files changed, 23 insertions, 5 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; } |