From nobody Tue Mar 3 03:04:10 2026 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=1771343683; cv=none; d=zohomail.com; s=zohoarc; b=np6UEpT+3tbNnE2myfycd/n/LFWlgQ0KH9E2HwCgaQ00NYgvHhkxD1K4Af/zTPaOqdDteuf0qN5hZXsnyTlPg49WkSFK2J4QdZF4kbVNVpb7Pzc/7aCxg2rmpXzz9GpS6dhz/BdHRjZlWMUftVGE9AjzLN0/pQLBKL8cnmoaaWk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771343683; 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=buuGTXbUuOYXweVZ8dy6UZGZCpTgItBNqUeKSTsgKWw=; b=YyKdYK/QB7enS18d+6L55H3qRCjLLL/yaTB2qZSJVMTAQ6TPQQgGNgMpi2tJNNUdn4FHPQdaCOoP+vaK6wGA/gUKFwwhPA74YxYkP8SRSZ2tA9jgOcRkcKI9lMVeaW+sgVeFWkom8rGBgjd3Dr59ARS2Lc6WdI+QNAcj/hHjn/4= 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 1771343683407313.3038664797281; Tue, 17 Feb 2026 07:54:43 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 3CBF23F8B3; Tue, 17 Feb 2026 10:54:42 -0500 (EST) Received: from [172.19.199.9] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 898523F817; Tue, 17 Feb 2026 10:53:04 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 0A0783F3DD; Tue, 17 Feb 2026 10:52:59 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 31D0D3F289 for ; Tue, 17 Feb 2026 10:52:58 -0500 (EST) Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-15-cD7nVlF9Ob2srJnCvsjI5w-1; Tue, 17 Feb 2026 10:52:56 -0500 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 7EDE61956054 for ; Tue, 17 Feb 2026 15:52:55 +0000 (UTC) Received: from speedmetal.lan (unknown [10.45.242.39]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id AB0C3180058F for ; Tue, 17 Feb 2026 15:52:54 +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=-4.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, 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=1771343577; 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=buuGTXbUuOYXweVZ8dy6UZGZCpTgItBNqUeKSTsgKWw=; b=Csl3f0zENul0C6tGLxmmQbKkParqyVU5ZQdNvSp/aW4bRojmbtJgSVIVT7NFvq7vXSGsGX 0pxJzE2TYCJ7V1RRO2kDQ7KjraFm9cR80RkYlwzPJL9UnlZHFPQKQ3a5cdxbSTuq4Hqsi8 ltbcY1xW0rPbFKhiPHcx3guIXVO/EO4= X-MC-Unique: cD7nVlF9Ob2srJnCvsjI5w-1 X-Mimecast-MFC-AGG-ID: cD7nVlF9Ob2srJnCvsjI5w_1771343575 To: devel@lists.libvirt.org Subject: [PATCH 1/6] qemuSaveImageOpen: Remove wrong ATTRIBUTE_NONNULL Date: Tue, 17 Feb 2026 16:52:46 +0100 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: Crlq3U1PKJ2_ZHaVHX5nPgnh6LB7oWOMzbbQt1H0aEw_1771343575 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: DA7U54SLFPZBDXA6EFCD3WD56AGVACEF X-Message-ID-Hash: DA7U54SLFPZBDXA6EFCD3WD56AGVACEF 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: 1771343686521158500 Content-Type: text/plain; charset="utf-8" From: Peter Krempa After commit 517248e2394 removed the previously-4th argument the ATTRIBUTE_NONNULL(4) annotation no longer makes sense. Fixes: 517248e2394476a3105ff5866b0b718fc6583073 Signed-off-by: Peter Krempa Reviewed-by: Michal Privoznik --- src/qemu/qemu_saveimage.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index b46cabffe5..887545899f 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -95,7 +95,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, bool sparse, virFileWrapperFd **wrapperFd, bool open_write) - ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4); + ATTRIBUTE_NONNULL(2); int qemuSaveImageGetCompressionProgram(virQEMUSaveFormat format, --=20 2.53.0 From nobody Tue Mar 3 03:04:10 2026 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=1771343734; cv=none; d=zohomail.com; s=zohoarc; b=E5YJeBLSUe5w6iuiAiMhPUwVM5sk3J8RhtXw+qRSyPLb1sTN+u9/wEN73qEeiCgMtuWC1RjrfWLntvQ67HzJmcvbl3ijPeTRGY956npnZP1PusrqqO5p+HZM9C+J8OIe7+m0drWQ6g3d4x6Y+x+Z3f+Sf544e5o8e88k1QVrDVs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771343734; 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=3pyLTCZ8sUoG5d+g3ZQ7HTpXUvtPJQmTbGqkj5fzDLQ=; b=ellKg7CGqn6EySrvlSA669rxBedsjS/VjyfhgUdD4zDQqTdbvA97ngou4inUOdQVGyVgCSz1heA+tJ01j8/f9niA6ncqMNf3ntv1VzuN3681ALy6y34txu4ODzOQiCZ8IzYORBQqtvT+mA5IctBq2wjfqx3H1xsgk3jvzRW4lLI= 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 1771343734649885.406405773552; Tue, 17 Feb 2026 07:55:34 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id D2E103F943; Tue, 17 Feb 2026 10:55:33 -0500 (EST) Received: from [172.19.199.9] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id E0E63419DB; Tue, 17 Feb 2026 10:53:30 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id A2CE53F8B4; Tue, 17 Feb 2026 10:53:26 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 BE3983FA2E for ; Tue, 17 Feb 2026 10:53:00 -0500 (EST) Received: from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-631-mMIZ5jqEM5ikylLjbUfjkw-1; Tue, 17 Feb 2026 10:52:58 -0500 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id A7827195FDC8 for ; Tue, 17 Feb 2026 15:52:56 +0000 (UTC) Received: from speedmetal.lan (unknown [10.45.242.39]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id F25791800361 for ; Tue, 17 Feb 2026 15:52:55 +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=-4.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, 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=1771343580; 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=3pyLTCZ8sUoG5d+g3ZQ7HTpXUvtPJQmTbGqkj5fzDLQ=; b=KWbU01F6PzdCO6w52RbFt68j9BYucuMBvw/U22wftfd60Hp0lhfpL89V2nNQ8q1ijndgpo hGA+50UhTmiZGq92r5L1/Fwu9uC301J9XS5d1XuvTvWoHby86kWcFlQglQ9oqoUrxAo5Lp q0SMivVWJf+IrEdRbPAKOsLb1RlYgeE= X-MC-Unique: mMIZ5jqEM5ikylLjbUfjkw-1 X-Mimecast-MFC-AGG-ID: mMIZ5jqEM5ikylLjbUfjkw_1771343576 To: devel@lists.libvirt.org Subject: [PATCH 2/6] qemuMonitorMigrateToFdSet: Drop 'flags' argument Date: Tue, 17 Feb 2026 16:52:47 +0100 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: NmamP_gQiqcYhachncm6ActtjWhwcgxW4JVG3kxgJ1s_1771343576 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: BAKYC5GKVE3GYC5732OP76CVMGLK7G7K X-Message-ID-Hash: BAKYC5GKVE3GYC5732OP76CVMGLK7G7K 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: 1771343736077154100 Content-Type: text/plain; charset="utf-8" From: Peter Krempa The only caller doesn't use it. Signed-off-by: Peter Krempa Reviewed-by: Michal Privoznik --- src/qemu/qemu_migration.c | 2 +- src/qemu/qemu_monitor.c | 6 +++--- src/qemu/qemu_monitor.h | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 0e097f25b1..fec808ccfb 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -7219,7 +7219,7 @@ qemuMigrationSrcToSparseFile(virDomainObj *vm, if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) return -1; - ret =3D qemuMonitorMigrateToFdSet(vm, 0, fd, &directFd); + ret =3D qemuMonitorMigrateToFdSet(vm, fd, &directFd); qemuDomainObjExitMonitor(vm); return ret; } diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 958cd3a247..05334fabd5 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2275,7 +2275,6 @@ qemuMonitorMigrateToFd(qemuMonitor *mon, int qemuMonitorMigrateToFdSet(virDomainObj *vm, - unsigned int flags, int *fd, int *directFd) { @@ -2284,9 +2283,10 @@ qemuMonitorMigrateToFdSet(virDomainObj *vm, off_t offset; g_autoptr(qemuFDPass) fdPassMigrate =3D NULL; g_autofree char *uri =3D NULL; + unsigned int migrateFlags =3D 0; /* currently no flags are passed to t= he 'migrate' command */ int ret; - VIR_DEBUG("fd=3D%d directFd=3D%d flags=3D0x%x", *fd, *directFd, flags); + VIR_DEBUG("fd=3D%d directFd=3D%d", *fd, *directFd); QEMU_CHECK_MONITOR(mon); @@ -2304,7 +2304,7 @@ qemuMonitorMigrateToFdSet(virDomainObj *vm, uri =3D g_strdup_printf("file:%s,offset=3D%#jx", qemuFDPassGetPath(fdPassMigrate), (uintmax_t)off= set); - ret =3D qemuMonitorJSONMigrate(mon, flags, uri); + ret =3D qemuMonitorJSONMigrate(mon, migrateFlags, uri); return ret; } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index ddbf3371ca..d3611d9713 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1090,7 +1090,6 @@ qemuMonitorMigrateToFd(qemuMonitor *mon, int qemuMonitorMigrateToFdSet(virDomainObj *vm, - unsigned int flags, int *fd, int *directFd); --=20 2.53.0 From nobody Tue Mar 3 03:04:10 2026 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=1771343776; cv=none; d=zohomail.com; s=zohoarc; b=ca7IDjgD38tusod7U8y2/pS+YZCUzB9bmFwFTKuwxogfFq7DMrc7DAx8h3X8s74hTUENXIMkXjHgZ0SEOomerH4OknfpxGN4FwZiIDdudgUuurdikRe5zuvs1XwKED1qqfbQSpty1uaJLKUkc3aI/YgU7Ie3UhnejEYR9036Iik= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771343776; 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=SuKMpvsz3qDMH2NgG4/ySm9qkhEnJG3qqJD3zEHeVTg=; b=flrAVD5W8IRjb6rH5AAPsZrmMh1v7d60pkd7fgqf0f3spUChAUN4Zn3NbQxEhb1fP+AL+BHPKBAc4eXiJczNdtQMYmoTWG6pYyXbYkhRklmHh3aKhJ6q6fLO4WissAOPy/2hsC2FrmAG/YVS+32jo+skN87GnFnJ396ucQpVf8w= 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 1771343776284485.85093226170875; Tue, 17 Feb 2026 07:56:16 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 653C63F94D; Tue, 17 Feb 2026 10:56:16 -0500 (EST) Received: from [172.19.199.9] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 3F5B041A0A; Tue, 17 Feb 2026 10:53:56 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id D58974188B; Tue, 17 Feb 2026 10:53:52 -0500 (EST) 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 22CE94180D for ; Tue, 17 Feb 2026 10:53:01 -0500 (EST) Received: from mx-prod-mc-08.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-324-2sAhIYMtMIWaxH6JpGF3ZA-1; Tue, 17 Feb 2026 10:52:58 -0500 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id EAF9518002E6 for ; Tue, 17 Feb 2026 15:52:57 +0000 (UTC) Received: from speedmetal.lan (unknown [10.45.242.39]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 276131800361 for ; Tue, 17 Feb 2026 15:52:56 +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=-4.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, 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=1771343580; 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=SuKMpvsz3qDMH2NgG4/ySm9qkhEnJG3qqJD3zEHeVTg=; b=FLfPPmSK8j/04tyCGWosKyJw6TxhejYYdptAZxDCwGUKOVPwVx+hbx6joNO46JfA8/YxWl Tas7v2NUdTOSyRwo2SCNd+1fubcaXtU1d/vqwXko/OnmcOjQOGUCG/ly70tf74/k0qvrJH DImNT+Jfdm0b2XXS8vvOZ4n4dBHFa0g= X-MC-Unique: 2sAhIYMtMIWaxH6JpGF3ZA-1 X-Mimecast-MFC-AGG-ID: 2sAhIYMtMIWaxH6JpGF3ZA_1771343578 To: devel@lists.libvirt.org Subject: [PATCH 3/6] virfile: Introduce 'virFileFDIsRegular' Date: Tue, 17 Feb 2026 16:52:48 +0100 Message-ID: <7e7ec31d03475885f2f3b9d712cab66dac4549ef.1771343375.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 3VItadOluKgabt6jLfgAyZ7ErM7qL6vpDhW7C6WsGjE_1771343578 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: RQCSCXSQIIVRDKZFFBQXCKCJBK7JPBT7 X-Message-ID-Hash: RQCSCXSQIIVRDKZFFBQXCKCJBK7JPBT7 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: 1771343778362158500 Content-Type: text/plain; charset="utf-8" From: Peter Krempa Similarly to 'virFileIsRegular' return if the FD is a regular file. Signed-off-by: Peter Krempa Reviewed-by: Michal Privoznik --- src/libvirt_private.syms | 1 + src/util/virfile.c | 8 ++++++++ src/util/virfile.h | 1 + 3 files changed, 10 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d8ae4f46cd..b200037189 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2375,6 +2375,7 @@ virFileDeleteTree; virFileDirectFdFlag; virFileExists; virFileFclose; +virFileFDIsRegular; virFileFdopen; virFileFindHugeTLBFS; virFileFindMountPoint; diff --git a/src/util/virfile.c b/src/util/virfile.c index 9316606ce8..65b04beb8c 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -2031,6 +2031,14 @@ virFileIsRegular(const char *path) } +bool +virFileFDIsRegular(int fd) +{ + struct stat s; + return (fstat(fd, &s) =3D=3D 0) && S_ISREG(s.st_mode); +} + + /** * virFileExists: Check for presence of file * @path: Path of file to check diff --git a/src/util/virfile.h b/src/util/virfile.h index ce2ffb8ed4..8c9ad59898 100644 --- a/src/util/virfile.h +++ b/src/util/virfile.h @@ -218,6 +218,7 @@ bool virFileIsDir (const char *file) ATTRIBUTE_NONNULL(= 1); bool virFileExists(const char *file) ATTRIBUTE_NONNULL(1) ATTRIBUTE_MOCKAB= LE; bool virFileIsExecutable(const char *file) ATTRIBUTE_NONNULL(1); bool virFileIsRegular(const char *file) ATTRIBUTE_NONNULL(1); +bool virFileFDIsRegular(int fd); enum { VIR_FILE_SHFS_NFS =3D (1 << 0), --=20 2.53.0 From nobody Tue Mar 3 03:04:10 2026 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=1771343949; cv=none; d=zohomail.com; s=zohoarc; b=Mi442BRMRR8cdT47rK6czph97ac2cKVFLmq0nJPrB+Kdj8hxVUeP0trhGGxX7qQLfxW0WfXFhHjuDMKdzqjwTjAtwsi/3+fdoBhQMkNBYVjBPnUOnaCuaLJfo+tY82Nmhn4rOA3gvmPAIEZKrEb7CzOr6EHy+sfhh5n6CdHLZ4Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771343949; 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=eudAkgZF3X5JWZIbGsUnFYtYxkHjlAvrUhuZSxHZbEs=; b=UYwdSxU6yCbfjY3Ltp1vVBbwQn5U1+Av6w5YYfjYfPXphF+sWq1p8fNyhIHMULFxGO0PaHZ0AMr2qRZl4HknbBVA9FOAvNsow+jliX3i15b92kbxrGFdNRQll+Gvi/ma+PNnVNlApP2ZHTJ/rFiB/MU/sSNmR39gq5TAXKw/VOk= 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 1771343949839645.0266236925554; Tue, 17 Feb 2026 07:59:09 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 4F7853F8E5; Tue, 17 Feb 2026 10:59:09 -0500 (EST) Received: from [172.19.199.9] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 88AEC41AE5; Tue, 17 Feb 2026 10:54:49 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id D13E44196C; Tue, 17 Feb 2026 10:54:44 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.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 8CC8B3F3DD for ; Tue, 17 Feb 2026 10:53:04 -0500 (EST) Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-689-a7g2ezvfOAyTe88id-PzzQ-1; Tue, 17 Feb 2026 10:53:02 -0500 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 133C21955F1A for ; Tue, 17 Feb 2026 15:52:59 +0000 (UTC) Received: from speedmetal.lan (unknown [10.45.242.39]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 5CD19180058F for ; Tue, 17 Feb 2026 15:52:58 +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=-4.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, 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=1771343584; 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=eudAkgZF3X5JWZIbGsUnFYtYxkHjlAvrUhuZSxHZbEs=; b=LnZeFCGY3yfTx2peSzt4bLCvCK+8jX3kTnoZbfzWDR/mQscrKbI8qgIiwgneUbzvN6cNX2 q5RmwFEU5fOomzNJYpt6OfBk6GZdOnZNRe2ue611Bobbuqc9/orIM+sk62eCGiw8lLCPkI Lk7WS7ULROHyGmvSLXsLHIxZx9wJFps= X-MC-Unique: a7g2ezvfOAyTe88id-PzzQ-1 X-Mimecast-MFC-AGG-ID: a7g2ezvfOAyTe88id-PzzQ_1771343579 To: devel@lists.libvirt.org Subject: [PATCH 4/6] qemuSaveImageCreateFd: Handle case when 'virQEMUFileOpenAs' doesn't return a file fd for 'sparse' format Date: Tue, 17 Feb 2026 16:52:49 +0100 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: dAlkyVDDoQo7hxUFCTOH7eT9Ls75Q0b39psdcK8AHJs_1771343579 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: FMI7HCNSWHC4FXL46WJ74QENDNDIRNIS X-Message-ID-Hash: FMI7HCNSWHC4FXL46WJ74QENDNDIRNIS 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: 1771343951374154101 Content-Type: text/plain; charset="utf-8" From: Peter Krempa The 'sparse' uses a mode in qemu which requires direct access to the file descriptior of the file itself. If we reside on root-squashed NFS the FD from 'virQEMUFileOpenAs' may not actually be a file which would not work with qemu. Reject such a config with a better error message and add documentation outlining the quirk. Signed-off-by: Peter Krempa Reviewed-by: Michal Privoznik --- src/qemu/qemu_saveimage.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 23922acd51..a3519f8538 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -423,6 +423,20 @@ qemuSaveImageDecompressionStop(virCommand *cmd, } +/** + * qemuSaveImageCreateFd: + * @vm: domain object + * @path: path to the save image file + * @wrapperFd: filled with helper structure for the virFileWrapper + * @sparse: 'sparse' image format is used for the save image + * @needUnlink: if filled with 'true' a new file was created and needs to = be + * removed on failure + * @bypassCache: Don't use cache for the writes of the save image + * + * Opens the save image @path and prepares it for saving of the VM state. + * Returns a file descriptor on succes. The returned FD is a pipe unless @ + * sparse is true in which case it's an fd to a file. + */ static int qemuSaveImageCreateFd(virDomainObj *vm, const char *path, @@ -455,6 +469,16 @@ qemuSaveImageCreateFd(virDomainObj *vm, if (fd < 0) return -1; + /* 'virQEMUFileOpenAs' can return a pipe/socket in case when it needs = to bypass + * root-squashed NFS. Since 'sparse' backing format works only with re= al + * files we need to reject such cases */ + if (sparse && !virFileFDIsRegular(fd)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("path '%1$s' can't be opened directly (without th= e use of helper proces) which is incompatible with 'sparse' save image"), + path); + return -1; + } + if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def= , fd) < 0) return -1; --=20 2.53.0 From nobody Tue Mar 3 03:04:10 2026 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=1771343848; cv=none; d=zohomail.com; s=zohoarc; b=TmsFaKrh8phVKJRme6Rth27WHqnzOMmpMov4A//SPBlhbeRk+POHvQduYApljGqOcEPEcdtrxRt4lUk0o0xCQ51L6NKYeMhQ5uZpu0cZtS5S/yXOerP0yVNJv0tn9ED51zX1HleW/57Nu1aQUv1aM7LRSr8A2NOjTzP41zSJ2jk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771343848; 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=k1YMYJ6jM7nFcaezcys+pgqNsASpVSpFD4zDomVEGLk=; b=GZhF2uS1JKYutyzjKG8Yg+EsJ5eoPSV04osK1k8b6KwjK3EZ5ETLXlF+H70Bt8YVHMX4KgeWDdwApdyx1leNPa19lUzUYxnuNmh7CXurt4R5rPm1UgNhktXdRrJiti4uBSGAGl5PhYy45FTFwclRiZkF2Xz0hDMsU1SFyKEpFOs= 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 1771343848924466.74886312174203; Tue, 17 Feb 2026 07:57:28 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 17882418FA; Tue, 17 Feb 2026 10:57:28 -0500 (EST) Received: from [172.19.199.9] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 4D11341A59; Tue, 17 Feb 2026 10:54:14 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 7CA703F95E; Tue, 17 Feb 2026 10:54:09 -0500 (EST) 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 B84E1418F6 for ; Tue, 17 Feb 2026 10:53:02 -0500 (EST) Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-482--nIV6N0rNcOvHa82cpyGYw-1; Tue, 17 Feb 2026 10:53:01 -0500 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 35B4C1954B12 for ; Tue, 17 Feb 2026 15:53:00 +0000 (UTC) Received: from speedmetal.lan (unknown [10.45.242.39]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 821E31800590 for ; Tue, 17 Feb 2026 15:52:59 +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=-4.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, 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=1771343582; 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=k1YMYJ6jM7nFcaezcys+pgqNsASpVSpFD4zDomVEGLk=; b=W2Epps/oF2DgsJ5/kQGo6i96AV0rIJ7zpe9xGo5zjhDzaLVG/YjpvOjn3Q7ysMjdBIwQKt DiAZLFgDGHqSllr7znPpnkHzuan8FTmJWR1iumgJfBffk3UufheTpTvDWj4h0EcCcW3Ga1 PptH2bxn7P4FdilO3k6JelMcgQzA50s= X-MC-Unique: -nIV6N0rNcOvHa82cpyGYw-1 X-Mimecast-MFC-AGG-ID: -nIV6N0rNcOvHa82cpyGYw_1771343580 To: devel@lists.libvirt.org Subject: [PATCH 5/6] qemu: driver: Merge 'qemuDomainRestoreInternal' and 'qemuDomainObjRestore' Date: Tue, 17 Feb 2026 16:52:50 +0100 Message-ID: <55dfbc629bf68d8cf5293ebaa0820a985784978d.1771343375.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: Z-g2nBdFh_SahGdTdCX5LNLSZdOg-EBIFQZMltiEKvQ_1771343580 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: QE7GSHLHXX45TUVMZ2MKYEEH3Y65EY47 X-Message-ID-Hash: QE7GSHLHXX45TUVMZ2MKYEEH3Y65EY47 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: 1771343851016158500 Content-Type: text/plain; charset="utf-8" From: Peter Krempa The two functions are for reverting a save image. They differ only on what domain object is used (new one vs existing one). Merge the code paths for existing VMs (for managed save restore) into 'qemuDomainRestoreInternal' and reuse it instead of 'qemuDomainObjRestore'. Signed-off-by: Peter Krempa Reviewed-by: Michal Privoznik --- src/qemu/qemu_driver.c | 222 +++++++++++++++++++---------------------- 1 file changed, 100 insertions(+), 122 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7f08fd05e9..c2d810c013 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5760,19 +5760,50 @@ static int qemuNodeGetSecurityModel(virConnectPtr c= onn, return 0; } + +/** + * qemuDomainRestoreInternal: + * @conn: connection object + * @vmRestore: Domain object (optional; see below) + * @path: path to the save image file + * @unlink_corrupt: remove corrupted save image file @path + * @dxml: XML to replace definition in the save image (optional) + * @params: restore parameters + * @nparams: number of @params + * @flags: binary-OR of virDomainSaveRestoreFlags + * @ensureACL: callback for function checking ACL access (optional) + * @asyncJob: async job type + * + * Restores VM from save image at @path. + * + * If @vmRestore is non-NULL the VM object is reused and also the name and= UUID + * of the VM from the save image is checked against it. + * + * @dxml can be used to optionally override the XML from the save image. + * + * @ensureACL must be passed unless the access to the domain object was al= ready + * verified. + * + * Returns 0 on success; -1 on error. If @unlink_corrupt is true and the + * corrupted image was removed 1 is returned. + */ static int qemuDomainRestoreInternal(virConnectPtr conn, + virDomainObj *vmRestore, const char *path, + bool unlink_corrupt, const char *dxml, virTypedParameterPtr params, int nparams, unsigned int flags, - int (*ensureACL)(virConnectPtr, virDomainDef *)) + int (*ensureACL)(virConnectPtr, virDomainDef *), + virDomainAsyncJob asyncJob) { virQEMUDriver *driver =3D conn->privateData; qemuDomainObjPrivate *priv =3D NULL; g_autoptr(virDomainDef) def =3D NULL; virDomainObj *vm =3D NULL; + virDomainObj *vmNew =3D NULL; g_autofree char *xmlout =3D NULL; const char *newxml =3D dxml; int fd =3D -1; @@ -5792,8 +5823,21 @@ qemuDomainRestoreInternal(virConnectPtr conn, if (flags & VIR_DOMAIN_SAVE_RESET_NVRAM) reset_nvram =3D true; - if (qemuSaveImageGetMetadata(driver, NULL, path, ensureACL, conn, &def= , &data) < 0) + if (qemuSaveImageGetMetadata(driver, NULL, path, ensureACL, conn, &def= , &data) < 0) { + if (unlink_corrupt && + qemuSaveImageIsCorrupt(driver, path)) { + if (unlink(path) < 0) { + virReportSystemError(errno, + _("cannot remove corrupt file: %1$s"), + path); + } else { + virResetLastError(); + ret =3D 1; + } + } + goto cleanup; + } sparse =3D data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE; if (!(restoreParams =3D qemuMigrationParamsForSave(params, nparams, sp= arse, @@ -5833,12 +5877,36 @@ qemuDomainRestoreInternal(virConnectPtr conn, def =3D tmp; } - if (!(vm =3D virDomainObjListAdd(driver->domains, &def, - driver->xmlopt, - VIR_DOMAIN_OBJ_LIST_ADD_LIVE | - VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, - NULL))) - goto cleanup; + if (vmRestore) { + vm =3D vmRestore; + + if (STRNEQ(vm->def->name, def->name) || + memcmp(vm->def->uuid, def->uuid, VIR_UUID_BUFLEN)) { + char vm_uuidstr[VIR_UUID_STRING_BUFLEN]; + char def_uuidstr[VIR_UUID_STRING_BUFLEN]; + virUUIDFormat(vm->def->uuid, vm_uuidstr); + virUUIDFormat(def->uuid, def_uuidstr); + virReportError(VIR_ERR_OPERATION_FAILED, + _("cannot restore domain '%1$s' uuid %2$s from = a file which belongs to domain '%3$s' uuid %4$s"), + vm->def->name, vm_uuidstr, + def->name, def_uuidstr); + goto cleanup; + } + + virDomainObjAssignDef(vm, &def, true, NULL); + } else { + if (!(vmNew =3D virDomainObjListAdd(driver->domains, &def, + driver->xmlopt, + VIR_DOMAIN_OBJ_LIST_ADD_LIVE | + VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LI= VE, + NULL))) + goto cleanup; + + vm =3D vmNew; + + if (qemuProcessBeginJob(vm, VIR_DOMAIN_JOB_OPERATION_RESTORE, flag= s) < 0) + goto cleanup; + } if (flags & VIR_DOMAIN_SAVE_RUNNING) data->header.was_running =3D 1; @@ -5850,13 +5918,11 @@ qemuDomainRestoreInternal(virConnectPtr conn, priv->hookRun =3D true; } - if (qemuProcessBeginJob(vm, VIR_DOMAIN_JOB_OPERATION_RESTORE, flags) <= 0) - goto cleanup; - ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, data, path, restor= eParams, - false, reset_nvram, VIR_ASYNC_JOB_START); + false, reset_nvram, asyncJob); - qemuProcessEndJob(vm); + if (vmNew) + qemuProcessEndJob(vmNew); cleanup: VIR_FORCE_CLOSE(fd); @@ -5864,9 +5930,9 @@ qemuDomainRestoreInternal(virConnectPtr conn, ret =3D -1; virFileWrapperFdFree(wrapperFd); virQEMUSaveDataFree(data); - if (vm && ret < 0) - qemuDomainRemoveInactive(vm, 0, false); - virDomainObjEndAPI(&vm); + if (vmNew && ret < 0) + qemuDomainRemoveInactive(vmNew, 0, false); + virDomainObjEndAPI(&vmNew); return ret; } @@ -5876,16 +5942,18 @@ qemuDomainRestoreFlags(virConnectPtr conn, const char *dxml, unsigned int flags) { - return qemuDomainRestoreInternal(conn, path, dxml, NULL, 0, flags, - virDomainRestoreFlagsEnsureACL); + return qemuDomainRestoreInternal(conn, NULL, path, false, dxml, NULL, = 0, + flags, virDomainRestoreFlagsEnsureACL, + VIR_ASYNC_JOB_START); } static int qemuDomainRestore(virConnectPtr conn, const char *path) { - return qemuDomainRestoreInternal(conn, path, NULL, NULL, 0, 0, - virDomainRestoreEnsureACL); + return qemuDomainRestoreInternal(conn, NULL, path, false, NULL, NULL, = 0, + 0, virDomainRestoreEnsureACL, + VIR_ASYNC_JOB_START); } static int @@ -5917,8 +5985,9 @@ qemuDomainRestoreParams(virConnectPtr conn, return -1; } - ret =3D qemuDomainRestoreInternal(conn, path, dxml, params, nparams, f= lags, - virDomainRestoreParamsEnsureACL); + ret =3D qemuDomainRestoreInternal(conn, NULL, path, false, dxml, param= s, nparams, + flags, virDomainRestoreParamsEnsureACL, + VIR_ASYNC_JOB_START); return ret; } @@ -6089,103 +6158,6 @@ qemuDomainManagedSaveDefineXML(virDomainPtr dom, co= nst char *dxml, return ret; } -/* Return 0 on success, 1 if incomplete saved image was silently unlinked, - * and -1 on failure with error raised. */ -static int -qemuDomainObjRestore(virConnectPtr conn, - virQEMUDriver *driver, - virDomainObj *vm, - const char *path, - bool start_paused, - bool bypass_cache, - bool reset_nvram, - virDomainAsyncJob asyncJob) -{ - g_autoptr(virDomainDef) def =3D NULL; - qemuDomainObjPrivate *priv =3D vm->privateData; - int fd =3D -1; - int ret =3D -1; - g_autofree char *xmlout =3D NULL; - virQEMUSaveData *data =3D NULL; - virFileWrapperFd *wrapperFd =3D NULL; - bool sparse =3D false; - g_autoptr(qemuMigrationParams) restoreParams =3D NULL; - - ret =3D qemuSaveImageGetMetadata(driver, NULL, path, NULL, NULL, &def,= &data); - if (ret < 0) { - if (qemuSaveImageIsCorrupt(driver, path)) { - if (unlink(path) < 0) { - virReportSystemError(errno, - _("cannot remove corrupt file: %1$s"), - path); - ret =3D -1; - } else { - virResetLastError(); - ret =3D 1; - } - } - goto cleanup; - } - - sparse =3D data->header.format =3D=3D QEMU_SAVE_FORMAT_SPARSE; - if (!(restoreParams =3D qemuMigrationParamsForSave(NULL, 0, sparse, - bypass_cache))) - return -1; - - fd =3D qemuSaveImageOpen(driver, path, bypass_cache, sparse, &wrapperF= d, false); - if (fd < 0) - goto cleanup; - - if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { - int hookret; - - if ((hookret =3D virHookCall(VIR_HOOK_DRIVER_QEMU, def->name, - VIR_HOOK_QEMU_OP_RESTORE, - VIR_HOOK_SUBOP_BEGIN, - NULL, data->xml, &xmlout)) < 0) - goto cleanup; - - if (hookret =3D=3D 0 && !virStringIsEmpty(xmlout)) { - virDomainDef *tmp; - - VIR_DEBUG("Using hook-filtered domain XML: %s", xmlout); - - if (!(tmp =3D qemuSaveImageUpdateDef(driver, def, xmlout))) - goto cleanup; - - virDomainDefFree(def); - def =3D tmp; - priv->hookRun =3D true; - } - } - - if (STRNEQ(vm->def->name, def->name) || - memcmp(vm->def->uuid, def->uuid, VIR_UUID_BUFLEN)) { - char vm_uuidstr[VIR_UUID_STRING_BUFLEN]; - char def_uuidstr[VIR_UUID_STRING_BUFLEN]; - virUUIDFormat(vm->def->uuid, vm_uuidstr); - virUUIDFormat(def->uuid, def_uuidstr); - virReportError(VIR_ERR_OPERATION_FAILED, - _("cannot restore domain '%1$s' uuid %2$s from a fi= le which belongs to domain '%3$s' uuid %4$s"), - vm->def->name, vm_uuidstr, - def->name, def_uuidstr); - goto cleanup; - } - - virDomainObjAssignDef(vm, &def, true, NULL); - - ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, data, path, restor= eParams, - start_paused, reset_nvram, asyncJob); - - cleanup: - virQEMUSaveDataFree(data); - VIR_FORCE_CLOSE(fd); - if (virFileWrapperFdClose(wrapperFd) < 0) - ret =3D -1; - virFileWrapperFdFree(wrapperFd); - return ret; -} - static char *qemuDomainGetXMLDesc(virDomainPtr dom, @@ -6358,11 +6330,17 @@ qemuDomainObjStart(virConnectPtr conn, vm->hasManagedSave =3D false; } else { virDomainJobOperation op =3D vm->job->current->operation; + unsigned int restore_flags =3D 0; + vm->job->current->operation =3D VIR_DOMAIN_JOB_OPERATION_RESTO= RE; - ret =3D qemuDomainObjRestore(conn, driver, vm, managed_save, - start_paused, bypass_cache, - reset_nvram, asyncJob); + restore_flags |=3D start_paused ? VIR_DOMAIN_SAVE_PAUSED : 0; + restore_flags |=3D bypass_cache ? VIR_DOMAIN_SAVE_BYPASS_CACHE= : 0; + restore_flags |=3D reset_nvram ? VIR_DOMAIN_SAVE_RESET_NVRAM := 0; + + ret =3D qemuDomainRestoreInternal(conn, vm, managed_save, true= , NULL, NULL, 0, + restore_flags, NULL, + asyncJob); if (ret =3D=3D 0) { if (unlink(managed_save) < 0) --=20 2.53.0 From nobody Tue Mar 3 03:04:10 2026 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=1771343909; cv=none; d=zohomail.com; s=zohoarc; b=FhVdY+8hUh7QEPuadA4gGNzEp8SlysU0y0To4tUxXD9+Y5vAPBvzmmVQ4/Vm5jSRIjTZEhLxSLqk9WrjW0r1SpBX5H66ynAtVhLStxcb9gZB90VZL9nicBlIibDtMlqsRMsJfzfJyC8CI/gtw1AiR4nwBIlm6GCUDq18bqhBBs0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771343909; 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=hGNdRi3PuJKIgcT90ZFtnEYoRmQfnR7ATVFQWsalZCg=; b=gQEg5wr5VitjeHES8ZJth89dz4UvfGzQwEO2Sn/YjFs5ojxvwCyldarvz00N9Vq9iFSJJRQ5zKzcOfbH71Qv2WpofgvSwxB6azH+LGtyNTOXw2vkkr2Te+8u8gvm2pEhEYyNPGddno72SKdD8+Nt0RIccqvuHhxVveqKsmEbrXo= 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 1771343909710912.8942427965258; Tue, 17 Feb 2026 07:58:29 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id 0ED47418F0; Tue, 17 Feb 2026 10:58:29 -0500 (EST) Received: from [172.19.199.9] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 565E941AB1; Tue, 17 Feb 2026 10:54:29 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id A0AB54193B; Tue, 17 Feb 2026 10:54:23 -0500 (EST) 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 B90AD41911 for ; Tue, 17 Feb 2026 10:53:03 -0500 (EST) Received: from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-442-8h3PfWvUNOWsXzRoaTNvFA-1; Tue, 17 Feb 2026 10:53:02 -0500 Received: from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111]) (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-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 4CC351956058 for ; Tue, 17 Feb 2026 15:53:01 +0000 (UTC) Received: from speedmetal.lan (unknown [10.45.242.39]) by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 9A5841800590 for ; Tue, 17 Feb 2026 15:53:00 +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=-4.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, 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=1771343583; 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=hGNdRi3PuJKIgcT90ZFtnEYoRmQfnR7ATVFQWsalZCg=; b=LZLk06vjEVThzeLuTSFSC5PmaUY005e3+Va9GPS+VmKpSdqATDbdiT48kVuGFzfbTUKwc0 nDGEYALOBkXPdl1rOyzIsNimy3CK6paKH/422gSRXRIsNUuC4TkZiLWLb4tk0JvjrWCkdY BLObpQ9ANUAtL0w2nbL9uW3S7TzrJXA= X-MC-Unique: 8h3PfWvUNOWsXzRoaTNvFA-1 X-Mimecast-MFC-AGG-ID: 8h3PfWvUNOWsXzRoaTNvFA_1771343581 To: devel@lists.libvirt.org Subject: [PATCH 6/6] qemu: saveimage: Use 'virFileWrapperFd' when loading non-sparse saveimage Date: Tue, 17 Feb 2026 16:52:51 +0100 Message-ID: <47d236108cc8e0c4b513a09bb550102353b283d8.1771343375.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.111 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 7vl4Gq_Vz1K4O8vSHY_HQNQVGnmexz8s-99CvZn9b6E_1771343581 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: OQEXFDBHTB6I23FLPVVQ2GMVZTLXQNAF X-Message-ID-Hash: OQEXFDBHTB6I23FLPVVQ2GMVZTLXQNAF 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: 1771343911017154100 Content-Type: text/plain; charset="utf-8" From: Peter Krempa Always instantiate a 'virFileWrapperFd' (iohelper) to wrap the saveimage file descriptor of a non-'sparse' format saveimage. For 'sparse' images we also need to ensure that the FD returned when opening the save image is an actual file FD (thus not the FD from the helper process used to bypass root-squashed NFS) as qemu requires an actual file in those cases. This patch reworks 'qemuSaveImageOpen' to create the wrapper process based on whether the 'wrapperFd' variable is non-NULL rather than based on a combination of 'sparse' and 'bypass_cache' flags. The caller will then based on the image format and the need for the wrapper use the appropriate settings. As with this patch all non-sparse images will always pass a pipe instead of a file to qemu it also fixes problems with qemu-11.0 where the 'fd' migration protocol rejects FDs which point to a file. Resolves: https://issues.redhat.com/browse/RHEL-76301 Closes: https://gitlab.com/libvirt/libvirt/-/issues/850 Signed-off-by: Peter Krempa Reviewed-by: Michal Privoznik --- src/qemu/qemu_driver.c | 32 ++++++++++++++++++++++++++------ src/qemu/qemu_saveimage.c | 24 +++++++++++++----------- src/qemu/qemu_saveimage.h | 4 +++- src/qemu/qemu_snapshot.c | 12 ++++++++++-- 4 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c2d810c013..03cdbd9dc3 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5813,6 +5813,7 @@ qemuDomainRestoreInternal(virConnectPtr conn, bool hook_taint =3D false; bool reset_nvram =3D false; bool sparse =3D false; + bool bypass_cache =3D (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) !=3D 0; g_autoptr(qemuMigrationParams) restoreParams =3D NULL; virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE | @@ -5844,11 +5845,30 @@ qemuDomainRestoreInternal(virConnectPtr conn, (flags & VIR_DOMAIN_S= AVE_BYPASS_CACHE)))) goto cleanup; - fd =3D qemuSaveImageOpen(driver, path, - (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) !=3D 0, - sparse, &wrapperFd, false); - if (fd < 0) - goto cleanup; + if (sparse) { + if ((fd =3D qemuSaveImageOpen(driver, path, bypass_cache, NULL, fa= lse)) < 0) + goto cleanup; + + /* In sparse mode the FD needs to be a real file as qemu accesses = it + * directly thus: + * - ensure that we actualy got a file FD + * - there's no need to seek it as qemu does it itself + */ + if (!virFileFDIsRegular(fd)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("path '%1$s' can't be opened directly (withou= t the use of helper proces) which is incompatible with 'sparse' save image"= ), + path); + goto cleanup; + } + } else { + if ((fd =3D qemuSaveImageOpen(driver, path, bypass_cache, &wrapper= Fd, false)) < 0) + goto cleanup; + + /* When virFileWrapperFD is used 'fd' can't be seeked so to make it + * point to the data read the header */ + if (qemuSaveImageFDSkipHeader(fd) < 0) + goto cleanup; + } if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { int hookret; @@ -6039,7 +6059,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, conn, &def, &data) < 0) goto cleanup; - fd =3D qemuSaveImageOpen(driver, path, false, false, NULL, true); + fd =3D qemuSaveImageOpen(driver, path, false, NULL, true); if (fd < 0) goto cleanup; diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index a3519f8538..64fbcd5f51 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -312,6 +312,13 @@ qemuSaveImageReadHeader(int fd, virQEMUSaveData **ret_= data) } +int +qemuSaveImageFDSkipHeader(int fd) +{ + return qemuSaveImageReadHeader(fd, NULL); +} + + /** * qemuSaveImageDecompressionStart: * @data: data from memory state file @@ -697,7 +704,6 @@ qemuSaveImageGetMetadata(virQEMUDriver *driver, * @driver: qemu driver data * @path: path of the save image * @bypass_cache: bypass cache when opening the file - * @sparse: Image contains mapped-ram save format * @wrapperFd: returns the file wrapper structure * @open_write: open the file for writing (for updates) * @@ -707,7 +713,6 @@ int qemuSaveImageOpen(virQEMUDriver *driver, const char *path, bool bypass_cache, - bool sparse, virFileWrapperFd **wrapperFd, bool open_write) { @@ -729,16 +734,13 @@ qemuSaveImageOpen(virQEMUDriver *driver, if ((fd =3D qemuDomainOpenFile(cfg, NULL, path, oflags, NULL)) < 0) return -1; - /* If sparse, no need for the iohelper or positioning the file pointer= . */ - if (!sparse) { - if (bypass_cache && - !(*wrapperFd =3D virFileWrapperFdNew(&fd, path, - VIR_FILE_WRAPPER_BYPASS_CAC= HE))) - return -1; + if (wrapperFd) { + unsigned int fdflags =3D VIR_FILE_WRAPPER_NON_BLOCKING; + + if (bypass_cache) + fdflags |=3D VIR_FILE_WRAPPER_BYPASS_CACHE; - /* Read the header to position the file pointer for QEMU. Unfortun= ately we - * can't use lseek with virFileWrapperFD. */ - if (qemuSaveImageReadHeader(fd, NULL) < 0) + if (!(*wrapperFd =3D virFileWrapperFdNew(&fd, path, fdflags))) return -1; } diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 887545899f..0d5a383212 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -92,7 +92,6 @@ int qemuSaveImageOpen(virQEMUDriver *driver, const char *path, bool bypass_cache, - bool sparse, virFileWrapperFd **wrapperFd, bool open_write) ATTRIBUTE_NONNULL(2); @@ -127,6 +126,9 @@ qemuSaveImageCreate(virDomainObj *vm, unsigned int flags, virDomainAsyncJob asyncJob); +int +qemuSaveImageFDSkipHeader(int fd); + int virQEMUSaveDataWrite(virQEMUSaveData *data, int fd, diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 70e4c37144..82ae38ca29 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2423,6 +2423,7 @@ qemuSnapshotRevertWriteMetadata(virDomainObj *vm, typedef struct _qemuSnapshotRevertMemoryData { int fd; char *path; + virFileWrapperFd *wrapperFd; virQEMUSaveData *data; } qemuSnapshotRevertMemoryData; @@ -2430,6 +2431,8 @@ static void qemuSnapshotClearRevertMemoryData(qemuSnapshotRevertMemoryData *memdata) { VIR_FORCE_CLOSE(memdata->fd); + ignore_value(virFileWrapperFdClose(memdata->wrapperFd)); + virFileWrapperFdFree(memdata->wrapperFd); virQEMUSaveDataFree(memdata->data); } G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(qemuSnapshotRevertMemoryData, qemuSnapsho= tClearRevertMemoryData); @@ -2506,10 +2509,15 @@ qemuSnapshotRevertExternalPrepare(virDomainObj *vm, return -1; memdata->fd =3D qemuSaveImageOpen(driver, memdata->path, - false, false, NULL, false); + false, &memdata->wrapperFd, false); if (memdata->fd < 0) return -1; + /* If 'wrapperFd' is used the FD can't be seeked so we need to make + * it point to the actual data, thus seek across the header */ + if (qemuSaveImageFDSkipHeader(memdata->fd) < 0) + return -1; + if (!virDomainDefCheckABIStability(savedef, domdef, driver->xmlopt= )) return -1; } @@ -2705,7 +2713,7 @@ qemuSnapshotRevertActive(virDomainObj *vm, bool defined =3D false; int rc; g_autoptr(virDomainSnapshotDef) tmpsnapdef =3D NULL; - g_auto(qemuSnapshotRevertMemoryData) memdata =3D { -1, NULL, NULL }; + g_auto(qemuSnapshotRevertMemoryData) memdata =3D { .fd =3D -1 }; bool started =3D false; start_flags |=3D VIR_QEMU_PROCESS_START_PAUSED; --=20 2.53.0