[lvm-devel] dev-dct-process-latest - libdm: use dm-mod autoloading during dm_is_dm_major call if needed

David Teigland teigland at fedoraproject.org
Mon Sep 22 15:37:38 UTC 2014


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=3880ca5ecad1761bd13a190c58f8f85fdd7cd0e1
Commit:        3880ca5ecad1761bd13a190c58f8f85fdd7cd0e1
Parent:        f0cafc92812e285e5120241da04b5d119b27060b
Author:        Peter Rajnoha <prajnoha at redhat.com>
AuthorDate:    Fri Sep 12 12:49:37 2014 +0200
Committer:     Peter Rajnoha <prajnoha at redhat.com>
CommitterDate: Fri Sep 12 12:49:37 2014 +0200

libdm: use dm-mod autoloading during dm_is_dm_major call if needed

For dm_is_dm_major to determine whether the major number given as
an argument belongs to a DM device, libdm code needs to know what
the actual DM major is to do the comparison.

It may happen that the dm-mod module is not loaded during this
call and so for the completness let's try our best before we start
giving various errors - we can still make use of dm-mod autoloading,
though only since kernels 2.6.36 where this feature was introduced.
---
 WHATS_NEW_DM              |    1 +
 libdm/ioctl/libdm-iface.c |   40 +++++++++++++++++++++++++++++-----------
 2 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index 4effe09..1374934 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
 Version 1.02.91 - 
 ====================================
+  Use dm-mod autoloading during dm_is_dm_major call if needed (kernels>=2.6.36).
 
 Version 1.02.90 - 1st September 2014
 ====================================
diff --git a/libdm/ioctl/libdm-iface.c b/libdm/ioctl/libdm-iface.c
index 7d50f3a..9350912 100644
--- a/libdm/ioctl/libdm-iface.c
+++ b/libdm/ioctl/libdm-iface.c
@@ -336,17 +336,6 @@ static int _create_dm_bitset(void)
 #endif
 }
 
-int dm_is_dm_major(uint32_t major)
-{
-	if (!_create_dm_bitset())
-		return 0;
-
-	if (_dm_multiple_major_support)
-		return dm_bit(_dm_bitset, major) ? 1 : 0;
-	else
-		return (major == _dm_device_major) ? 1 : 0;
-}
-
 static void _close_control_fd(void)
 {
 	if (_control_fd != -1) {
@@ -423,6 +412,35 @@ bad:
 #endif
 }
 
+int dm_is_dm_major(uint32_t major)
+{
+	/*
+	 * If dm-mod module is not loaded yet during this call, we
+	 * can make it to load automatically in kernels >= 2.6.36
+	 * just by opening the dm control device. However, in older
+	 * kernels, there's nothing else we can do here - dm_is_dm_major
+	 * will fail as it can't determine this without the module
+	 * being loaded first - there's an error message issued for
+	 * this scenario deeper in this code.
+	 */
+	if (!_uname())
+		return 0;
+
+	if (KERNEL_VERSION(_kernel_major, _kernel_minor, _kernel_release) >=
+	    KERNEL_VERSION(2, 6, 36)) {
+		if (_control_fd == -1 && !_open_control())
+			return 0;
+	}
+
+	if (!_create_dm_bitset())
+		return 0;
+
+	if (_dm_multiple_major_support)
+		return dm_bit(_dm_bitset, major) ? 1 : 0;
+	else
+		return (major == _dm_device_major) ? 1 : 0;
+}
+
 static void _dm_zfree_string(char *string)
 {
 	if (string) {




More information about the lvm-devel mailing list