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