summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2014-09-12 12:49:37 +0200
committerPeter Rajnoha <prajnoha@redhat.com>2014-09-12 12:49:37 +0200
commit3880ca5ecad1761bd13a190c58f8f85fdd7cd0e1 (patch)
treec48772bc2b9e62872c0a18d3df5bdb6e496649b0
parentf0cafc92812e285e5120241da04b5d119b27060b (diff)
downloadlvm2-3880ca5ecad1761bd13a190c58f8f85fdd7cd0e1.tar.gz
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.
-rw-r--r--WHATS_NEW_DM1
-rw-r--r--libdm/ioctl/libdm-iface.c40
2 files changed, 30 insertions, 11 deletions
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index 4effe09e0..1374934dd 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 7d50f3a7f..93509125b 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) {