[libvirt] [PATCH 36/50] list: Add helpers for listing node devices

Osier Yang jyang at redhat.com
Thu Jul 19 16:41:07 UTC 2012


src/conf/virobjectlist.h:
  * New macro VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_CAP
  * Declare virNodeDeviceList

src/conf/virobjectlist.c:
  * New helpers virNodeDeviceCapMatch, virNodeDeviceMatch.
    virNodeDeviceCapMatch looks up the list of all the caps the device
    support, to see if the device support the cap type.
  * Implement virNodeDeviceList

src/libvirt_private.syms:
  * Export virNodeDeviceList
---
 src/conf/virobjectlist.c |  103 ++++++++++++++++++++++++++++++++++++++++++++++
 src/conf/virobjectlist.h |   17 ++++++++
 src/libvirt_private.syms |    2 +
 3 files changed, 122 insertions(+), 0 deletions(-)

diff --git a/src/conf/virobjectlist.c b/src/conf/virobjectlist.c
index 83b0d9c..55c236c 100644
--- a/src/conf/virobjectlist.c
+++ b/src/conf/virobjectlist.c
@@ -30,6 +30,7 @@
 #include "virhash.h"
 #include "domain_conf.h"
 #include "storage_conf.h"
+#include "node_device_conf.h"
 #include "memory.h"
 #include "datatypes.h"
 #include "virterror_internal.h"
@@ -135,6 +136,20 @@ cleanup:
 }
 #undef MATCH
 
+static bool
+virNodeDeviceCapMatch(virNodeDeviceObjPtr devobj,
+                      int type)
+{
+    virNodeDevCapsDefPtr cap = NULL;
+
+    for (cap = devobj->def->caps; cap; cap = cap->next) {
+        if (type == cap->type)
+            return true;
+    }
+
+    return false;
+}
+
 #define MATCH(FLAG) (flags & (FLAG))
 static bool
 virStoragePoolMatch (virStoragePoolObjPtr poolobj,
@@ -222,6 +237,36 @@ virNetworkMatch (virNetworkObjPtr netobj,
 
     return true;
 }
+
+static bool
+virNodeDeviceMatch (virNodeDeviceObjPtr devobj,
+                    unsigned int flags)
+{
+    /* filter by cap type */
+    if (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_CAP)) {
+        if (!((MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_SYSTEM) &&
+               virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_SYSTEM))        ||
+              (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_PCI_DEV) &&
+               virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_PCI_DEV))       ||
+              (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_DEV) &&
+               virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_USB_DEV))       ||
+              (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_INTERFACE) &&
+               virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_USB_INTERFACE)) ||
+              (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_NET) &&
+               virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_NET))           ||
+              (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_HOST) &&
+               virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_SCSI_HOST))     ||
+              (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_TARGET) &&
+               virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_SCSI_TARGET))   ||
+              (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI) &&
+               virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_SCSI))          ||
+              (MATCH(VIR_CONNECT_LIST_NODE_DEVICES_CAP_STORAGE) &&
+               virNodeDeviceCapMatch(devobj, VIR_NODE_DEV_CAP_STORAGE))))
+            return false;
+    }
+
+    return true;
+}
 #undef MATCH
 
 int
@@ -430,3 +475,61 @@ cleanup:
     VIR_FREE(tmp_nets);
     return ret;
 }
+
+int
+virNodeDeviceList(virConnectPtr conn,
+                  virNodeDeviceObjList devobjs,
+                  virNodeDevicePtr **devices,
+                  unsigned int flags)
+{
+    virNodeDevicePtr *tmp_devices = NULL;
+    virNodeDevicePtr device = NULL;
+    int ndevices = 0;
+    int ret = -1;
+    int i;
+
+    if (devices) {
+        if (VIR_ALLOC_N(tmp_devices, devobjs.count + 1) < 0) {
+            virReportOOMError();
+            goto cleanup;
+        }
+    }
+
+    for (i = 0; i < devobjs.count; i++) {
+        virNodeDeviceObjPtr devobj = devobjs.objs[i];
+        virNodeDeviceObjLock(devobj);
+        if (virNodeDeviceMatch(devobj, flags)) {
+            if (devices) {
+                if (!(device = virGetNodeDevice(conn,
+                                                devobj->def->name))) {
+                    virNodeDeviceObjUnlock(devobj);
+                    goto cleanup;
+                }
+                tmp_devices[ndevices++] = device;
+            } else {
+                ndevices++;
+            }
+        }
+        virNodeDeviceObjUnlock(devobj);
+    }
+
+    if (tmp_devices) {
+        /* trim the array to the final size */
+        ignore_value(VIR_REALLOC_N(tmp_devices, ndevices + 1));
+        *devices = tmp_devices;
+        tmp_devices = NULL;
+    }
+
+    ret = ndevices;
+
+cleanup:
+    if (tmp_devices) {
+        for (i = 0; i < devobjs.count; i++) {
+            if (tmp_devices[i])
+                virNodeDeviceFree(tmp_devices[i]);
+        }
+    }
+
+    VIR_FREE(tmp_devices);
+    return ret;
+}
diff --git a/src/conf/virobjectlist.h b/src/conf/virobjectlist.h
index 431635e..e62d454 100644
--- a/src/conf/virobjectlist.h
+++ b/src/conf/virobjectlist.h
@@ -29,6 +29,7 @@
 # include "domain_conf.h"
 # include "storage_conf.h"
 # include "network_conf.h"
+# include "node_device_conf.h"
 
 # define VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE   \
                 (VIR_CONNECT_LIST_DOMAINS_ACTIVE | \
@@ -123,6 +124,17 @@
                  VIR_CONNECT_LIST_NETWORKS_FILTERS_PERSISTENT | \
                  VIR_CONNECT_LIST_NETWORKS_FILTERS_AUTOSTART)
 
+# define VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_CAP \
+                (VIR_CONNECT_LIST_NODE_DEVICES_CAP_SYSTEM        | \
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_PCI_DEV       | \
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_DEV       | \
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_USB_INTERFACE | \
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_NET           | \
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_HOST     | \
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI_TARGET   | \
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_SCSI          | \
+                 VIR_CONNECT_LIST_NODE_DEVICES_CAP_STORAGE)
+
 int virDomainList(virConnectPtr conn, virHashTablePtr domobjs,
                   virDomainPtr **domains, unsigned int flags);
 
@@ -142,4 +154,9 @@ int virNetworkList(virConnectPtr conn,
                    virNetworkPtr **nets,
                    unsigned int flags);
 
+int virNodeDeviceList(virConnectPtr conn,
+                      virNodeDeviceObjList devobjs,
+                      virNodeDevicePtr **devices,
+                      unsigned int flags);
+
 #endif /* __VIR_OBJECT_LIST_H__ */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 74e9335..c810eaa 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -814,6 +814,7 @@ virPortGroupFindByName;
 
 
 # node_device_conf.h
+virNodeDevCapTypeFromString;
 virNodeDevCapTypeToString;
 virNodeDevCapsDefFree;
 virNodeDeviceAssignDef;
@@ -1244,6 +1245,7 @@ virDBusGetSystemBus;
 virDomainList;
 virDomainListSnapshots;
 virNetworkList;
+virNodeDeviceList;
 virStoragePoolList;
 
 
-- 
1.7.7.3




More information about the libvir-list mailing list