mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 06:05:27 +00:00
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:
parent
82bb167f0d
commit
feb8564a3c
@ -54,6 +54,9 @@ virDevMapperGetMajor(unsigned int *major)
|
|||||||
VIR_AUTOSTRINGLIST lines = NULL;
|
VIR_AUTOSTRINGLIST lines = NULL;
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
|
if (!virFileExists(CONTROL_PATH))
|
||||||
|
return -2;
|
||||||
|
|
||||||
if (virFileReadAll(PROC_DEVICES, BUF_SIZE, &buf) < 0)
|
if (virFileReadAll(PROC_DEVICES, BUF_SIZE, &buf) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
@ -126,8 +129,13 @@ virDMOpen(void)
|
|||||||
|
|
||||||
memset(&dm, 0, sizeof(dm));
|
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;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!virDMIoctl(controlFD, DM_VERSION, &dm, &tmp)) {
|
if (!virDMIoctl(controlFD, DM_VERSION, &dm, &tmp)) {
|
||||||
virReportSystemError(errno, "%s",
|
virReportSystemError(errno, "%s",
|
||||||
@ -299,8 +307,16 @@ virDevMapperGetTargets(const char *path,
|
|||||||
* consist of devices or yet another targets. If that's the
|
* consist of devices or yet another targets. If that's the
|
||||||
* case, we have to stop recursion somewhere. */
|
* 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 -1;
|
||||||
|
}
|
||||||
|
|
||||||
return virDevMapperGetTargetsImpl(controlFD, path, devPaths, ttl);
|
return virDevMapperGetTargetsImpl(controlFD, path, devPaths, ttl);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user