8f74f52 qemu: fix alias name for <interface type='hostdev'>

Authored and Committed by Laine Stump 8 years ago
    qemu: fix alias name for <interface type='hostdev'>
    
    Starting with commit f8e712fe, if you start a domain that has an
    <interface type='hostdev' (or that has <interface type='network'>
    where the network is a pool of devices for hostdev assignment), when
    you later try to add *another* interface (of any kind) with hotplug,
    the function qemuAssignDeviceNetAlias() fails as soon as it sees a
    "hostdevN" alias in the list of interfaces), causing the attach to
    fail.
    
    This is because (starting with f8e712fe) the device alias names are
    assigned during the new function qemuProcessPrepareDomain(), which is
    called *before* networkAllocateActualDevice() (which is called from
    qemuProcessPrepareHost(), which is called from
    qemuProcessLaunch()). Prior to that commit,
    networkAllocateActualDevice() was called first.
    
    The problem with this is that the alias for interfaces that are really
    a hostdev (<interface type='hostdev'>) is of the form "hostdevN" (just
    like other hostdevs), while other interfaces are "netN". But if you
    don't know that the interface is going to be a hostdev at the time you
    assign the alias name, you can't name it differently. (As far as I've
    seen so far, the change in name by itself wouldn't have been a problem
    (other than just an outwardly noticeable change in behavior) except
    for the abovementioned failure to attach/detach new interfaces.
    
    Rather than take the chance that there may be other not-yet-revealed
    problems associated with changing the alias name, this patch changes
    the way that aliases are assigned to restore the old behavior.
    
    Old: In the past, assigning an alias to an interface was skipped if it
    was seen that the interface was type='hostdev' - we knew that the
    hostdev part of the interface was also in the list of hostdevs (that's
    part of what happens in networkAllocateActualDevice()) and it would be
    assigned when all the other hostdev aliases were assigned.
    
    New: When assigning an alias to an interface, we haven't yet called
    networkAllocateActualDevice() to construct the hostdev part of the
    interface, so we can't just wait for the loop that creates aliases for
    all the hostdevs (there's nothing on that list for this device
    yet!). Instead we handle it immediately in the loop creating interface
    aliases, by calling the new function networkGetActualType() to
    determine if it is going to be hostdev, and if so calling
    qemuAssignDeviceHostdevAlias() instead.
    
    Some adjustments have to be made to both
    qemuAssignDeviceHostdevAlias() and to qemuAssignDeviceNetAlias() to
    accommodate this. In both of them, an error return from
    qemuDomainDeviceAliasIndex() is no longer considered an error; instead
    it's just ignored (because it almost certainly means that the alias
    string for the device was "net" when we expected "hostdev" or vice
    versa). in qemuAssignDeviceHostdevAlias() we have to look at all
    interface aliases for hostdevN in addition to looking at all hostdev
    aliases (this wasn't necessary in the past, because both the interface
    entry and the hostdev entry for the device already pointed at the
    device info; no longer the case since the hostdev entry hasn't yet
    been setup).
    
    Fortunately the buggy behavior hasn't yet been in any official release
    of libvirt.
    
        
file modified
+33 -23