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