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: 2249455654
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>
This commit is contained in:
Michal Privoznik 2020-08-18 11:04:24 +02:00
parent 82bb167f0d
commit feb8564a3c

View File

@ -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",
@ -299,8 +307,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);
}