From f654464f7ab86ac756e7c38e6598389c9605dc08 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 26 Nov 2021 13:21:47 +0100 Subject: [PATCH] virStorageSourceIsSameLocation: Special-case storage sources of type 'volume' The function is used also to compare virStorageSource which may not be resolved to the image at that point in which case the 'path' is not yet populated and the actual type is not yet set. This means that the function fails to consider two identical volume-based disks as pointing to the same thing. Add a special case for both images being type=volume in which case we compare only the pool/volume names. Closes: https://gitlab.com/libvirt/libvirt/-/issues/240 Signed-off-by: Peter Krempa Reviewed-by: Martin Kletzander --- src/conf/storage_source_conf.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/conf/storage_source_conf.c b/src/conf/storage_source_conf.c index 44944e1dbd..c0acee189a 100644 --- a/src/conf/storage_source_conf.c +++ b/src/conf/storage_source_conf.c @@ -920,6 +920,13 @@ virStorageSourceIsSameLocation(virStorageSource *a, virStorageSourceIsEmpty(b)) return true; + /* for disk type=volume we must check just pool/volume names as they might + * not yet be resolved if e.g. we are comparing against the persistent def */ + if (a->type == VIR_STORAGE_TYPE_VOLUME && b->type == VIR_STORAGE_TYPE_VOLUME) { + return STREQ(a->srcpool->pool, b->srcpool->pool) && + STREQ(a->srcpool->volume, b->srcpool->volume); + } + if (virStorageSourceGetActualType(a) != virStorageSourceGetActualType(b)) return false; -- 2.47.2