[lvm-devel] master - filters: swap device_is_usable test
Zdenek Kabelac
zkabelac at fedoraproject.org
Thu Sep 3 21:36:07 UTC 2015
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=81a9da8f6190b567bb26f28ff02be0e6b10cad9a
Commit: 81a9da8f6190b567bb26f28ff02be0e6b10cad9a
Parent: a3c7e326c3e9950fe74e433c406d6e1b5a53bf25
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Wed Sep 2 16:08:30 2015 +0200
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Thu Sep 3 23:34:36 2015 +0200
filters: swap device_is_usable test
Fix regression introduced with commit:
2fc126b00d83991c6a2f3ed9aa61457294a4c45e
This commit has moved pv_min_size() test in front
of device_is_usable(). However pv_min_size needs to open device,
so it may have actually get blocked.
So restore the original order and first validate
dm device to be usable for open.
It's worth to note that such check is not 'race-free',
but it usually eliminates 99.99% of problems ;).
---
WHATS_NEW | 2 ++
lib/filters/filter-usable.c | 40 ++++++++++++++++++++--------------------
2 files changed, 22 insertions(+), 20 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 48b2a07..a7c7267 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,7 @@
Version 2.02.130 -
===================================
+ Check if dm device is usable before checking its size (2.02.116).
+ Extend parsing of cache_check version in configure.
Make lvpoll error messages visible in lvmpolld's stderr and in syslog.
Add 'make install_full_man' to install all man pages regardless of config.
diff --git a/lib/filters/filter-usable.c b/lib/filters/filter-usable.c
index e39cb54..9377661 100644
--- a/lib/filters/filter-usable.c
+++ b/lib/filters/filter-usable.c
@@ -112,26 +112,11 @@ static int _passes_usable_filter(struct dev_filter *f, struct device *dev)
{
filter_mode_t mode = *((filter_mode_t *) f->private);
struct dev_usable_check_params ucp = {0};
- int r;
-
- /* check if the device is not too small to hold a PV */
- switch (mode) {
- case FILTER_MODE_NO_LVMETAD:
- /* fall through */
- case FILTER_MODE_PRE_LVMETAD:
- if (!_check_pv_min_size(dev))
- return 0;
- break;
- case FILTER_MODE_POST_LVMETAD:
- /* nothing to do here */
- break;
- }
+ int r = 1;
/* further checks are done on dm devices only */
- if (!dm_is_dm_major(MAJOR(dev->dev)))
- return 1;
-
- switch (mode) {
+ if (dm_is_dm_major(MAJOR(dev->dev))) {
+ switch (mode) {
case FILTER_MODE_NO_LVMETAD:
ucp.check_empty = 1;
ucp.check_blocked = 1;
@@ -160,10 +145,25 @@ static int _passes_usable_filter(struct dev_filter *f, struct device *dev)
ucp.check_error_target = 0;
ucp.check_reserved = 0;
break;
+ }
+
+ if (!(r = device_is_usable(dev, ucp)))
+ log_debug_devs("%s: Skipping unusable device.", dev_name(dev));
}
- if (!(r = device_is_usable(dev, ucp)))
- log_debug_devs("%s: Skipping unusable device", dev_name(dev));
+ if (r) {
+ /* check if the device is not too small to hold a PV */
+ switch (mode) {
+ case FILTER_MODE_NO_LVMETAD:
+ /* fall through */
+ case FILTER_MODE_PRE_LVMETAD:
+ r = _check_pv_min_size(dev);
+ break;
+ case FILTER_MODE_POST_LVMETAD:
+ /* nothing to do here */
+ break;
+ }
+ }
return r;
}
More information about the lvm-devel
mailing list