File f820d5bf6-USB-port-path-as-an-array-of-integers.patch of Package libvirt.6751
From f820d5bf6fafa2932ee6b21c34fee4c464500ef3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
Date: Wed, 12 Aug 2015 16:52:13 +0200
Subject: [PATCH] Store USB port path as an array of integers
In preparation to tracking which USB addresses are occupied.
Introduce two helper functions for printing the port path
as a string and appending it to a virBuffer.
---
src/conf/device_conf.h | 2 +-
src/conf/domain_addr.c | 33 +++++++++++++++++++++++++++++++++
src/conf/domain_addr.h | 12 ++++++++++++
src/conf/domain_conf.c | 20 ++++++++++----------
src/libvirt_private.syms | 3 +++
src/qemu/qemu_command.c | 5 ++++-
6 files changed, 63 insertions(+), 12 deletions(-)
Index: libvirt-2.0.0/src/conf/device_conf.h
===================================================================
--- libvirt-2.0.0.orig/src/conf/device_conf.h
+++ libvirt-2.0.0/src/conf/device_conf.h
@@ -84,7 +84,7 @@ typedef struct _virDomainDeviceCcidAddre
typedef struct _virDomainDeviceUSBAddress {
unsigned int bus;
- char *port;
+ unsigned int port[VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH];
} virDomainDeviceUSBAddress, *virDomainDeviceUSBAddressPtr;
typedef struct _virDomainDeviceSpaprVioAddress {
Index: libvirt-2.0.0/src/conf/domain_addr.c
===================================================================
--- libvirt-2.0.0.orig/src/conf/domain_addr.c
+++ libvirt-2.0.0/src/conf/domain_addr.c
@@ -1251,3 +1251,36 @@ virDomainVirtioSerialAddrRelease(virDoma
VIR_FREE(str);
return ret;
}
+
+
+bool
+virDomainUSBAddressPortIsValid(unsigned int *port)
+{
+ return port[0] != 0;
+}
+
+
+void
+virDomainUSBAddressPortFormatBuf(virBufferPtr buf,
+ unsigned int *port)
+{
+ size_t i;
+
+ for (i = 0; i < VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH; i++) {
+ if (port[i] == 0)
+ break;
+ virBufferAsprintf(buf, "%u.", port[i]);
+ }
+ virBufferTrim(buf, ".", -1);
+}
+
+
+char *
+virDomainUSBAddressPortFormat(unsigned int *port)
+{
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+ virDomainUSBAddressPortFormatBuf(&buf, port);
+ if (virBufferCheckError(&buf) < 0)
+ return NULL;
+ return virBufferContentAndReset(&buf);
+}
Index: libvirt-2.0.0/src/conf/domain_addr.h
===================================================================
--- libvirt-2.0.0.orig/src/conf/domain_addr.h
+++ libvirt-2.0.0/src/conf/domain_addr.h
@@ -237,4 +237,16 @@ virDomainVirtioSerialAddrRelease(virDoma
virDomainDeviceInfoPtr info)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+bool
+virDomainUSBAddressPortIsValid(unsigned int *port)
+ ATTRIBUTE_NONNULL(1);
+
+void
+virDomainUSBAddressPortFormatBuf(virBufferPtr buf,
+ unsigned int *port)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+char *
+virDomainUSBAddressPortFormat(unsigned int *port)
+ ATTRIBUTE_NONNULL(1);
+
#endif /* __DOMAIN_ADDR_H__ */
Index: libvirt-2.0.0/src/conf/domain_conf.c
===================================================================
--- libvirt-2.0.0.orig/src/conf/domain_conf.c
+++ libvirt-2.0.0/src/conf/domain_conf.c
@@ -32,6 +32,7 @@
#include "internal.h"
#include "virerror.h"
#include "datatypes.h"
+#include "domain_addr.h"
#include "domain_conf.h"
#include "snapshot_conf.h"
#include "viralloc.h"
@@ -3313,8 +3314,6 @@ virDomainDeviceInfoCopy(virDomainDeviceI
void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info)
{
VIR_FREE(info->alias);
- if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB)
- VIR_FREE(info->addr.usb.port);
memset(&info->addr, 0, sizeof(info->addr));
info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
VIR_FREE(info->romfile);
@@ -4859,9 +4858,12 @@ virDomainDeviceInfoFormat(virBufferPtr b
break;
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB:
- virBufferAsprintf(buf, " bus='%d' port='%s'",
- info->addr.usb.bus,
- info->addr.usb.port);
+ virBufferAsprintf(buf, " bus='%d'", info->addr.usb.bus);
+ if (virDomainUSBAddressPortIsValid(info->addr.usb.port)) {
+ virBufferAddLit(buf, " port='");
+ virDomainUSBAddressPortFormatBuf(buf, info->addr.usb.port);
+ virBufferAddLit(buf, "'");
+ }
break;
case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO:
@@ -5093,14 +5095,14 @@ virDomainDeviceCcidAddressParseXML(xmlNo
}
static int
-virDomainDeviceUSBAddressParsePort(char *port)
+virDomainDeviceUSBAddressParsePort(virDomainDeviceUSBAddressPtr addr,
+ char *port)
{
- unsigned int p;
char *tmp = port;
size_t i;
for (i = 0; i < VIR_DOMAIN_DEVICE_USB_MAX_PORT_DEPTH; i++) {
- if (virStrToLong_uip(tmp, &tmp, 10, &p) < 0)
+ if (virStrToLong_uip(tmp, &tmp, 10, &addr->port[i]) < 0)
break;
if (*tmp == '\0')
@@ -5127,12 +5129,9 @@ virDomainDeviceUSBAddressParseXML(xmlNod
port = virXMLPropString(node, "port");
bus = virXMLPropString(node, "bus");
- if (port && virDomainDeviceUSBAddressParsePort(port) < 0)
+ if (port && virDomainDeviceUSBAddressParsePort(addr, port) < 0)
goto cleanup;
- addr->port = port;
- port = NULL;
-
if (bus &&
virStrToLong_uip(bus, NULL, 10, &addr->bus) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
Index: libvirt-2.0.0/src/libvirt_private.syms
===================================================================
--- libvirt-2.0.0.orig/src/libvirt_private.syms
+++ libvirt-2.0.0/src/libvirt_private.syms
@@ -107,6 +107,9 @@ virDomainPCIAddressSetGrow;
virDomainPCIAddressSlotInUse;
virDomainPCIAddressValidate;
virDomainPCIControllerModelToConnectType;
+virDomainUSBAddressPortFormat;
+virDomainUSBAddressPortFormatBuf;
+virDomainUSBAddressPortIsValid;
virDomainVirtioSerialAddrAssign;
virDomainVirtioSerialAddrAutoAssign;
virDomainVirtioSerialAddrIsComplete;
Index: libvirt-2.0.0/src/qemu/qemu_command.c
===================================================================
--- libvirt-2.0.0.orig/src/qemu/qemu_command.c
+++ libvirt-2.0.0/src/qemu/qemu_command.c
@@ -375,7 +375,11 @@ qemuBuildDeviceAddressStr(virBufferPtr b
VIR_DOMAIN_CONTROLLER_TYPE_USB,
info->addr.usb.bus)))
goto cleanup;
- virBufferAsprintf(buf, ",bus=%s.0,port=%s", contAlias, info->addr.usb.port);
+ virBufferAsprintf(buf, ",bus=%s.0", contAlias);
+ if (virDomainUSBAddressPortIsValid(info->addr.usb.port)) {
+ virBufferAddLit(buf, ",port=");
+ virDomainUSBAddressPortFormatBuf(buf, info->addr.usb.port);
+ }
} else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) {
if (info->addr.spaprvio.has_reg)
virBufferAsprintf(buf, ",reg=0x%llx", info->addr.spaprvio.reg);