Honor blacklist for modprobe command

https://bugzilla.redhat.com/show_bug.cgi?id=1045124

When loading modules, libvirt does not honor the modprobe blacklist.
Use the new virKModLoad() API in order to attempt load with blacklist check.
Use the new virKModIsBlacklisted() API to check if the failure to load
was due to the blacklist

Signed-off-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
John Ferlan 2014-01-24 10:47:20 -05:00
parent 02bf6568f4
commit 19259574d5

View File

@ -42,6 +42,7 @@
#include "vircommand.h"
#include "virerror.h"
#include "virfile.h"
#include "virkmod.h"
#include "virstring.h"
#include "virutil.h"
@ -990,18 +991,32 @@ recheck:
VIR_FREE(drvpath);
if (!probed) {
const char *const probecmd[] = { MODPROBE, driver, NULL };
char *errbuf = NULL;
probed = true;
if (virRun(probecmd, NULL) < 0) {
char ebuf[1024];
VIR_WARN("failed to load driver %s: %s", driver,
virStrerror(errno, ebuf, sizeof(ebuf)));
return -1;
if ((errbuf = virKModLoad(driver, true))) {
VIR_WARN("failed to load driver %s: %s", driver, errbuf);
VIR_FREE(errbuf);
goto cleanup;
}
goto recheck;
}
cleanup:
/* If we know failure was because of blacklist, let's report that;
* otherwise, report a more generic failure message
*/
if (virKModIsBlacklisted(driver)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to load PCI stub module %s: "
"administratively prohibited"),
driver);
} else {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to load PCI stub module %s"),
driver);
}
return -1;
}
@ -1312,12 +1327,8 @@ virPCIDeviceDetach(virPCIDevicePtr dev,
virPCIDeviceList *activeDevs,
virPCIDeviceList *inactiveDevs)
{
if (virPCIProbeStubDriver(dev->stubDriver) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to load PCI stub module %s"),
dev->stubDriver);
if (virPCIProbeStubDriver(dev->stubDriver) < 0)
return -1;
}
if (activeDevs && virPCIDeviceListFind(activeDevs, dev)) {
virReportError(VIR_ERR_INTERNAL_ERROR,