[lvm-devel] master - filter-mpath: use new 'udev' external device info source to get mpath component status

Peter Rajnoha prajnoha at fedoraproject.org
Fri Jan 30 12:32:01 UTC 2015


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=9c030e81a4e2d1e6b7024991c29114c59337553e
Commit:        9c030e81a4e2d1e6b7024991c29114c59337553e
Parent:        590fbd89618fa8fb2556c89c1d12b5deb5b5f1a4
Author:        Peter Rajnoha <prajnoha at redhat.com>
AuthorDate:    Wed Sep 3 15:48:37 2014 +0200
Committer:     Peter Rajnoha <prajnoha at redhat.com>
CommitterDate: Fri Jan 30 13:01:12 2015 +0100

filter-mpath: use new 'udev' external device info source to get mpath component status

mpath components are marked in udev db as:
  ID_FS_TYPE="mpath_member"
or
  DM_MULTIPATH_DEVICE_PATH="1"

(it depends on udev rule/blkid version used for handling mpath)
---
 lib/filters/filter-mpath.c |   48 ++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/lib/filters/filter-mpath.c b/lib/filters/filter-mpath.c
index 0f12c73..fefc8e0 100644
--- a/lib/filters/filter-mpath.c
+++ b/lib/filters/filter-mpath.c
@@ -15,6 +15,9 @@
 #include "lib.h"
 #include "filter.h"
 #include "activate.h"
+#ifdef UDEV_SYNC_SUPPORT
+#include <libudev.h>
+#endif
 
 #ifdef __linux__
 
@@ -141,7 +144,33 @@ static int _get_parent_mpath(const char *dir, char *name, int max_size)
 	return r;
 }
 
-static int _dev_is_mpath(struct dev_filter *f, struct device *dev)
+#ifdef UDEV_SYNC_SUPPORT
+static int _udev_dev_is_mpath(struct device *dev)
+{
+	const char *value;
+	struct dev_ext *ext;
+
+	if (!(ext = dev_ext_get(dev)))
+		return_0;
+
+	value = udev_device_get_property_value((struct udev_device *)ext->handle, "ID_FS_TYPE");
+	if (value && !strcmp(value, "mpath_member"))
+		return 1;
+
+	value = udev_device_get_property_value((struct udev_device *)ext->handle, "DM_MULTIPATH_DEVICE_PATH");
+	if (value && !strcmp(value, "1"))
+		return 1;
+
+	return 0;
+}
+#else
+static int _udev_dev_is_mpath(struct device *dev)
+{
+	return 0;
+}
+#endif
+
+static int _native_dev_is_mpath(struct dev_filter *f, struct device *dev)
 {
 	struct dev_types *dt = (struct dev_types *) f->private;
 	const char *part_name, *name;
@@ -200,10 +229,25 @@ static int _dev_is_mpath(struct dev_filter *f, struct device *dev)
 	return lvm_dm_prefix_check(major, minor, MPATH_PREFIX);
 }
 
+static int _dev_is_mpath(struct dev_filter *f, struct device *dev)
+{
+	if (dev->ext.src == DEV_EXT_NONE)
+		return _native_dev_is_mpath(f, dev);
+
+	if (dev->ext.src == DEV_EXT_UDEV)
+		return _udev_dev_is_mpath(dev);
+
+	log_error(INTERNAL_ERROR "Missing hook for mpath recognition "
+		  "using external device info source %s", dev_ext_name(dev));
+
+	return 0;
+}
+
 static int _ignore_mpath(struct dev_filter *f, struct device *dev)
 {
 	if (_dev_is_mpath(f, dev) == 1) {
-		log_debug_devs("%s: Skipping mpath component device", dev_name(dev));
+		log_debug_devs("%s: Skipping mpath component device [%s:%p]",
+				dev_name(dev), dev_ext_name(dev), dev->ext.handle);
 		return 0;
 	}
 




More information about the lvm-devel mailing list