mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
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.
This commit is contained in:
parent
f0cafc9281
commit
3880ca5eca
@ -1,5 +1,6 @@
|
|||||||
Version 1.02.91 -
|
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
|
Version 1.02.90 - 1st September 2014
|
||||||
====================================
|
====================================
|
||||||
|
@ -336,17 +336,6 @@ static int _create_dm_bitset(void)
|
|||||||
#endif
|
#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)
|
static void _close_control_fd(void)
|
||||||
{
|
{
|
||||||
if (_control_fd != -1) {
|
if (_control_fd != -1) {
|
||||||
@ -423,6 +412,35 @@ bad:
|
|||||||
#endif
|
#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)
|
static void _dm_zfree_string(char *string)
|
||||||
{
|
{
|
||||||
if (string) {
|
if (string) {
|
||||||
|
Loading…
Reference in New Issue
Block a user