summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2016-04-26 21:41:04 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2016-04-26 23:23:03 +0200
commitaa91fe3d3c3e6c2d8d96f5c0766b58375a44daa9 (patch)
tree190d9d1a21fc3486ecb078da3f12b7e052f54e8e
parentecae76c713bd4fa6c9d8f2a2c990625e4f38b504 (diff)
downloadlvm2-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_NEW1
-rw-r--r--lib/activate/activate.c17
2 files changed, 18 insertions, 0 deletions
diff --git a/WHATS_NEW b/WHATS_NEW
index 1aa335e6d..2a4fdd545 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -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);