3cf992
From 8474f0f611f4372bd4f98c6df92f50566f631db0 Mon Sep 17 00:00:00 2001
3cf992
Message-Id: <8474f0f611f4372bd4f98c6df92f50566f631db0@dist-git>
3cf992
From: Michal Privoznik <mprivozn@redhat.com>
3cf992
Date: Mon, 8 Mar 2021 12:57:33 +0100
3cf992
Subject: [PATCH] virdevmapper: Handle kernel without device-mapper support
3cf992
MIME-Version: 1.0
3cf992
Content-Type: text/plain; charset=UTF-8
3cf992
Content-Transfer-Encoding: 8bit
3cf992
3cf992
In one of my latest patch (v6.6.0~30) I was trying to remove
3cf992
libdevmapper use in favor of our own implementation. However, the
3cf992
code did not take into account that device mapper can be not
3cf992
compiled into the kernel (e.g. be a separate module that's not
3cf992
loaded) in which case /proc/devices won't have the device-mapper
3cf992
major number and thus virDevMapperGetTargets() and/or
3cf992
virIsDevMapperDevice() fails.
3cf992
3cf992
However, such failure is safe to ignore, because if device mapper
3cf992
is missing then there can't be any multipath devices and thus we
3cf992
don't need to allow the deps in CGroups, nor create them in the
3cf992
domain private namespace, etc.
3cf992
3cf992
Fixes: 22494556542c676d1b9e7f1c1f2ea13ac17e1e3e
3cf992
Reported-by: Andrea Bolognani <abologna@redhat.com>
3cf992
Reported-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
3cf992
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
3cf992
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
3cf992
Reviewed-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
3cf992
Tested-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
3cf992
(cherry picked from commit feb8564a3cc63bc8f68284063d53ec0d2d81a1cc)
3cf992
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1933557
3cf992
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
3cf992
Message-Id: <11f41c0fd7b7c8365e24398173cb0bb2f8e785de.1615203117.git.mprivozn@redhat.com>
3cf992
Reviewed-by: Ján Tomko <jtomko@redhat.com>
3cf992
---
3cf992
 src/util/virdevmapper.c | 20 ++++++++++++++++++--
3cf992
 1 file changed, 18 insertions(+), 2 deletions(-)
3cf992
3cf992
diff --git a/src/util/virdevmapper.c b/src/util/virdevmapper.c
3cf992
index 725de736c1..a76fe95922 100644
3cf992
--- a/src/util/virdevmapper.c
3cf992
+++ b/src/util/virdevmapper.c
3cf992
@@ -57,6 +57,9 @@ virDevMapperGetMajor(unsigned int *major)
3cf992
     VIR_AUTOSTRINGLIST lines = NULL;
3cf992
     size_t i;
3cf992
 
3cf992
+    if (!virFileExists(CONTROL_PATH))
3cf992
+        return -2;
3cf992
+
3cf992
     if (virFileReadAll(PROC_DEVICES, BUF_SIZE, &buf) < 0)
3cf992
         return -1;
3cf992
 
3cf992
@@ -130,8 +133,13 @@ virDMOpen(void)
3cf992
 
3cf992
     memset(&dm, 0, sizeof(dm));
3cf992
 
3cf992
-    if ((controlFD = open(CONTROL_PATH, O_RDWR)) < 0)
3cf992
+    if ((controlFD = open(CONTROL_PATH, O_RDWR)) < 0) {
3cf992
+        if (errno == ENOENT)
3cf992
+            return -2;
3cf992
+
3cf992
+        virReportSystemError(errno, _("Unable to open %s"), CONTROL_PATH);
3cf992
         return -1;
3cf992
+    }
3cf992
 
3cf992
     if (!virDMIoctl(controlFD, DM_VERSION, &dm, &tmp)) {
3cf992
         virReportSystemError(errno, "%s",
3cf992
@@ -313,8 +321,16 @@ virDevMapperGetTargets(const char *path,
3cf992
      * consist of devices or yet another targets. If that's the
3cf992
      * case, we have to stop recursion somewhere. */
3cf992
 
3cf992
-    if ((controlFD = virDMOpen()) < 0)
3cf992
+    if ((controlFD = virDMOpen()) < 0) {
3cf992
+        if (controlFD == -2) {
3cf992
+            /* The CONTROL_PATH doesn't exist. Probably the
3cf992
+             * module isn't loaded, yet. Don't error out, just
3cf992
+             * exit. */
3cf992
+            return 0;
3cf992
+        }
3cf992
+
3cf992
         return -1;
3cf992
+    }
3cf992
 
3cf992
     return virDevMapperGetTargetsImpl(controlFD, path, devPaths, ttl);
3cf992
 }
3cf992
-- 
3cf992
2.31.0
3cf992