]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
nodedev: look up mdevs by UUID and parent
authorJonathon Jongsma <jjongsma@redhat.com>
Fri, 16 Jul 2021 19:33:50 +0000 (14:33 -0500)
committerJonathon Jongsma <jjongsma@redhat.com>
Fri, 6 Aug 2021 20:02:41 +0000 (15:02 -0500)
Since UUID is not guaranteed to be unique by mdevctl, we may have more
than one nodedev with the same UUID. Therefore, we need to disambiguate
when looking up mdevs by specifying the UUID and parent address, which
mdevctl guarantees to be a unique combination.

Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/conf/virnodedeviceobj.c
src/conf/virnodedeviceobj.h
src/node_device/node_device_driver.c

index 6cf4d8b15aaa680ed4db91bcf62bc441f3805edc..87e180f3ef9f1a948e62d1d5c1ab33294a6002a0 100644 (file)
@@ -401,13 +401,21 @@ virNodeDeviceObjListFindSCSIHostByWWNs(virNodeDeviceObjList *devs,
                                       &data);
 }
 
+
+typedef struct _FindMediatedDeviceData FindMediatedDeviceData;
+struct _FindMediatedDeviceData {
+    const char *uuid;
+    const char *parent_addr;
+};
+
+
 static int
 virNodeDeviceObjListFindMediatedDeviceByUUIDCallback(const void *payload,
                                                      const char *name G_GNUC_UNUSED,
                                                      const void *opaque)
 {
     virNodeDeviceObj *obj = (virNodeDeviceObj *) payload;
-    const char *uuid = (const char *) opaque;
+    const FindMediatedDeviceData* data = opaque;
     virNodeDevCapsDef *cap;
     int want = 0;
 
@@ -415,7 +423,8 @@ virNodeDeviceObjListFindMediatedDeviceByUUIDCallback(const void *payload,
 
     for (cap = obj->def->caps; cap != NULL; cap = cap->next) {
         if (cap->data.type == VIR_NODE_DEV_CAP_MDEV) {
-            if (STREQ(cap->data.mdev.uuid, uuid)) {
+            if (STREQ(cap->data.mdev.uuid, data->uuid) &&
+                STREQ(cap->data.mdev.parent_addr, data->parent_addr)) {
                 want = 1;
                 break;
             }
@@ -429,11 +438,13 @@ virNodeDeviceObjListFindMediatedDeviceByUUIDCallback(const void *payload,
 
 virNodeDeviceObj *
 virNodeDeviceObjListFindMediatedDeviceByUUID(virNodeDeviceObjList *devs,
-                                             const char *uuid)
+                                             const char *uuid,
+                                             const char *parent_addr)
 {
+    const FindMediatedDeviceData data = {uuid, parent_addr};
     return virNodeDeviceObjListSearch(devs,
                                       virNodeDeviceObjListFindMediatedDeviceByUUIDCallback,
-                                      uuid);
+                                      &data);
 }
 
 static void
index 1fdd4f65da9288a7d1c33a2b27befb83d88145d7..068c7c6f34ab368f76a067dfa48c4c3390b6380b 100644 (file)
@@ -122,7 +122,8 @@ virNodeDeviceObjSetSkipUpdateCaps(virNodeDeviceObj *obj,
                                   bool skipUpdateCaps);
 virNodeDeviceObj *
 virNodeDeviceObjListFindMediatedDeviceByUUID(virNodeDeviceObjList *devs,
-                                             const char *uuid);
+                                             const char *uuid,
+                                             const char *parent_addr);
 
 bool
 virNodeDeviceObjIsActive(virNodeDeviceObj *obj);
index 235c987c6343a93fbefa750d2cf49788f941dbaa..db619aa2d8ed5edaa24ad135fb9fa59aea084a7f 100644 (file)
@@ -321,6 +321,7 @@ nodeDeviceLookupSCSIHostByWWN(virConnectPtr conn,
 static virNodeDevicePtr
 nodeDeviceLookupMediatedDeviceByUUID(virConnectPtr conn,
                                      const char *uuid,
+                                     const char *parent_addr,
                                      unsigned int flags)
 {
     virNodeDeviceObj *obj = NULL;
@@ -330,7 +331,7 @@ nodeDeviceLookupMediatedDeviceByUUID(virConnectPtr conn,
     virCheckFlags(0, NULL);
 
     if (!(obj = virNodeDeviceObjListFindMediatedDeviceByUUID(driver->devs,
-                                                             uuid)))
+                                                             uuid, parent_addr)))
         return NULL;
 
     def = virNodeDeviceObjGetDef(obj);
@@ -542,23 +543,29 @@ nodeDeviceFindNewDevice(virConnectPtr conn,
 }
 
 
+typedef struct {
+    const char *uuid;
+    const char *parent_addr;
+} NewMediatedDeviceData;
+
 static virNodeDevicePtr
 nodeDeviceFindNewMediatedDeviceFunc(virConnectPtr conn,
                                     const void *opaque)
 {
-    const char *uuid = opaque;
+    const NewMediatedDeviceData *data = opaque;
 
-    return nodeDeviceLookupMediatedDeviceByUUID(conn, uuid, 0);
+    return nodeDeviceLookupMediatedDeviceByUUID(conn, data->uuid, data->parent_addr, 0);
 }
 
 
 static virNodeDevicePtr
 nodeDeviceFindNewMediatedDevice(virConnectPtr conn,
-                                const char *mdev_uuid)
+                                const char *mdev_uuid,
+                                const char *parent_addr)
 {
-    return nodeDeviceFindNewDevice(conn,
-                                   nodeDeviceFindNewMediatedDeviceFunc,
-                                   mdev_uuid);
+    NewMediatedDeviceData data = {mdev_uuid, parent_addr};
+    return nodeDeviceFindNewDevice(conn, nodeDeviceFindNewMediatedDeviceFunc,
+                                   &data);
 }
 
 
@@ -867,7 +874,8 @@ nodeDeviceCreateXMLMdev(virConnectPtr conn,
         def->caps->data.mdev.uuid = g_steal_pointer(&uuid);
     }
 
-    return nodeDeviceFindNewMediatedDevice(conn, def->caps->data.mdev.uuid);
+    return nodeDeviceFindNewMediatedDevice(conn, def->caps->data.mdev.uuid,
+                                           def->caps->data.mdev.parent_addr);
 }