From nobody Thu Sep 19 01:01:02 2024 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=1718319545; cv=none; d=zohomail.com; s=zohoarc; b=P3jOP1VSGm8JjMiVQ+SMCVNMgQDlrbJVCUiGfgDd9j9X+ZCmk9jmFsD16HSpdwQcrIwI7LuVXucre/yTv4DKxAV2Vrl2Z6kETFlPNpchpoL9com+xFv8W2QAsJJiYG2x92kEPKgaKDT2J58sYJx76yy/41YK7Jp/0C1Sp0uQbl8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1718319545; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post: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=azHUXqv/O/WHBZdGCpiBw2TUyJVBYbE7yIZ9h7j4QsA=; b=XAsbHCcwaQBheLrLvTf7W2f4scbO9Et0x12klCXJm82Pyttf5rXgGyc5N+RxIcsS4TmtmjjpU4UFHcDaPaigBLIlAR0i5JNJ3T177Tm84So5EaAUvX1veHLXmmg5x1NR9HDbc7nesNJxTQqQvi4gKfxaT8NcLrd4/krMrDIW6QY= 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 1718319545270220.2393649786393; Thu, 13 Jun 2024 15:59:05 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 3562E9CA; Thu, 13 Jun 2024 18:59:04 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 0162D12D4; Thu, 13 Jun 2024 18:54:32 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 9D5FF12CD; Thu, 13 Jun 2024 18:54:29 -0400 (EDT) Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 5C44211F3 for ; Thu, 13 Jun 2024 18:52:50 -0400 (EDT) Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-35f1bc63981so1655705f8f.1 for ; Thu, 13 Jun 2024 15:52:50 -0700 (PDT) Received: from localhost ([69.51.97.134]) by smtp.gmail.com with ESMTPSA id e9e14a558f8ab-375d866e27fsm4376825ab.14.2024.06.13.15.52.48 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Jun 2024 15:52:48 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE, T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1718319169; x=1718923969; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=wDpsDkitBj2LFWULfMDvURVaScKp3YhD/dOxsBPKczk=; b=LAxRVwMFujQ2NR7IvuFTA7li+DcYNkcdR7W65nwFLjW4WKtjgYIMzRuW4TEXH8bkyu /F7obh5bzfVMW730sRuMTs60BlLMzTKVOyYl8FU1Mh9y/NMPriB0/U9Fkn+5RJaR0nMK kGXgwiabfW1iS/mVs8BjnjmlUKIBQi9v+BEeDZfPpppYvE/+kItDSN5axEgosUt/aUvs n1kSc5TezzE53f1fDup4VXwmwRO930xnZX3nk2rftAk7rdrxRkbly58TCNe++1iX6aMv f6yRkO/4wsMXwk9/ifpEKM89CcXzUnBVJMDyN8R/tiZdQjY+JbxhdWPBGC5ELZWuqQAQ k04A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718319169; x=1718923969; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wDpsDkitBj2LFWULfMDvURVaScKp3YhD/dOxsBPKczk=; b=cQN5iuhMJwHByT2D3RsVgYlD8mE0p2+4Ct1kkK+bwxSkwTJ/9smk4e7CyFByAv5M3R UhAi0NBI8aBwE6OI+f6vq9g3xiaDBpTXucAiCbfn3rea3RHWaobm/epmPq8wlqDJHVaa 9Lj6gWEImR+59+2O1/0KgwsKehkLVYKiwLLm4I/vDJu/DjnUme5wj+vj+7gWwOQJH4mG YhBajIBFE91Yh1mG4icllXv+Wgbh8VMT6OLhrnpq5+U8hQ3ArFD1tXrLi6qXqH66Rriw 7HSUvr+OpVCeZBCfbcSYsshwzf5Fv5ZOO1sCD+6eJtbWiLJKqfjVi89r8ccWrlLX4IZN hosw== X-Gm-Message-State: AOJu0YxWUeQe0ssedYHEbqH8XHuTDxEAF/H/ISpabT9LKUY9u58FSMBR n+scS8aPEUKo+kViee1yKNeCP+4OCVGpY9rnxHGaEmTgNKBakA+TxM4qrFAUGlS2u3JEpfQUBiX 6 X-Google-Smtp-Source: AGHT+IG1+VBAuEj19e+x1Yi7BEWaW26n0y2Jje4pCan1pK3BBgLY5aBdW+aN+FF3Y8SLTUyS0jKRGg== X-Received: by 2002:a5d:64ab:0:b0:35f:2c6b:ffe4 with SMTP id ffacd0b85a97d-36071901383mr5011055f8f.28.1718319169069; Thu, 13 Jun 2024 15:52:49 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH RFC 9/9] qemu: Support O_DIRECT with mapped-ram on restore Date: Thu, 13 Jun 2024 16:43:23 -0600 Message-ID: <20240613225228.10665-10-jfehlig@suse.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240613225228.10665-1-jfehlig@suse.com> References: <20240613225228.10665-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: QVNHQBMGKXEQ7GUMCSA2QYT43CLFURIJ X-Message-ID-Hash: QVNHQBMGKXEQ7GUMCSA2QYT43CLFURIJ X-MailFrom: jfehlig@suse.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Jim Fehlig via Devel Reply-To: Jim Fehlig X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1718319546845100001 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jim Fehlig --- src/qemu/qemu_driver.c | 22 +++++++++++++--------- src/qemu/qemu_migration.c | 2 +- src/qemu/qemu_process.c | 20 ++++++++++++++++---- src/qemu/qemu_process.h | 3 +++ src/qemu/qemu_saveimage.c | 29 +++++++++++++++++++++++++---- src/qemu/qemu_saveimage.h | 4 +++- src/qemu/qemu_snapshot.c | 8 ++++---- 7 files changed, 65 insertions(+), 23 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 34f37210d9..53674458bf 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1624,7 +1624,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, } =20 if (qemuProcessStart(conn, driver, vm, NULL, VIR_ASYNC_JOB_START, - NULL, -1, NULL, NULL, + NULL, -1, -1, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags) < 0) { virDomainAuditStart(vm, "booted", false); @@ -5742,6 +5742,7 @@ qemuDomainRestoreInternal(virConnectPtr conn, g_autofree char *xmlout =3D NULL; const char *newxml =3D dxml; int fd =3D -1; + int nondirectFd =3D -1; int ret =3D -1; virQEMUSaveData *data =3D NULL; virFileWrapperFd *wrapperFd =3D NULL; @@ -5758,7 +5759,7 @@ qemuDomainRestoreInternal(virConnectPtr conn, =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) !=3D 0, - &wrapperFd, false, false); + &wrapperFd, &nondirectFd, false, false); if (fd < 0) goto cleanup; =20 @@ -5812,13 +5813,14 @@ qemuDomainRestoreInternal(virConnectPtr conn, if (qemuProcessBeginJob(vm, VIR_DOMAIN_JOB_OPERATION_RESTORE, flags) <= 0) goto cleanup; =20 - ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, data, path, + ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, nondirectFd, data,= path, false, reset_nvram, VIR_ASYNC_JOB_START); =20 qemuProcessEndJob(vm); =20 cleanup: VIR_FORCE_CLOSE(fd); + VIR_FORCE_CLOSE(nondirectFd); if (virFileWrapperFdClose(wrapperFd) < 0) ret =3D -1; virFileWrapperFdFree(wrapperFd); @@ -5893,7 +5895,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, con= st char *path, virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - false, NULL, false, false); + false, NULL, NULL, false, false); =20 if (fd < 0) goto cleanup; @@ -5930,7 +5932,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, state =3D 0; =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - false, NULL, true, false); + false, NULL, NULL, true, false); =20 if (fd < 0) goto cleanup; @@ -6011,7 +6013,7 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, uns= igned int flags) } =20 if ((fd =3D qemuSaveImageOpen(driver, priv->qemuCaps, path, &def, &dat= a, - false, NULL, false, false)) < 0) + false, NULL, NULL, false, false)) < 0) goto cleanup; =20 ret =3D qemuDomainDefFormatXML(driver, priv->qemuCaps, def, flags); @@ -6069,13 +6071,14 @@ qemuDomainObjRestore(virConnectPtr conn, g_autoptr(virDomainDef) def =3D NULL; qemuDomainObjPrivate *priv =3D vm->privateData; int fd =3D -1; + int nondirectFd =3D -1; int ret =3D -1; g_autofree char *xmlout =3D NULL; virQEMUSaveData *data =3D NULL; virFileWrapperFd *wrapperFd =3D NULL; =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - bypass_cache, &wrapperFd, false, true); + bypass_cache, &wrapperFd, &nondirectFd, false, = true); if (fd < 0) { if (fd =3D=3D -3) ret =3D 1; @@ -6120,12 +6123,13 @@ qemuDomainObjRestore(virConnectPtr conn, =20 virDomainObjAssignDef(vm, &def, true, NULL); =20 - ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, data, path, + ret =3D qemuSaveImageStartVM(conn, driver, vm, &fd, nondirectFd, data,= path, start_paused, reset_nvram, asyncJob); =20 cleanup: virQEMUSaveDataFree(data); VIR_FORCE_CLOSE(fd); + VIR_FORCE_CLOSE(nondirectFd); if (virFileWrapperFdClose(wrapperFd) < 0) ret =3D -1; virFileWrapperFdFree(wrapperFd); @@ -6321,7 +6325,7 @@ qemuDomainObjStart(virConnectPtr conn, } =20 ret =3D qemuProcessStart(conn, driver, vm, NULL, asyncJob, - NULL, -1, NULL, NULL, + NULL, -1, -1, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags= ); virDomainAuditStart(vm, "booted", ret >=3D 0); if (ret >=3D 0) { diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index a0435a0572..0b1e03394e 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3009,7 +3009,7 @@ qemuMigrationDstPrepare(virDomainObj *vm, } =20 return qemuProcessIncomingDefNew(vm, listenAddress, - migrateFrom, fd, NULL, 0); + migrateFrom, fd, -1, NULL, 0); } =20 =20 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index f700390a8c..f5b2f9ea2b 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -4688,6 +4688,7 @@ qemuProcessIncomingDefNew(virDomainObj *vm, const char *listenAddress, const char *migrateFrom, int fd, + int nondirectFd, const char *path, unsigned int flags) { @@ -4707,11 +4708,18 @@ qemuProcessIncomingDefNew(virDomainObj *vm, unsigned int fdsetId; off_t offset; =20 - if ((offset =3D lseek(fd, 0, SEEK_CUR)) =3D=3D -1) - offset =3D 0; + if (nondirectFd =3D=3D -1) + offset =3D lseek(fd, 0, SEEK_CUR); + else + offset =3D lseek(nondirectFd, 0, SEEK_CUR); + + if (offset < 0) + goto error; =20 inc->fdPassMigrate =3D qemuFDPassNew("migrate", priv); qemuFDPassAddFD(inc->fdPassMigrate, &fd, "-fd"); + if (nondirectFd !=3D -1) + qemuFDPassAddFD(inc->fdPassMigrate, &nondirectFd, "-nondirect-= fd"); qemuFDPassGetId(inc->fdPassMigrate, &fdsetId); inc->uri =3D g_strdup_printf("file:/dev/fdset/%u,offset=3D%#lx", f= dsetId, offset); } else { @@ -8148,6 +8156,7 @@ qemuProcessStart(virConnectPtr conn, virDomainAsyncJob asyncJob, const char *migrateFrom, int migrateFd, + int migrateNondirectFd, const char *migratePath, virDomainMomentObj *snapshot, virNetDevVPortProfileOp vmop, @@ -8185,7 +8194,8 @@ qemuProcessStart(virConnectPtr conn, =20 if (migrateFrom) { incoming =3D qemuProcessIncomingDefNew(vm, NULL, migrateFrom, - migrateFd, migratePath, flags= ); + migrateFd, migrateNondirectFd, + migratePath, flags); if (!incoming) goto stop; } @@ -8264,6 +8274,7 @@ qemuProcessStart(virConnectPtr conn, * @driver: qemu driver object * @vm: domain object * @fd: FD pointer of memory state file + * @nondirectFd: FD for memory state file, opened without O_DIRECT * @path: path to memory state file * @snapshot: internal snapshot to load when starting QEMU process or NULL * @data: data from memory state file or NULL @@ -8290,6 +8301,7 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, virQEMUDriver *driver, virDomainObj *vm, int *fd, + int nondirectFd, const char *path, virDomainMomentObj *snapshot, virQEMUSaveData *data, @@ -8329,7 +8341,7 @@ qemuProcessStartWithMemoryState(virConnectPtr conn, priv->disableSlirp =3D true; =20 if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL, - asyncJob, migrateFrom, *fd, path, snapshot, + asyncJob, migrateFrom, *fd, nondirectFd, path, sn= apshot, VIR_NETDEV_VPORT_PROFILE_OP_RESTORE, start_flags) =3D=3D 0) *started =3D true; diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index a5212ee56e..6e37dac2ca 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -62,6 +62,7 @@ qemuProcessIncomingDef *qemuProcessIncomingDefNew(virDoma= inObj *vm, const char *listenAddres= s, const char *migrateFrom, int fd, + int nondirectFd, const char *path, unsigned int flags); void qemuProcessIncomingDefFree(qemuProcessIncomingDef *inc); @@ -89,6 +90,7 @@ int qemuProcessStart(virConnectPtr conn, virDomainAsyncJob asyncJob, const char *migrateFrom, int stdin_fd, + int nondirectFd, const char *stdin_path, virDomainMomentObj *snapshot, virNetDevVPortProfileOp vmop, @@ -98,6 +100,7 @@ int qemuProcessStartWithMemoryState(virConnectPtr conn, virQEMUDriver *driver, virDomainObj *vm, int *fd, + int nondirectFd, const char *path, virDomainMomentObj *snapshot, virQEMUSaveData *data, diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 2b0281895a..8e634862a6 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -610,6 +610,7 @@ qemuSaveImageGetCompressionProgram(const char *imageFor= mat, * @ret_data: returns structure filled with data from the image header * @bypass_cache: bypass cache when opening the file * @wrapperFd: returns the file wrapper structure + * @nondirectFd: returns file descriptor without O_DIRECT set * @open_write: open the file for writing (for updates) * @unlink_corrupt: remove the image file if it is corrupted * @@ -625,11 +626,14 @@ qemuSaveImageOpen(virQEMUDriver *driver, virQEMUSaveData **ret_data, bool bypass_cache, virFileWrapperFd **wrapperFd, + int *nondirectFd, bool open_write, bool unlink_corrupt) { g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); VIR_AUTOCLOSE fd =3D -1; + VIR_AUTOCLOSE nondirect_fd =3D -1; + int read_fd; int ret =3D -1; g_autoptr(virQEMUSaveData) data =3D NULL; virQEMUSaveHeader *header; @@ -646,6 +650,13 @@ qemuSaveImageOpen(virQEMUDriver *driver, _("bypass cache unsupported by this system")); return -1; } + + /* Also open the file without O_DIRECT for reading header and for + * qemu to use when reading unaligned state + */ + if ((nondirect_fd =3D qemuDomainOpenFile(cfg, NULL, path, oflags, = NULL)) < 0) + return -1; + oflags |=3D directFlag; } =20 @@ -655,7 +666,12 @@ qemuSaveImageOpen(virQEMUDriver *driver, data =3D g_new0(virQEMUSaveData, 1); =20 header =3D &data->header; - if (saferead(fd, header, sizeof(*header)) !=3D sizeof(*header)) { + if (nondirect_fd !=3D -1) + read_fd =3D nondirect_fd; + else + read_fd =3D fd; + + if (saferead(read_fd, header, sizeof(*header)) !=3D sizeof(*header)) { if (unlink_corrupt) { if (unlink(path) < 0) { virReportSystemError(errno, @@ -732,7 +748,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, =20 data->xml =3D g_new0(char, xml_len); =20 - if (saferead(fd, data->xml, xml_len) !=3D xml_len) { + if (saferead(read_fd, data->xml, xml_len) !=3D xml_len) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("failed to read domain XML")); return -1; @@ -741,7 +757,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, if (cookie_len > 0) { data->cookie =3D g_new0(char, cookie_len); =20 - if (saferead(fd, data->cookie, cookie_len) !=3D cookie_len) { + if (saferead(read_fd, data->cookie, cookie_len) !=3D cookie_len) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("failed to read cookie")); return -1; @@ -761,6 +777,10 @@ qemuSaveImageOpen(virQEMUDriver *driver, =20 *ret_def =3D g_steal_pointer(&def); *ret_data =3D g_steal_pointer(&data); + if (nondirectFd) { + *nondirectFd =3D nondirect_fd; + nondirect_fd =3D -1; + } =20 ret =3D fd; fd =3D -1; @@ -774,6 +794,7 @@ qemuSaveImageStartVM(virConnectPtr conn, virQEMUDriver *driver, virDomainObj *vm, int *fd, + int nondirectFd, virQEMUSaveData *data, const char *path, bool start_paused, @@ -794,7 +815,7 @@ qemuSaveImageStartVM(virConnectPtr conn, if (header->features & QEMU_SAVE_FEATURE_MAPPED_RAM) start_flags |=3D VIR_QEMU_PROCESS_START_MAPPED_RAM; =20 - if (qemuProcessStartWithMemoryState(conn, driver, vm, fd, path, NULL, = data, + if (qemuProcessStartWithMemoryState(conn, driver, vm, fd, nondirectFd,= path, NULL, data, asyncJob, start_flags, "restored", &started) < 0) { goto cleanup; diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 81d93bf33c..0a8b35158a 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -67,12 +67,13 @@ qemuSaveImageStartVM(virConnectPtr conn, virQEMUDriver *driver, virDomainObj *vm, int *fd, + int nondirectFd, virQEMUSaveData *data, const char *path, bool start_paused, bool reset_nvram, virDomainAsyncJob asyncJob) - ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5) ATTRIBUTE_NONNULL(6); + ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7); =20 int qemuSaveImageOpen(virQEMUDriver *driver, @@ -82,6 +83,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, virQEMUSaveData **ret_data, bool bypass_cache, virFileWrapperFd **wrapperFd, + int *nondirectFd, bool open_write, bool unlink_corrupt) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 1e9e0e31d7..f137a79a8d 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2115,7 +2115,7 @@ qemuSnapshotRevertExternalPrepare(virDomainObj *vm, memdata->path =3D snapdef->memorysnapshotfile; memdata->fd =3D qemuSaveImageOpen(driver, NULL, memdata->path, &savedef, &memdata->data, - false, NULL, + false, NULL, NULL, false, false); =20 if (memdata->fd < 0) @@ -2359,7 +2359,7 @@ qemuSnapshotRevertActive(virDomainObj *vm, virDomainObjAssignDef(vm, config, true, NULL); =20 if (qemuProcessStartWithMemoryState(snapshot->domain->conn, driver, vm, - &memdata.fd, memdata.path, loadSna= p, + &memdata.fd, -1, memdata.path, loa= dSnap, memdata.data, VIR_ASYNC_JOB_SNAPSH= OT, start_flags, "from-snapshot", &started) < 0) { @@ -2513,7 +2513,7 @@ qemuSnapshotRevertInactive(virDomainObj *vm, start_flags |=3D paused ? VIR_QEMU_PROCESS_START_PAUSED : 0; =20 rc =3D qemuProcessStart(snapshot->domain->conn, driver, vm, NULL, - VIR_ASYNC_JOB_SNAPSHOT, NULL, -1, NULL, NULL, + VIR_ASYNC_JOB_SNAPSHOT, NULL, -1, -1, NULL, = NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags); virDomainAuditStart(vm, "from-snapshot", rc >=3D 0); @@ -2991,7 +2991,7 @@ qemuSnapshotDeleteExternalPrepare(virDomainObj *vm, =20 if (!virDomainObjIsActive(vm)) { if (qemuProcessStart(NULL, driver, vm, NULL, VIR_ASYNC_JOB_SNA= PSHOT, - NULL, -1, NULL, NULL, + NULL, -1, -1, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, VIR_QEMU_PROCESS_START_PAUSED) < 0) { return -1; --=20 2.44.0