Gitweb:
http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=32a6c11877946b...
Commit: 32a6c11877946bfc34a7af0821a793fd62f6bb36
Parent: 1260b86b2b76f5b1ab5fa6c0c324d8d6f3ba2173
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Wed Mar 18 16:19:58 2015 +0100
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Wed Mar 18 16:19:58 2015 +0100
pvscan: check sysfs dev entry before rescan
When pvscan --cache --major --minor command is issued from
udev REMOVE event, it basically resulted into a whole device
scan since the device was missing. So avoid such scan
and first check via /sysfs (when available) if such device actually
exists.
---
WHATS_NEW | 1 +
lib/device/dev-cache.c | 19 +++++++++++++++++++
2 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 51307cb..7d0038a 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.118 -
=================================
+ Avoid rescan of all devices when requested pvscan for removed device.
Measure configuration timestamps with nanoseconds when available.
Disable lvchange of major and minor of pool LVs.
Fix pvscan --cache to not scan and read ignored metadata areas on PVs.
diff --git a/lib/device/dev-cache.c b/lib/device/dev-cache.c
index 7ad9fb8..d594dd4 100644
--- a/lib/device/dev-cache.c
+++ b/lib/device/dev-cache.c
@@ -986,12 +986,31 @@ static struct device *_dev_cache_seek_devt(dev_t dev)
*/
struct device *dev_cache_get_by_devt(dev_t dev, struct dev_filter *f)
{
+ char path[PATH_MAX];
+ const char *sysfs_dir;
+ struct stat info;
struct device *d = _dev_cache_seek_devt(dev);
if (d && (d->flags & DEV_REGULAR))
return d;
if (!d) {
+ sysfs_dir = dm_sysfs_dir();
+ if (sysfs_dir && *sysfs_dir) {
+ /* First check if dev is sysfs to avoid useless scan */
+ if (dm_snprintf(path, sizeof(path), "%s/dev/block/%d:%d",
+ sysfs_dir, (int)MAJOR(dev), (int)MINOR(dev)) < 0) {
+ log_error("dm_snprintf partition failed.");
+ return NULL;
+ }
+
+ if (lstat(path, &info)) {
+ log_debug("No sysfs entry for %d:%d.",
+ (int)MAJOR(dev), (int)MINOR(dev));
+ return NULL;
+ }
+ }
+
_full_scan(0);
d = _dev_cache_seek_devt(dev);
}