--- src/qemu/qemu_domain.c | 37 +++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 3 +++ 2 files changed, 40 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index b8a65cfd5..1740a9d80 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -8341,3 +8341,40 @@ qemuDomainDiskBackingStoreGetName(virDomainDiskDefPtr disk, return ret; } + + +virStorageSourcePtr +qemuDomainGetStorageSourceByDevstr(const char *devstr, + virDomainDefPtr def) +{ + virDomainDiskDefPtr disk = NULL; + virStorageSourcePtr src = NULL; + char *target = NULL; + unsigned int idx; + size_t i; + + if (virStorageFileParseBackingStoreStr(devstr, &target, &idx) < 0) { + virReportError(VIR_ERR_INVALID_ARG, + _("failed to parse block device '%s'"), devstr); + return NULL; + } + + for (i = 0; i < def->ndisks; i++) { + if (STREQ(target, def->disks[i]->dst)) { + disk = def->disks[i]; + break; + } + } + + if (!disk) { + virReportError(VIR_ERR_INVALID_ARG, + _("failed to find disk '%s"), target); + goto cleanup; + } + + src = virStorageFileChainLookup(disk->src, NULL, NULL, idx, NULL); + + cleanup: + VIR_FREE(target); + return src; +} diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 6e847c7ae..705a3ad59 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -859,4 +859,7 @@ char *qemuDomainDiskBackingStoreGetName(virDomainDiskDefPtr disk, virStorageSourcePtr src, unsigned int idx); +virStorageSourcePtr qemuDomainGetStorageSourceByDevstr(const char *devstr, + virDomainDefPtr def); + #endif /* __QEMU_DOMAIN_H__ */ -- 2.11.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list