2016-02-16 10:24:35 -05:00
|
|
|
/*
|
|
|
|
* qemu_alias.c: QEMU alias manipulation
|
|
|
|
*
|
|
|
|
* Copyright (C) 2006-2016 Red Hat, Inc.
|
|
|
|
* Copyright (C) 2006 Daniel P. Berrange
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library. If not, see
|
|
|
|
* <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
* Author: Daniel P. Berrange <berrange@redhat.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "qemu_alias.h"
|
|
|
|
#include "viralloc.h"
|
|
|
|
#include "virlog.h"
|
|
|
|
#include "virstring.h"
|
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.
2016-04-01 13:18:57 -04:00
|
|
|
#include "network/bridge_driver.h"
|
2016-02-16 10:24:35 -05:00
|
|
|
|
|
|
|
#define VIR_FROM_THIS VIR_FROM_QEMU
|
|
|
|
|
|
|
|
VIR_LOG_INIT("qemu.qemu_alias");
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuDomainDeviceAliasIndex(const virDomainDeviceInfo *info,
|
|
|
|
const char *prefix)
|
|
|
|
{
|
|
|
|
int idx;
|
|
|
|
|
|
|
|
if (!info->alias)
|
|
|
|
return -1;
|
|
|
|
if (!STRPREFIX(info->alias, prefix))
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (virStrToLong_i(info->alias + strlen(prefix), NULL, 10, &idx) < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
return idx;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static ssize_t
|
|
|
|
qemuGetNextChrDevIndex(virDomainDefPtr def,
|
|
|
|
virDomainChrDefPtr chr,
|
|
|
|
const char *prefix)
|
|
|
|
{
|
|
|
|
const virDomainChrDef **arrPtr;
|
|
|
|
size_t cnt;
|
|
|
|
size_t i;
|
|
|
|
ssize_t idx = 0;
|
|
|
|
const char *prefix2 = NULL;
|
|
|
|
|
|
|
|
if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE)
|
|
|
|
prefix2 = "serial";
|
|
|
|
|
|
|
|
virDomainChrGetDomainPtrs(def, chr->deviceType, &arrPtr, &cnt);
|
|
|
|
|
|
|
|
for (i = 0; i < cnt; i++) {
|
|
|
|
ssize_t thisidx;
|
|
|
|
if (((thisidx = qemuDomainDeviceAliasIndex(&arrPtr[i]->info, prefix)) < 0) &&
|
|
|
|
(prefix2 &&
|
|
|
|
(thisidx = qemuDomainDeviceAliasIndex(&arrPtr[i]->info, prefix2)) < 0)) {
|
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
|
_("Unable to determine device index for character device"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (thisidx >= idx)
|
|
|
|
idx = thisidx + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return idx;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuAssignDeviceChrAlias(virDomainDefPtr def,
|
|
|
|
virDomainChrDefPtr chr,
|
|
|
|
ssize_t idx)
|
|
|
|
{
|
|
|
|
const char *prefix = NULL;
|
|
|
|
|
|
|
|
switch ((virDomainChrDeviceType) chr->deviceType) {
|
|
|
|
case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL:
|
|
|
|
prefix = "parallel";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL:
|
|
|
|
prefix = "serial";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
|
|
|
|
prefix = "console";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL:
|
|
|
|
prefix = "channel";
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (idx == -1 && (idx = qemuGetNextChrDevIndex(def, chr, prefix)) < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
return virAsprintf(&chr->info.alias, "%s%zd", prefix, idx);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuAssignDeviceControllerAlias(virDomainDefPtr domainDef,
|
|
|
|
virQEMUCapsPtr qemuCaps,
|
|
|
|
virDomainControllerDefPtr controller)
|
|
|
|
{
|
|
|
|
const char *prefix = virDomainControllerTypeToString(controller->type);
|
|
|
|
|
|
|
|
if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_PCI) {
|
|
|
|
if (!virQEMUCapsHasPCIMultiBus(qemuCaps, domainDef)) {
|
|
|
|
/* qemus that don't support multiple PCI buses have
|
|
|
|
* hardcoded the name of their single PCI controller as
|
|
|
|
* "pci".
|
|
|
|
*/
|
|
|
|
return VIR_STRDUP(controller->info.alias, "pci");
|
|
|
|
} else if (controller->model == VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT) {
|
|
|
|
/* The pcie-root controller on Q35 machinetypes uses a
|
|
|
|
* different naming convention ("pcie.0"), because it is
|
|
|
|
* hardcoded that way in qemu.
|
|
|
|
*/
|
|
|
|
return virAsprintf(&controller->info.alias, "pcie.%d", controller->idx);
|
|
|
|
}
|
|
|
|
/* All other PCI controllers use the consistent "pci.%u"
|
|
|
|
* (including the hardcoded pci-root controller on
|
|
|
|
* multibus-capable qemus).
|
|
|
|
*/
|
|
|
|
return virAsprintf(&controller->info.alias, "pci.%d", controller->idx);
|
|
|
|
} else if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE) {
|
|
|
|
/* for any machine based on e.g. I440FX or G3Beige, the
|
|
|
|
* first (and currently only) IDE controller is an integrated
|
|
|
|
* controller hardcoded with id "ide"
|
|
|
|
*/
|
|
|
|
if (qemuDomainMachineHasBuiltinIDE(domainDef) &&
|
|
|
|
controller->idx == 0)
|
|
|
|
return VIR_STRDUP(controller->info.alias, "ide");
|
|
|
|
} else if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) {
|
|
|
|
/* for any Q35 machine, the first SATA controller is the
|
|
|
|
* integrated one, and it too is hardcoded with id "ide"
|
|
|
|
*/
|
|
|
|
if (qemuDomainMachineIsQ35(domainDef) && controller->idx == 0)
|
|
|
|
return VIR_STRDUP(controller->info.alias, "ide");
|
|
|
|
} else if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) {
|
|
|
|
/* first USB device is "usb", others are normal "usb%d" */
|
|
|
|
if (controller->idx == 0)
|
|
|
|
return VIR_STRDUP(controller->info.alias, "usb");
|
|
|
|
}
|
|
|
|
/* all other controllers use the default ${type}${index} naming
|
|
|
|
* scheme for alias/id.
|
|
|
|
*/
|
|
|
|
return virAsprintf(&controller->info.alias, "%s%d", prefix, controller->idx);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Names used before -drive supported the id= option */
|
|
|
|
static int
|
|
|
|
qemuAssignDeviceDiskAliasFixed(virDomainDiskDefPtr disk)
|
|
|
|
{
|
|
|
|
int busid, devid;
|
|
|
|
int ret;
|
|
|
|
char *dev_name;
|
|
|
|
|
|
|
|
if (virDiskNameToBusDeviceIndex(disk, &busid, &devid) < 0) {
|
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
_("cannot convert disk '%s' to bus/device index"),
|
|
|
|
disk->dst);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (disk->bus) {
|
|
|
|
case VIR_DOMAIN_DISK_BUS_IDE:
|
|
|
|
if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
|
|
|
|
ret = virAsprintf(&dev_name, "ide%d-hd%d", busid, devid);
|
|
|
|
else
|
|
|
|
ret = virAsprintf(&dev_name, "ide%d-cd%d", busid, devid);
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_DISK_BUS_SCSI:
|
|
|
|
if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
|
|
|
|
ret = virAsprintf(&dev_name, "scsi%d-hd%d", busid, devid);
|
|
|
|
else
|
|
|
|
ret = virAsprintf(&dev_name, "scsi%d-cd%d", busid, devid);
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_DISK_BUS_FDC:
|
|
|
|
ret = virAsprintf(&dev_name, "floppy%d", devid);
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_DISK_BUS_VIRTIO:
|
|
|
|
ret = virAsprintf(&dev_name, "virtio%d", devid);
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_DISK_BUS_XEN:
|
|
|
|
ret = virAsprintf(&dev_name, "xenblk%d", devid);
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_DISK_BUS_SD:
|
|
|
|
ret = virAsprintf(&dev_name, "sd%d", devid);
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_DISK_BUS_USB:
|
|
|
|
ret = virAsprintf(&dev_name, "usb%d", devid);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
|
|
_("Unsupported disk name mapping for bus '%s'"),
|
|
|
|
virDomainDiskBusTypeToString(disk->bus));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ret == -1)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
disk->info.alias = dev_name;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Our custom -drive naming scheme used with id= */
|
|
|
|
static int
|
|
|
|
qemuAssignDeviceDiskAliasCustom(virDomainDefPtr def,
|
|
|
|
virDomainDiskDefPtr disk,
|
|
|
|
virQEMUCapsPtr qemuCaps)
|
|
|
|
{
|
|
|
|
const char *prefix = virDomainDiskBusTypeToString(disk->bus);
|
|
|
|
int controllerModel = -1;
|
|
|
|
|
|
|
|
if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
|
|
|
|
if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
|
|
|
|
controllerModel =
|
|
|
|
virDomainDeviceFindControllerModel(def, &disk->info,
|
|
|
|
VIR_DOMAIN_CONTROLLER_TYPE_SCSI);
|
|
|
|
|
|
|
|
if ((qemuDomainSetSCSIControllerModel(def, qemuCaps,
|
|
|
|
&controllerModel)) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI ||
|
|
|
|
controllerModel == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC) {
|
|
|
|
if (virAsprintf(&disk->info.alias, "%s%d-%d-%d", prefix,
|
|
|
|
disk->info.addr.drive.controller,
|
|
|
|
disk->info.addr.drive.bus,
|
|
|
|
disk->info.addr.drive.unit) < 0)
|
|
|
|
return -1;
|
|
|
|
} else {
|
|
|
|
if (virAsprintf(&disk->info.alias, "%s%d-%d-%d-%d", prefix,
|
|
|
|
disk->info.addr.drive.controller,
|
|
|
|
disk->info.addr.drive.bus,
|
|
|
|
disk->info.addr.drive.target,
|
|
|
|
disk->info.addr.drive.unit) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
int idx = virDiskNameToIndex(disk->dst);
|
|
|
|
if (virAsprintf(&disk->info.alias, "%s-disk%d", prefix, idx) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuAssignDeviceDiskAlias(virDomainDefPtr vmdef,
|
|
|
|
virDomainDiskDefPtr def,
|
|
|
|
virQEMUCapsPtr qemuCaps)
|
|
|
|
{
|
|
|
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
|
|
|
|
return qemuAssignDeviceDiskAliasCustom(vmdef, def, qemuCaps);
|
|
|
|
else
|
|
|
|
return qemuAssignDeviceDiskAliasFixed(def);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuAssignDeviceHostdevAlias(virDomainDefPtr def,
|
2016-04-01 10:40:23 -04:00
|
|
|
char **alias,
|
2016-02-16 10:24:35 -05:00
|
|
|
int idx)
|
|
|
|
{
|
|
|
|
if (idx == -1) {
|
|
|
|
size_t i;
|
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.
2016-04-01 13:18:57 -04:00
|
|
|
|
2016-02-16 10:24:35 -05:00
|
|
|
idx = 0;
|
|
|
|
for (i = 0; i < def->nhostdevs; i++) {
|
|
|
|
int thisidx;
|
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.
2016-04-01 13:18:57 -04:00
|
|
|
|
|
|
|
if ((thisidx = qemuDomainDeviceAliasIndex(def->hostdevs[i]->info, "hostdev")) < 0)
|
|
|
|
continue; /* error just means the alias wasn't "hostdevN", but something else */
|
|
|
|
if (thisidx >= idx)
|
|
|
|
idx = thisidx + 1;
|
|
|
|
}
|
|
|
|
/* network interfaces can also have a hostdevN alias */
|
|
|
|
for (i = 0; i < def->nnets; i++) {
|
|
|
|
int thisidx;
|
|
|
|
|
|
|
|
if ((thisidx = qemuDomainDeviceAliasIndex(&def->nets[i]->info, "hostdev")) < 0)
|
|
|
|
continue;
|
2016-02-16 10:24:35 -05:00
|
|
|
if (thisidx >= idx)
|
|
|
|
idx = thisidx + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-01 10:40:23 -04:00
|
|
|
if (virAsprintf(alias, "hostdev%d", idx) < 0)
|
2016-02-16 10:24:35 -05:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuAssignDeviceNetAlias(virDomainDefPtr def,
|
|
|
|
virDomainNetDefPtr net,
|
|
|
|
int idx)
|
|
|
|
{
|
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.
2016-04-01 13:18:57 -04:00
|
|
|
|
|
|
|
/* <interface type='hostdev'> uses "hostdevN" as the alias
|
|
|
|
* We must use "-1" as the index because the caller doesn't know
|
|
|
|
* that we're now looking for a unique hostdevN rather than netN
|
|
|
|
*/
|
|
|
|
if (networkGetActualType(net) == VIR_DOMAIN_NET_TYPE_HOSTDEV)
|
|
|
|
return qemuAssignDeviceHostdevAlias(def, &net->info.alias, -1);
|
|
|
|
|
2016-02-16 10:24:35 -05:00
|
|
|
if (idx == -1) {
|
|
|
|
size_t i;
|
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.
2016-04-01 13:18:57 -04:00
|
|
|
|
2016-02-16 10:24:35 -05:00
|
|
|
idx = 0;
|
|
|
|
for (i = 0; i < def->nnets; i++) {
|
|
|
|
int thisidx;
|
|
|
|
|
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.
2016-04-01 13:18:57 -04:00
|
|
|
if ((thisidx = qemuDomainDeviceAliasIndex(&def->nets[i]->info, "net")) < 0)
|
|
|
|
continue; /* failure could be due to "hostdevN" */
|
2016-02-16 10:24:35 -05:00
|
|
|
if (thisidx >= idx)
|
|
|
|
idx = thisidx + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virAsprintf(&net->info.alias, "net%d", idx) < 0)
|
|
|
|
return -1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuAssignDeviceRedirdevAlias(virDomainDefPtr def,
|
|
|
|
virDomainRedirdevDefPtr redirdev,
|
|
|
|
int idx)
|
|
|
|
{
|
|
|
|
if (idx == -1) {
|
|
|
|
size_t i;
|
|
|
|
idx = 0;
|
|
|
|
for (i = 0; i < def->nredirdevs; i++) {
|
|
|
|
int thisidx;
|
|
|
|
if ((thisidx = qemuDomainDeviceAliasIndex(&def->redirdevs[i]->info, "redir")) < 0) {
|
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
|
_("Unable to determine device index for redirected device"));
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (thisidx >= idx)
|
|
|
|
idx = thisidx + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virAsprintf(&redirdev->info.alias, "redir%d", idx) < 0)
|
|
|
|
return -1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
2016-04-06 17:32:12 +02:00
|
|
|
qemuAssignDeviceRNGAlias(virDomainDefPtr def,
|
|
|
|
virDomainRNGDefPtr rng)
|
2016-02-16 10:24:35 -05:00
|
|
|
{
|
2016-04-06 17:32:12 +02:00
|
|
|
size_t i;
|
|
|
|
int maxidx = 0;
|
|
|
|
int idx;
|
|
|
|
|
|
|
|
for (i = 0; i < def->nrngs; i++) {
|
|
|
|
if ((idx = qemuDomainDeviceAliasIndex(&def->rngs[i]->info, "rng")) >= maxidx)
|
|
|
|
maxidx = idx + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virAsprintf(&rng->info.alias, "rng%d", maxidx) < 0)
|
2016-04-06 17:32:12 +02:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuAssignDeviceMemoryAlias(virDomainDefPtr def,
|
|
|
|
virDomainMemoryDefPtr mem)
|
|
|
|
{
|
|
|
|
size_t i;
|
|
|
|
int maxidx = 0;
|
|
|
|
int idx;
|
|
|
|
|
|
|
|
for (i = 0; i < def->nmems; i++) {
|
|
|
|
if ((idx = qemuDomainDeviceAliasIndex(&def->mems[i]->info, "dimm")) >= maxidx)
|
|
|
|
maxidx = idx + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virAsprintf(&mem->info.alias, "dimm%d", maxidx) < 0)
|
2016-02-16 10:24:35 -05:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
|
|
|
|
{
|
|
|
|
size_t i;
|
|
|
|
|
|
|
|
for (i = 0; i < def->ndisks; i++) {
|
|
|
|
if (qemuAssignDeviceDiskAlias(def, def->disks[i], qemuCaps) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nnets; i++) {
|
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.
2016-04-01 13:18:57 -04:00
|
|
|
if (qemuAssignDeviceNetAlias(def, def->nets[i], -1) < 0)
|
2016-02-16 10:24:35 -05:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
for (i = 0; i < def->nfss; i++) {
|
|
|
|
if (virAsprintf(&def->fss[i]->info.alias, "fs%zu", i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nsounds; i++) {
|
|
|
|
if (virAsprintf(&def->sounds[i]->info.alias, "sound%zu", i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nhostdevs; i++) {
|
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.
2016-04-01 13:18:57 -04:00
|
|
|
/* we can't start assigning at 0, since netdevs may have used
|
|
|
|
* up some hostdevN entries already. Also if the HostdevDef is
|
|
|
|
* linked to a NetDef, they will share an info and the alias
|
|
|
|
* will already be set, so don't try to set it again.
|
|
|
|
*/
|
|
|
|
if (!def->hostdevs[i]->info->alias &&
|
|
|
|
qemuAssignDeviceHostdevAlias(def, &def->hostdevs[i]->info->alias, -1) < 0)
|
2016-02-16 10:24:35 -05:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nredirdevs; i++) {
|
|
|
|
if (qemuAssignDeviceRedirdevAlias(def, def->redirdevs[i], i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nvideos; i++) {
|
|
|
|
if (virAsprintf(&def->videos[i]->info.alias, "video%zu", i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->ncontrollers; i++) {
|
|
|
|
if (qemuAssignDeviceControllerAlias(def, qemuCaps, def->controllers[i]) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->ninputs; i++) {
|
|
|
|
if (virAsprintf(&def->inputs[i]->info.alias, "input%zu", i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nparallels; i++) {
|
|
|
|
if (qemuAssignDeviceChrAlias(def, def->parallels[i], i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nserials; i++) {
|
|
|
|
if (qemuAssignDeviceChrAlias(def, def->serials[i], i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nchannels; i++) {
|
|
|
|
if (qemuAssignDeviceChrAlias(def, def->channels[i], i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nconsoles; i++) {
|
|
|
|
if (qemuAssignDeviceChrAlias(def, def->consoles[i], i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nhubs; i++) {
|
|
|
|
if (virAsprintf(&def->hubs[i]->info.alias, "hub%zu", i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nshmems; i++) {
|
|
|
|
if (virAsprintf(&def->shmems[i]->info.alias, "shmem%zu", i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nsmartcards; i++) {
|
|
|
|
if (virAsprintf(&def->smartcards[i]->info.alias, "smartcard%zu", i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (def->watchdog) {
|
|
|
|
if (virAsprintf(&def->watchdog->info.alias, "watchdog%d", 0) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (def->memballoon) {
|
|
|
|
if (virAsprintf(&def->memballoon->info.alias, "balloon%d", 0) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nrngs; i++) {
|
2016-04-06 17:32:12 +02:00
|
|
|
if (virAsprintf(&def->rngs[i]->info.alias, "rng%zu", i) < 0)
|
2016-02-16 10:24:35 -05:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (def->tpm) {
|
|
|
|
if (virAsprintf(&def->tpm->info.alias, "tpm%d", 0) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for (i = 0; i < def->nmems; i++) {
|
|
|
|
if (virAsprintf(&def->mems[i]->info.alias, "dimm%zu", i) < 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2016-02-26 16:29:58 +01:00
|
|
|
|
|
|
|
|
|
|
|
char *
|
|
|
|
qemuAliasFromDisk(const virDomainDiskDef *disk)
|
|
|
|
{
|
|
|
|
char *ret;
|
|
|
|
|
|
|
|
if (!disk->info.alias) {
|
|
|
|
virReportError(VIR_ERR_INVALID_ARG, "%s", _("disk does not have an alias"));
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
ignore_value(virAsprintf(&ret, "drive-%s", disk->info.alias));
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
2016-03-29 18:23:02 -04:00
|
|
|
|
|
|
|
|
|
|
|
/* qemuDomainGetMasterKeyAlias:
|
|
|
|
*
|
|
|
|
* Generate and return the masterKey alias
|
|
|
|
*
|
|
|
|
* Returns NULL or a string containing the master key alias
|
|
|
|
*/
|
|
|
|
char *
|
|
|
|
qemuDomainGetMasterKeyAlias(void)
|
|
|
|
{
|
|
|
|
char *alias;
|
|
|
|
|
|
|
|
ignore_value(VIR_STRDUP(alias, "masterKey0"));
|
|
|
|
|
|
|
|
return alias;
|
|
|
|
}
|