c401cc
From 58dcefeeb3ab01e687d1d73b0219db68cc79b362 Mon Sep 17 00:00:00 2001
c401cc
Message-Id: <58dcefeeb3ab01e687d1d73b0219db68cc79b362.1391615407.git.jdenemar@redhat.com>
c401cc
From: John Ferlan <jferlan@redhat.com>
c401cc
Date: Tue, 4 Feb 2014 13:34:55 -0500
c401cc
Subject: [PATCH] Honor blacklist for modprobe command
c401cc
c401cc
https://bugzilla.redhat.com/show_bug.cgi?id=1045124
c401cc
c401cc
When loading modules, libvirt does not honor the modprobe blacklist.
c401cc
Use the new virKModLoad() API in order to attempt load with blacklist check.
c401cc
Use the new virKModIsBlacklisted() API to check if the failure to load
c401cc
was due to the blacklist
c401cc
c401cc
Signed-off-by: John Ferlan <jferlan@redhat.com>
c401cc
(cherry picked from commit 19259574d58d0cfaa95593b484508e50c5a24b43)
c401cc
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
c401cc
---
c401cc
 src/util/virpci.c | 33 ++++++++++++++++++++++-----------
c401cc
 1 file changed, 22 insertions(+), 11 deletions(-)
c401cc
c401cc
diff --git a/src/util/virpci.c b/src/util/virpci.c
c401cc
index f689961..3a21975 100644
c401cc
--- a/src/util/virpci.c
c401cc
+++ b/src/util/virpci.c
c401cc
@@ -42,6 +42,7 @@
c401cc
 #include "vircommand.h"
c401cc
 #include "virerror.h"
c401cc
 #include "virfile.h"
c401cc
+#include "virkmod.h"
c401cc
 #include "virstring.h"
c401cc
 #include "virutil.h"
c401cc
 
c401cc
@@ -958,18 +959,32 @@ recheck:
c401cc
     VIR_FREE(drvpath);
c401cc
 
c401cc
     if (!probed) {
c401cc
-        const char *const probecmd[] = { MODPROBE, driver, NULL };
c401cc
+        char *errbuf = NULL;
c401cc
         probed = true;
c401cc
-        if (virRun(probecmd, NULL) < 0) {
c401cc
-            char ebuf[1024];
c401cc
-            VIR_WARN("failed to load driver %s: %s", driver,
c401cc
-                     virStrerror(errno, ebuf, sizeof(ebuf)));
c401cc
-            return -1;
c401cc
+        if ((errbuf = virKModLoad(driver, true))) {
c401cc
+            VIR_WARN("failed to load driver %s: %s", driver, errbuf);
c401cc
+            VIR_FREE(errbuf);
c401cc
+            goto cleanup;
c401cc
         }
c401cc
 
c401cc
         goto recheck;
c401cc
     }
c401cc
 
c401cc
+cleanup:
c401cc
+    /* If we know failure was because of blacklist, let's report that;
c401cc
+     * otherwise, report a more generic failure message
c401cc
+     */
c401cc
+    if (virKModIsBlacklisted(driver)) {
c401cc
+        virReportError(VIR_ERR_INTERNAL_ERROR,
c401cc
+                       _("Failed to load PCI stub module %s: "
c401cc
+                         "administratively prohibited"),
c401cc
+                       driver);
c401cc
+    } else {
c401cc
+        virReportError(VIR_ERR_INTERNAL_ERROR,
c401cc
+                       _("Failed to load PCI stub module %s"),
c401cc
+                       driver);
c401cc
+    }
c401cc
+
c401cc
     return -1;
c401cc
 }
c401cc
 
c401cc
@@ -1271,12 +1286,8 @@ virPCIDeviceDetach(virPCIDevicePtr dev,
c401cc
                    virPCIDeviceList *activeDevs,
c401cc
                    virPCIDeviceList *inactiveDevs)
c401cc
 {
c401cc
-    if (virPCIProbeStubDriver(dev->stubDriver) < 0) {
c401cc
-        virReportError(VIR_ERR_INTERNAL_ERROR,
c401cc
-                       _("Failed to load PCI stub module %s"),
c401cc
-                       dev->stubDriver);
c401cc
+    if (virPCIProbeStubDriver(dev->stubDriver) < 0)
c401cc
         return -1;
c401cc
-    }
c401cc
 
c401cc
     if (activeDevs && virPCIDeviceListFind(activeDevs, dev)) {
c401cc
         virReportError(VIR_ERR_INTERNAL_ERROR,
c401cc
-- 
c401cc
1.8.5.3
c401cc