a41c76
From a9c950dcbac1f708bcd01111d4ec9b550db37fe3 Mon Sep 17 00:00:00 2001
a41c76
Message-Id: <a9c950dcbac1f708bcd01111d4ec9b550db37fe3@dist-git>
a41c76
From: Michal Privoznik <mprivozn@redhat.com>
a41c76
Date: Tue, 25 Aug 2020 17:16:06 +0200
a41c76
Subject: [PATCH] virdevmapper: Handle kernel without device-mapper support
a41c76
a41c76
In one of my latest patch (v6.6.0~30) I was trying to remove
a41c76
libdevmapper use in favor of our own implementation. However, the
a41c76
code did not take into account that device mapper can be not
a41c76
compiled into the kernel (e.g. be a separate module that's not
a41c76
loaded) in which case /proc/devices won't have the device-mapper
a41c76
major number and thus virDevMapperGetTargets() and/or
a41c76
virIsDevMapperDevice() fails.
a41c76
a41c76
However, such failure is safe to ignore, because if device mapper
a41c76
is missing then there can't be any multipath devices and thus we
a41c76
don't need to allow the deps in CGroups, nor create them in the
a41c76
domain private namespace, etc.
a41c76
a41c76
Fixes: 22494556542c676d1b9e7f1c1f2ea13ac17e1e3e
a41c76
Reported-by: Andrea Bolognani <abologna@redhat.com>
a41c76
Reported-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
a41c76
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
a41c76
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
a41c76
Reviewed-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
a41c76
Tested-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
a41c76
(cherry picked from commit feb8564a3cc63bc8f68284063d53ec0d2d81a1cc)
a41c76
a41c76
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1860421
a41c76
a41c76
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
a41c76
Message-Id: <71fcd93071dffdf4942ccce8671af7fcbcec397f.1598364552.git.mprivozn@redhat.com>
a41c76
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
a41c76
---
a41c76
 src/util/virdevmapper.c | 20 ++++++++++++++++++--
a41c76
 1 file changed, 18 insertions(+), 2 deletions(-)
a41c76
a41c76
diff --git a/src/util/virdevmapper.c b/src/util/virdevmapper.c
a41c76
index b43dbefa9a..a81e2edee4 100644
a41c76
--- a/src/util/virdevmapper.c
a41c76
+++ b/src/util/virdevmapper.c
a41c76
@@ -54,6 +54,9 @@ virDevMapperGetMajor(unsigned int *major)
a41c76
     VIR_AUTOSTRINGLIST lines = NULL;
a41c76
     size_t i;
a41c76
 
a41c76
+    if (!virFileExists(CONTROL_PATH))
a41c76
+        return -2;
a41c76
+
a41c76
     if (virFileReadAll(PROC_DEVICES, BUF_SIZE, &buf) < 0)
a41c76
         return -1;
a41c76
 
a41c76
@@ -126,8 +129,13 @@ virDMOpen(void)
a41c76
 
a41c76
     memset(&dm, 0, sizeof(dm));
a41c76
 
a41c76
-    if ((controlFD = open(CONTROL_PATH, O_RDWR)) < 0)
a41c76
+    if ((controlFD = open(CONTROL_PATH, O_RDWR)) < 0) {
a41c76
+        if (errno == ENOENT)
a41c76
+            return -2;
a41c76
+
a41c76
+        virReportSystemError(errno, _("Unable to open %s"), CONTROL_PATH);
a41c76
         return -1;
a41c76
+    }
a41c76
 
a41c76
     if (!virDMIoctl(controlFD, DM_VERSION, &dm, &tmp)) {
a41c76
         virReportSystemError(errno, "%s",
a41c76
@@ -300,8 +308,16 @@ virDevMapperGetTargets(const char *path,
a41c76
      * consist of devices or yet another targets. If that's the
a41c76
      * case, we have to stop recursion somewhere. */
a41c76
 
a41c76
-    if ((controlFD = virDMOpen()) < 0)
a41c76
+    if ((controlFD = virDMOpen()) < 0) {
a41c76
+        if (controlFD == -2) {
a41c76
+            /* The CONTROL_PATH doesn't exist. Probably the
a41c76
+             * module isn't loaded, yet. Don't error out, just
a41c76
+             * exit. */
a41c76
+            return 0;
a41c76
+        }
a41c76
+
a41c76
         return -1;
a41c76
+    }
a41c76
 
a41c76
     return virDevMapperGetTargetsImpl(controlFD, path, devPaths, ttl);
a41c76
 }
a41c76
-- 
a41c76
2.28.0
a41c76