1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

virdevmapper: Ignore all errors when opening /dev/mapper/control

So far, only ENOENT is ignored (to deal with kernels without
devmapper). However, as reported on the list, under certain
scenarios a different error can occur. For instance, when libvirt
is running inside a container which doesn't have permissions to
talk to the devmapper. If this is the case, then open() returns
-1 and sets errno=EPERM.

Assuming that multipath devices are fairly narrow use case and
using them in a restricted container is even more narrow the best
fix seems to be to ignore all open errors BUT produce a warning
on failure. To avoid flooding logs with warnings on kernels
without devmapper the level is reduced to a plain debug message.

Reported-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Reviewed-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Michal Privoznik 2020-08-19 13:35:55 +02:00
parent e41ac71fca
commit 53d9af1e79

View File

@ -35,9 +35,12 @@
# include "viralloc.h" # include "viralloc.h"
# include "virstring.h" # include "virstring.h"
# include "virfile.h" # include "virfile.h"
# include "virlog.h"
# define VIR_FROM_THIS VIR_FROM_STORAGE # define VIR_FROM_THIS VIR_FROM_STORAGE
VIR_LOG_INIT("util.virdevmapper");
# define PROC_DEVICES "/proc/devices" # define PROC_DEVICES "/proc/devices"
# define DM_NAME "device-mapper" # define DM_NAME "device-mapper"
# define DEV_DM_DIR "/dev/" DM_DIR # define DEV_DM_DIR "/dev/" DM_DIR
@ -130,11 +133,15 @@ 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) /* We can't talk to devmapper. Produce a warning and let
return -2; * the caller decide what to do next. */
if (errno == ENOENT) {
virReportSystemError(errno, _("Unable to open %s"), CONTROL_PATH); VIR_DEBUG("device mapper not available");
return -1; } else {
VIR_WARN("unable to open %s: %s",
CONTROL_PATH, g_strerror(errno));
}
return -2;
} }
if (!virDMIoctl(controlFD, DM_VERSION, &dm, &tmp)) { if (!virDMIoctl(controlFD, DM_VERSION, &dm, &tmp)) {
@ -309,9 +316,9 @@ virDevMapperGetTargets(const char *path,
if ((controlFD = virDMOpen()) < 0) { if ((controlFD = virDMOpen()) < 0) {
if (controlFD == -2) { if (controlFD == -2) {
/* The CONTROL_PATH doesn't exist. Probably the /* The CONTROL_PATH doesn't exist or is unusable.
* module isn't loaded, yet. Don't error out, just * Probably the module isn't loaded, yet. Don't error
* exit. */ * out, just exit. */
return 0; return 0;
} }