|
|
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 |
|