diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2016-04-26 21:41:04 +0200 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2016-04-26 23:23:03 +0200 |
commit | aa91fe3d3c3e6c2d8d96f5c0766b58375a44daa9 (patch) | |
tree | 190d9d1a21fc3486ecb078da3f12b7e052f54e8e | |
parent | ecae76c713bd4fa6c9d8f2a2c990625e4f38b504 (diff) | |
download | lvm2-aa91fe3d3c3e6c2d8d96f5c0766b58375a44daa9.tar.gz |
modprobe: check /sys/module entry first
Before executing modprobe for given module name, just check
if the module is not already present in /sys/module.
Useful when checking dm-cache-policy modules as we do not
having matching interface like for targets.
-rw-r--r-- | WHATS_NEW | 1 | ||||
-rw-r--r-- | lib/activate/activate.c | 17 |
2 files changed, 18 insertions, 0 deletions
@@ -1,5 +1,6 @@ Version 2.02.152 - ================================== + Check first /sys/module/dm_* dir existance before using modprobe. Remove mpath from 10-dm.rules, superseded by 11-dm-mpath.rules (mpath>=0.6.0). Version 2.02.151 - 23rd April 2016 diff --git a/lib/activate/activate.c b/lib/activate/activate.c index 76afc3d6a..f554f1908 100644 --- a/lib/activate/activate.c +++ b/lib/activate/activate.c @@ -603,7 +603,24 @@ int module_present(struct cmd_context *cmd, const char *target_name) #ifdef MODPROBE_CMD char module[128]; const char *argv[] = { MODPROBE_CMD, module, NULL }; +#endif + struct stat st; + char path[PATH_MAX]; + int i = dm_snprintf(path, (sizeof(path) - 1), "%smodule/dm_%s", + dm_sysfs_dir(), target_name); + + if (i > 0) { + while (path[--i] != '/') /* stop on dm_ */ + if (path[i] == '-') + path[i] = '_'; /* replace '-' with '_' */ + + if ((lstat(path, &st) == 0) && S_ISDIR(st.st_mode)) { + log_debug("Module directory %s exists.", path); + return 1; + } + } +#ifdef MODPROBE_CMD if (dm_snprintf(module, sizeof(module), "dm-%s", target_name) < 0) { log_error("module_present module name too long: %s", target_name); |