File 53d9af1e-ignore-devmapper-open-errors.patch of Package libvirt.16761

commit 53d9af1e7924757e3b5f661131dd707d7110d094
Author: Michal Prívozník <mprivozn@redhat.com>
Date:   Wed Aug 19 13:35:55 2020 +0200

    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>

Index: libvirt-5.1.0/src/util/virdevmapper.c
===================================================================
--- libvirt-5.1.0.orig/src/util/virdevmapper.c
+++ libvirt-5.1.0/src/util/virdevmapper.c
@@ -35,9 +35,12 @@
 # include "viralloc.h"
 # include "virstring.h"
 # include "virfile.h"
+# include "virlog.h"
 
 # define VIR_FROM_THIS VIR_FROM_STORAGE
 
+VIR_LOG_INIT("util.virdevmapper");
+
 # define PROC_DEVICES "/proc/devices"
 # define DM_NAME "device-mapper"
 # define DEV_DM_DIR "/dev/" DM_DIR
@@ -143,11 +146,16 @@ virDMOpen(void)
     memset(&dm, 0, sizeof(dm));
 
     if ((controlFD = open(CONTROL_PATH, O_RDWR)) < 0) {
-        if (errno == ENOENT)
-            return -2;
-
-        virReportSystemError(errno, _("Unable to open %s"), CONTROL_PATH);
-        return -1;
+        /* We can't talk to devmapper. Produce a warning and let
+         * the caller decide what to do next. */
+        if (errno == ENOENT) {
+            VIR_DEBUG("device mapper not available");
+        } else {
+            char ebuf[1024];
+            VIR_WARN("unable to open %s: %s",
+                     CONTROL_PATH, virStrerror(errno, ebuf, sizeof(ebuf)));
+        }
+        return -2;
     }
 
     if (!virDMIoctl(controlFD, DM_VERSION, &dm, &tmp)) {
@@ -362,9 +370,9 @@ virDevMapperGetTargets(const char *path,
 
     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. */
+            /* The CONTROL_PATH doesn't exist or is unusable.
+             * Probably the module isn't loaded, yet. Don't error
+             * out, just exit. */
             return 0;
         }
openSUSE Build Service is sponsored by