[libvirt] [PATCH v3 3/3] Honor blacklist for modprobe command

Ján Tomko jtomko at redhat.com
Tue Feb 4 15:40:46 UTC 2014


On 02/04/2014 04:29 PM, John Ferlan wrote:
> 
> 
> On 02/04/2014 10:10 AM, Ján Tomko wrote:
>> On 02/04/2014 03:29 PM, John Ferlan wrote:
>>>
>>>
>>> On 02/04/2014 06:06 AM, Ján Tomko wrote:
>>>> On 01/30/2014 06:50 PM, John Ferlan wrote:
>>>>> +            VIR_FREE(errbuf);
>>>>> +            goto cleanup;
>>>>>          }
>>>>>  
>>>>>          goto recheck;
>>>>>      }
>>>>>  
>>>>> +    /* If we know failure was because of blacklist, let's report that */
>>>>> +    if (virKModIsBlacklisted(driver)) {
>>>>> +        virReportError(VIR_ERR_INTERNAL_ERROR,
>>>>> +                       _("Failed to load PCI stub module %s: "
>>>>> +                         "administratively prohibited"),
>>>>> +                       driver);
>>>>> +    }
>>>>> +
>>>>> +cleanup:
>>>>>      return -1;
>>>>>  }
>>>>>  
>>>>> @@ -1313,9 +1322,10 @@ virPCIDeviceDetach(virPCIDevicePtr dev,
>>>>>                     virPCIDeviceList *inactiveDevs)
>>>>>  {
>>>>>      if (virPCIProbeStubDriver(dev->stubDriver) < 0) {
>>>>> -        virReportError(VIR_ERR_INTERNAL_ERROR,
>>>>> -                       _("Failed to load PCI stub module %s"),
>>>>> -                       dev->stubDriver);
>>>>> +        if (virGetLastError() == NULL)
>>>>
>>>> This seems to be the only caller of virPCIProbeStubDriver.
>>>> You could just report the error unconditionally inside it.
>>>>
>>>
>>> Attempting to make the differentiation between load failed load failed
>>> because of administratively prohibited means an additional check or two
>>> in the caller.
>>
>> I meant that right now virPCIProbeStubDriver is only called from here and if
>> it did not report an error, we will report one here.
>>
>> It seemed cleaner not to report an error here and make virPCIProbeStubDriver
>> report an error in all cases (not just when the module is blacklisted and/or
>> on OOM in virPCIDriverDir).
>>
> 
> oh - ah... light dawns on marblehead.
> 
>>>
>>> Furthermore if something that virPCIProbeStubDriver() called provided
>>> some other error wouldn't it be better to not overwrite the message? If
>>> the virAsprintf() called by virPCIDriverDir() failed because of memory
>>> allocation, then which error message would be displayed without the
>>> virGetLastError() check? I guess I'm not 100% clear in my mind which
>>> error message would get displayed...
>>
>> Only the last reported error gets displayed, but both will get logged.
>>
>> Jan
>>
>>
> 
> The "last" message is what was important to someone using virt-install
> 
> so a "git diff master src/util/virpci.c" then has the following... 
> Basically an adjustment cleanup: label in order to handle both
> error conditions and removal of the error message from the caller
> (if you want to see a v4 I'll send it, but hopefully this is OK):
> 
> diff --git a/src/util/virpci.c b/src/util/virpci.c
> index e2d222e..c3d211f 100644
> --- a/src/util/virpci.c
> +++ b/src/util/virpci.c
> @@ -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);

Can you do virReportError here with the contents of errbuf (and return instead
of jumping to cleanup)?

> +            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,
> 

ACK

Jan


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140204/574d71eb/attachment-0001.sig>


More information about the libvir-list mailing list