From nobody Sun Oct 5 01:51:57 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1757512902; cv=none; d=zohomail.com; s=zohoarc; b=kQBG8kcrbWDcwPEvQxYtRDBcAYQqOW1DOPGIwCM6q3ezuoPnLh2QfkbJDFTTFrHj62kxQzgpfjeeF7SBeWIiyAKoIU0G5PBjnVuqjX4r1bQlB266S96yjwe/Kc0UV4UOZ/HiYienJgL0i+4unvMb9hd2diwe6xoQXtr8LfupzBQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1757512902; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=et8cKSZ1UqIgBqG5AmI9CtVofv1T22XABOOUNmO78uk=; b=nDxvMfcGeDKKDSFYe5+k+QADDLctZk9S42SZqebRdrIoX3f6pCIsdTIZuV+6GbQYm0jk5wpWghwYeb8fzkc55csAy/U30NAeV1MBTjH5OCpLDrtdjAvTH9/laOlQ4pfLQpqy+ICJ1xeZhJa1mQOh+gXXQGpC3+7Cf66j8SlmfLo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1757512901988393.87045025063117; Wed, 10 Sep 2025 07:01:41 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id DEC4241B94; Wed, 10 Sep 2025 10:01:40 -0400 (EDT) Received: from [172.19.199.3] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 8C78043DD2; Wed, 10 Sep 2025 09:58:10 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id AE11C41B9F; Wed, 10 Sep 2025 09:57:50 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id ECD5E41B94 for ; Wed, 10 Sep 2025 09:57:49 -0400 (EDT) Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-448-r3F49UhzM3eh_P7kGLblgA-1; Wed, 10 Sep 2025 09:57:48 -0400 Received: from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id AF3091800378 for ; Wed, 10 Sep 2025 13:57:47 +0000 (UTC) Received: from speedmetal.redhat.com (unknown [10.45.242.8]) by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id F265D300018D for ; Wed, 10 Sep 2025 13:57:46 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1757512669; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=et8cKSZ1UqIgBqG5AmI9CtVofv1T22XABOOUNmO78uk=; b=JEhnu31+UWpaFWPd3RkVmhMYjddUtGtgYxQ0xWLUJul1XOpRdhtQluR459Vwg9Mx82MmDy X6ipyQweFQH3JDPyXS14p6KM2J0fGwJrQlSJzza7ZJ4ktOP1dSE9B8zX6l2tHpiDHTpngG H7CF6z+YgRruJBHYR0Yf+2mlnXbJAFE= X-MC-Unique: r3F49UhzM3eh_P7kGLblgA-1 X-Mimecast-MFC-AGG-ID: r3F49UhzM3eh_P7kGLblgA_1757512667 To: devel@lists.libvirt.org Subject: [PATCH 3/6] qemuMigrationSrcIsSafeDisk: Extract safe migration checks for one storage source Date: Wed, 10 Sep 2025 15:57:38 +0200 Message-ID: <7a956459d85df5d7c35516806da88e19ab7996f8.1757512552.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.4 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: qkkYaM4t5GVF6u6IE9bCukWReukMoSKF58ZEQKY0S8o_1757512667 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: GJHCMEJ34QI3NPS3RJ7ZEG6ULHSWGWCY X-Message-ID-Hash: GJHCMEJ34QI3NPS3RJ7ZEG6ULHSWGWCY X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1757512904371116600 Content-Type: text/plain; charset="utf-8" From: Peter Krempa Further split up the code originally in 'qemuMigrationSrcIsSafe' to separate checks concerning a single storage source. The code will then be reused to check the safe migration state also for the data file (qcow2 feature that allows store of data separated from the qcow2 metadata). Signed-off-by: Peter Krempa --- src/qemu/qemu_migration.c | 71 ++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 96709dfcdd..ae26f74f8c 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1733,40 +1733,34 @@ qemuMigrationSrcIsAllowed(virDomainObj *vm, } -static bool -qemuMigrationSrcIsSafeDisk(virDomainDiskDef *disk, - virQEMUCaps *qemuCaps, - virQEMUDriverConfig *cfg) +static int +qemuMigrationSrcCheckStorageSourceSafety(virStorageSource *src, + virQEMUDriverConfig *cfg, + bool *unsafe_storage, + bool *requires_safe_cache) { - virStorageType actualType =3D virStorageSourceGetActualType(disk->src); - bool unsafe =3D false; - int rc; + switch (virStorageSourceGetActualType(src)) { + case VIR_STORAGE_TYPE_FILE: { + int rc_cluster =3D virFileIsClusterFS(src->path); + int rc_shared =3D virFileIsSharedFS(src->path, cfg->sharedFilesyst= ems); - /* Disks without any source (i.e. floppies and CD-ROMs) OR readonly ar= e safe. */ - if (virStorageSourceIsEmpty(disk->src) || - disk->src->readonly) - return true; + if (rc_cluster < 0 || rc_shared < 0) + return -1; - /* However, disks on local FS (e.g. ext4) are not safe. */ - switch (actualType) { - case VIR_STORAGE_TYPE_FILE: - if ((rc =3D virFileIsSharedFS(disk->src->path, cfg->sharedFilesyst= ems)) < 0) { - return false; - } else if (rc =3D=3D 0) { - unsafe =3D true; - } + if (rc_cluster =3D=3D 0) { + *requires_safe_cache =3D true; - if ((rc =3D virFileIsClusterFS(disk->src->path)) < 0) - return false; - else if (rc =3D=3D 1) - return true; + if (rc_shared =3D=3D 0) + *unsafe_storage =3D true; + } + } break; case VIR_STORAGE_TYPE_NETWORK: - return true; + break; case VIR_STORAGE_TYPE_NVME: - unsafe =3D true; + *unsafe_storage =3D true; break; case VIR_STORAGE_TYPE_VHOST_USER: @@ -1776,10 +1770,32 @@ qemuMigrationSrcIsSafeDisk(virDomainDiskDef *disk, case VIR_STORAGE_TYPE_DIR: case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_LAST: + *requires_safe_cache =3D true; break; } - if (unsafe) { + return 0; +} + + +static bool +qemuMigrationSrcIsSafeDisk(virDomainDiskDef *disk, + virQEMUCaps *qemuCaps, + virQEMUDriverConfig *cfg) +{ + bool unsafe_storage =3D false; + bool requires_safe_cache =3D false; + + /* Disks without any source (i.e. floppies and CD-ROMs) OR readonly ar= e safe. */ + if (virStorageSourceIsEmpty(disk->src) || + disk->src->readonly) + return true; + + if (qemuMigrationSrcCheckStorageSourceSafety(disk->src, cfg, &unsafe_s= torage, + &requires_safe_cache) < 0) + return false; + + if (unsafe_storage) { virReportError(VIR_ERR_MIGRATE_UNSAFE, "%s", _("Migration without shared storage is unsafe")); return false; @@ -1787,7 +1803,8 @@ qemuMigrationSrcIsSafeDisk(virDomainDiskDef *disk, /* Our code elsewhere guarantees shared disks are either readonly (in * which case cache mode doesn't matter) or used with cache=3Dnone or = used with cache=3Ddirectsync */ - if (!(disk->src->shared || + if (requires_safe_cache && + !(disk->src->shared || disk->cachemode =3D=3D VIR_DOMAIN_DISK_CACHE_DISABLE || disk->cachemode =3D=3D VIR_DOMAIN_DISK_CACHE_DIRECTSYNC || virQEMUCapsGet(qemuCaps, QEMU_CAPS_MIGRATION_FILE_DROP_CACHE))) { --=20 2.51.0