diff --git a/src/hypervisor/virhostdev.c b/src/hypervisor/virhostdev.c index aa3fc8738f..be32a26164 100644 --- a/src/hypervisor/virhostdev.c +++ b/src/hypervisor/virhostdev.c @@ -1975,7 +1975,7 @@ virHostdevReAttachMediatedDevices(virHostdevManagerPtr mgr, virObjectLock(mgr->activeMediatedHostdevs); for (i = 0; i < nhostdevs; i++) { - g_autoptr(virMediatedDevice) mdev = NULL; + g_autofree char *sysfspath = NULL; virMediatedDevicePtr tmp; virDomainHostdevSubsysMediatedDevPtr mdevsrc; virDomainHostdevDefPtr hostdev = hostdevs[i]; @@ -1984,14 +1984,12 @@ virHostdevReAttachMediatedDevices(virHostdevManagerPtr mgr, continue; mdevsrc = &hostdev->source.subsys.u.mdev; - - if (!(mdev = virMediatedDeviceNew(mdevsrc->uuidstr, - mdevsrc->model))) - continue; + sysfspath = virMediatedDeviceGetSysfsPath(mdevsrc->uuidstr); /* Remove from the list only mdevs assigned to @drv_name/@dom_name */ - tmp = virMediatedDeviceListFind(mgr->activeMediatedHostdevs, mdev); + tmp = virMediatedDeviceListFind(mgr->activeMediatedHostdevs, + sysfspath); /* skip inactive devices */ if (!tmp) diff --git a/src/util/virmdev.c b/src/util/virmdev.c index b6df353d56..fc27e9e45d 100644 --- a/src/util/virmdev.c +++ b/src/util/virmdev.c @@ -308,7 +308,7 @@ int virMediatedDeviceListAdd(virMediatedDeviceListPtr list, virMediatedDevicePtr *dev) { - if (virMediatedDeviceListFind(list, *dev)) { + if (virMediatedDeviceListFind(list, (*dev)->path)) { virReportError(VIR_ERR_INTERNAL_ERROR, _("device %s is already in use"), (*dev)->path); return -1; @@ -354,7 +354,7 @@ virMediatedDevicePtr virMediatedDeviceListSteal(virMediatedDeviceListPtr list, virMediatedDevicePtr dev) { - int idx = virMediatedDeviceListFindIndex(list, dev); + int idx = virMediatedDeviceListFindIndex(list, dev->path); return virMediatedDeviceListStealIndex(list, idx); } @@ -370,13 +370,13 @@ virMediatedDeviceListDel(virMediatedDeviceListPtr list, int virMediatedDeviceListFindIndex(virMediatedDeviceListPtr list, - virMediatedDevicePtr dev) + const char *sysfspath) { size_t i; for (i = 0; i < list->count; i++) { - virMediatedDevicePtr other = list->devs[i]; - if (STREQ(other->path, dev->path)) + virMediatedDevicePtr dev = list->devs[i]; + if (STREQ(sysfspath, dev->path)) return i; } return -1; @@ -385,11 +385,11 @@ virMediatedDeviceListFindIndex(virMediatedDeviceListPtr list, virMediatedDevicePtr virMediatedDeviceListFind(virMediatedDeviceListPtr list, - virMediatedDevicePtr dev) + const char *sysfspath) { int idx; - if ((idx = virMediatedDeviceListFindIndex(list, dev)) >= 0) + if ((idx = virMediatedDeviceListFindIndex(list, sysfspath)) >= 0) return list->devs[idx]; else return NULL; @@ -403,7 +403,7 @@ virMediatedDeviceIsUsed(virMediatedDevicePtr dev, const char *drvname, *domname; virMediatedDevicePtr tmp = NULL; - if ((tmp = virMediatedDeviceListFind(list, dev))) { + if ((tmp = virMediatedDeviceListFind(list, dev->path))) { virMediatedDeviceGetUsedBy(tmp, &drvname, &domname); virReportError(VIR_ERR_OPERATION_INVALID, _("mediated device %s is in use by " diff --git a/src/util/virmdev.h b/src/util/virmdev.h index b6563a94fc..e96e5bb8c6 100644 --- a/src/util/virmdev.h +++ b/src/util/virmdev.h @@ -130,11 +130,11 @@ virMediatedDeviceListDel(virMediatedDeviceListPtr list, virMediatedDevicePtr virMediatedDeviceListFind(virMediatedDeviceListPtr list, - virMediatedDevicePtr dev); + const char *sysfspath); int virMediatedDeviceListFindIndex(virMediatedDeviceListPtr list, - virMediatedDevicePtr dev); + const char *sysfspath); int virMediatedDeviceListMarkDevices(virMediatedDeviceListPtr dst,