In order to be able to steal PCI device by its index in the list.
---
src/libvirt_private.syms | 2 ++
src/util/pci.c | 60 +++++++++++++++++++++++++++++-------------------
src/util/pci.h | 4 ++++
3 files changed, 42 insertions(+), 24 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 41e2629..625490f 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1000,10 +1000,12 @@ pciDeviceListAdd;
pciDeviceListCount;
pciDeviceListDel;
pciDeviceListFind;
+pciDeviceListFindIndex;
pciDeviceListFree;
pciDeviceListGet;
pciDeviceListNew;
pciDeviceListSteal;
+pciDeviceListStealIndex;
pciDeviceNetName;
pciDeviceReAttachInit;
pciDeviceSetManaged;
diff --git a/src/util/pci.c b/src/util/pci.c
index 191f99d..3ebf6f7 100644
--- a/src/util/pci.c
+++ b/src/util/pci.c
@@ -1554,35 +1554,36 @@ pciDeviceListCount(pciDeviceList *list)
}
pciDevice *
-pciDeviceListSteal(pciDeviceList *list,
- pciDevice *dev)
+pciDeviceListStealIndex(pciDeviceList *list,
+ int idx)
{
- pciDevice *ret = NULL;
- int i;
-
- for (i = 0; i < list->count; i++) {
- if (list->devs[i]->domain != dev->domain ||
- list->devs[i]->bus != dev->bus ||
- list->devs[i]->slot != dev->slot ||
- list->devs[i]->function != dev->function)
- continue;
+ pciDevice *ret;
- ret = list->devs[i];
+ if (idx < 0)
+ return NULL;
- if (i != --list->count)
- memmove(&list->devs[i],
- &list->devs[i+1],
- sizeof(*list->devs) * (list->count-i));
+ ret = list->devs[idx];
- if (VIR_REALLOC_N(list->devs, list->count) < 0) {
- ; /* not fatal */
- }
+ if (idx != --list->count) {
+ memmove(&list->devs[idx],
+ &list->devs[idx + 1],
+ sizeof(*list->devs) * (list->count - idx));
+ }
- break;
+ if (VIR_REALLOC_N(list->devs, list->count) < 0) {
+ ; /* not fatal */
}
+
return ret;
}
+pciDevice *
+pciDeviceListSteal(pciDeviceList *list,
+ pciDevice *dev)
+{
+ return pciDeviceListStealIndex(list, pciDeviceListFindIndex(list, dev));
+}
+
void
pciDeviceListDel(pciDeviceList *list,
pciDevice *dev)
@@ -1592,8 +1593,8 @@ pciDeviceListDel(pciDeviceList *list,
pciFreeDevice(ret);
}
-pciDevice *
-pciDeviceListFind(pciDeviceList *list, pciDevice *dev)
+int
+pciDeviceListFindIndex(pciDeviceList *list, pciDevice *dev)
{
int i;
@@ -1602,8 +1603,19 @@ pciDeviceListFind(pciDeviceList *list, pciDevice *dev)
list->devs[i]->bus == dev->bus &&
list->devs[i]->slot == dev->slot &&
list->devs[i]->function == dev->function)
- return list->devs[i];
- return NULL;
+ return i;
+ return -1;
+}
+
+pciDevice *
+pciDeviceListFind(pciDeviceList *list, pciDevice *dev)
+{
+ int i;
+
+ if ((i = pciDeviceListFindIndex(list, dev)) >= 0)
+ return list->devs[i];
+ else
+ return NULL;
}
diff --git a/src/util/pci.h b/src/util/pci.h
index d3cc85d..814c24e 100644
--- a/src/util/pci.h
+++ b/src/util/pci.h
@@ -75,10 +75,14 @@ pciDevice * pciDeviceListGet (pciDeviceList *list,
int pciDeviceListCount (pciDeviceList *list);
pciDevice * pciDeviceListSteal (pciDeviceList *list,
pciDevice *dev);
+pciDevice * pciDeviceListStealIndex(pciDeviceList *list,
+ int idx);
void pciDeviceListDel (pciDeviceList *list,
pciDevice *dev);
pciDevice * pciDeviceListFind (pciDeviceList *list,
pciDevice *dev);
+int pciDeviceListFindIndex(pciDeviceList *list,
+ pciDevice *dev);
/*
* Callback that will be invoked once for each file
--
1.8.0