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