forked from pool/libvirt
101cb20b18
82bb167f-dont-cache-devmapper-major.patch, feb8564a-handle-no-devmapper.patch boo#1175465 OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=837
75 lines
2.7 KiB
Diff
75 lines
2.7 KiB
Diff
commit feb8564a3cc63bc8f68284063d53ec0d2d81a1cc
|
|
Author: Michal Prívozník <mprivozn@redhat.com>
|
|
Date: Tue Aug 18 11:04:24 2020 +0200
|
|
|
|
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>
|
|
|
|
Index: libvirt-6.6.0/src/util/virdevmapper.c
|
|
===================================================================
|
|
--- libvirt-6.6.0.orig/src/util/virdevmapper.c
|
|
+++ libvirt-6.6.0/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);
|
|
}
|