From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from DUZPR83CU001.outbound.protection.outlook.com (mail-northeuropeazon11022094.outbound.protection.outlook.com [52.101.66.94]) by lore.virtuozzo.com (Postfix) with ESMTPS id BA41480B9E for ; Tue, 20 Oct 2026 16:31:00 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BLA8EOPS/hOIcQWlpGZ9Mfk9M0SQ8f+C4s3g3qryFQLQa8Pe5flitZhObW0bJl87HhQ1KF2laBGErkpc4ORjpAMY8cfwlP+1ruxJfCtQjQDvc5E6EChhZ/DlZgSYy77noOGauqkLf3dn98c1gjz63BSpWuBlfpS4WQEyrh/lyhD7e/mHvaVCzPVPOQpHqChpXKOISqWQxeR/gerAIuYk7RvklxqUw0VfU4xnnq5b7s1ofJKciBwAuRHN+86r9HBv62dlGJYvJYPn1d491a3xR+urmlXSYQ7LLicK4tG3eFWqZYkjUrnDuFH/u167E2KSnrCJel4wm1RXdy2i2WbkjQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=9NaN4z48Z+E2nktYy8A1JV/TcSQ5BhNabnP1xvenqXQ=; b=iIA2kVSItJ6w0wtnKwIu8+QqFCwe7MEkcZWKg6HZJm0NXov60qh3Wx9zIvaJ2HMBNlgKxHapy6lU/x/XF4P2jp4qw/GgnfyOHe3kQ64jAtj6nxpGt4JdnnYWfEaJzbuQ5goly2LwLrKa3Z4Ba5hT+k1Y+5qcwAxdkCybvv6FZO9X+DtUmlWBhyVU24D7j6KC9uJeKi4I+z6uFKQhP3e2sPjE5dogXhMz2nDIKe2rX9P5GA88azf4ZZm7CIsfbbTaApU5gyqpAJmdnuBXCCQ3yt60cBKJ8ibtVSrxvYvCgtDrZnJ4Vzw1WcRKpXNto94GaHNtzbwudJwpKrJdDQGs+Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=virtuozzo.com; dmarc=pass action=none header.from=virtuozzo.com; dkim=pass header.d=virtuozzo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9NaN4z48Z+E2nktYy8A1JV/TcSQ5BhNabnP1xvenqXQ=; b=Hp9nnlREkxjcBKRiQPNKO6GCq5HIM54ewTaVyWL5Qq1MTCLs2XvcGVazFH1g9kZleZJqUAWF8zjz90XYvot7ww/JWqLdLH8GYJykJW+rY1uJmI87KVUWz6tH0ccigIGnG008OE4RFiLlW1L6bldIYeLf2saN+2EbXzA+RJnBXwTZAwxtafdbCBdmVNv1uo3rrwVdoxGG0Xg4kyK+3or/8auWiLxJpPj590CMIIENtpZLEUGORTSwiFxJZux6Uaqxi+8mHZpC7umQrQ1gMrgp2N1G8QOmh+YFVFVt5LO3E1n6NjSoVXF5GltNrVAPe72tDTDauPVwfsz1FjWmgaqo+A== Authentication-Results: mx.microsoft.com 1; dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) by AS4PR08MB7553.eurprd08.prod.outlook.com (2603:10a6:20b:4fb::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.546.15; Tue, 20 Oct 2026 16:30:58 +0000 Received: from VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8]) by VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8%7]) with mapi id 15.21.0546.012; Tue, 20 Oct 2026 16:30:58 +0000 From: Andrey Drobyshev Date: Tue, 20 Oct 2026 19:30:54 +0300 Subject: [PATCH QEMU HCI-8.1 v4 14/31] migration: Fix regression of passing error_fatal into vmstate_load_state() Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20261020-vfio_v1-v4-14-83a5668230e5@virtuozzo.com> References: <20261020-vfio_v1-v4-0-83a5668230e5@virtuozzo.com> In-Reply-To: <20261020-vfio_v1-v4-0-83a5668230e5@virtuozzo.com> To: svt-core@virtuozzo.com Cc: Andrey Drobyshev X-Mailer: b4 0.16.0 X-ClientProxiedBy: VIUP296CA0056.AUTP296.PROD.OUTLOOK.COM (2603:10a6:800:34b::14) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|AS4PR08MB7553:EE_ X-MS-Office365-Filtering-Correlation-Id: cb60f841-39d5-4efa-87da-08df2ec783f9 X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com X-MS-Exchange-Transport-Rules-Loop: 1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|376014|52116014|366016|6133799003|5113699003|10067099003|22082099003|18002099003|3023799007|261009220027099003|261009223327099003|261009223027099003|261009221227099003|261009221727099003|56012099006|38350700014; X-Microsoft-Antispam-Message-Info: 1ICRjd15SuvPLXenOK10koi54MBgjSOe627GboZEyOwZarx4oaoEreoECi83AX5WO56Z4/05V3FtMfJ1NzX/r6Wl2TXN9c03JRyqNFLDgVkKgWQS0GkaJmRwFZQLBpef67SXb/uf2oYxcdMdWou5QI+ge0MDSanRmqfba5I7AyrRK84m3Qvn5Je6YcDaSmaf1M8fuOoMhkvVg0DfZ+bW3Z0dcw6ap7heg3jLI3geO/AeMGs+OKUdBhlWGBpOwmwHKfYT9fmm/+AEotr7R1vr54ioMWroYKHqPr+QwYYeOqiEQExAukmrcxjh57RZ/i9Pb0JyqVmp1V+w3uNR5GrDNagE0x4lry6hnS49qGv/BULco1oHRgAA1WJHjWnXkjUXqpRm0rdVn1QV7yFpddx+sxeXNTJTEbopWLf9834725d1ogCRUiamaefvkpugwhkNGijiYYZcmzck9Vs44TL+gTgKqZngYUVxBcKviTMYObOHGHtyO9lE7nT9vQa5DZE4gzV88LdLWeVBYwHcAQ9ax0Clj9zzfPW5hk2qG+aagcHrhmz01LjpKQOj/g6SFhQHlR5ddV1NA6iFKGrRaDNdqApYhm9eOUSUUD41i2dY9h0HzxVxqQHMctvZ/nAhApAewa3V9tx/V0jUEbb/0tG4KXrj8SEPRh8q4gTRLrog5qE= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI0PR08MB10656.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(376014)(52116014)(366016)(6133799003)(5113699003)(10067099003)(22082099003)(18002099003)(3023799007)(261009220027099003)(261009223327099003)(261009223027099003)(261009221227099003)(261009221727099003)(56012099006)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Z2RlRDA3N1A0SUV2eXFqeFRyRWZRU3FyaUFQTnYrRVdnWUFMOHVGd3NoVWMx?= =?utf-8?B?aHhZT1lscEJqOVlrSldEYUVLVGhVc1g2RUdPYXFUTU1ndnFmQ2U5dmI0NGc5?= =?utf-8?B?MkZrdWhjdGQxcWFiZDZQNzRqWGtSeFYza2J4V3JNTmp3ODJvNWFJNWs0L1Jp?= =?utf-8?B?RmlLOFdwcSsxRm1oZDdjZWd2OVZwNnROSjc5ZktwdnFCZUFiZzlRT2tXd1Jx?= =?utf-8?B?ZlRwalpENHBCcHJwZ3RHSmtlM09HZlZsOXIrYVBqVEsyVTVQWnNQaVI5WmRW?= =?utf-8?B?UUJiU29nRDVScFhvYjBUTUdpODFWLzhnREQ2RDRYQXRqWnBNeGhVOGlSNXlv?= =?utf-8?B?TGJKdGtWSCtiSFpMdjE5R3FOV0NsdmROeHBSQ09iQis3Y2l3RGxjbEs4MWli?= =?utf-8?B?eUQ3Z0dCdmY3RlpPZk9KMGtVd1JtTHV0TXpDTFJ5enZCRVFNRVBmRUJlcXVE?= =?utf-8?B?N0VZY2xuU2dhM2NZdWRPOWs5YlZHeS91SUN0Q0dtVjlSa0R6VEJKS1F2V213?= =?utf-8?B?bnV1bHMyQVovbW93cEdnb0xXT1pTUnhJSDl4UmRCWi94V0FzZHgxQmJzUFRo?= =?utf-8?B?OHB6NDFjbnVyWmt2QVR5K2sxVUZRc242WXN6OWdraXlJcUdvd1d1bnlsMFpj?= =?utf-8?B?NzBFYU5ZNThaWmF5dlJwSzFBUUZUV2pSaUJDQ0J5dzgzNDQyZW8xclFSVEk4?= =?utf-8?B?YmtuaFMrRWp2MURKakJ4cXBKMzhWcEVCUTJ2WHNCb3NrVU44V2tVWERTVGZI?= =?utf-8?B?T2g1UjJOVFFtQ0g3Mng0Q1BJdFd5YXEzeFpQN0hJTHhCa2Z6clJQTGVNMHhL?= =?utf-8?B?MVZGMlNUNzN6andqeUt1djA2UWF2NU1mRGhnMmhkRTFnSDV2RkhRaE9RMHJh?= =?utf-8?B?QWo0S25kdkh1bXVNekl6eDIraU42Q0t5bkI1dVpzZng4ZXkwUWJUby9mL1ox?= =?utf-8?B?c1RzdU02YWs1WFA0dUNLSUdiVjFZNXFiQXZ6K1huSTRiUEt1aUJjMWxVUlp6?= =?utf-8?B?dkVtWUNYTHpWNDAwMG1MbEhnL2orWFlTKzJHV3Q2QklrWFhYd2pKMmIrMWVv?= =?utf-8?B?VkRnMkVreHI2dm4wSUs2N1VtZTh4TG1PYS9SejJWdG1SSys2c1ZNNHBmby93?= =?utf-8?B?WkxLdCt6enRZYlVpZWFIa3hUWjlLUWZDVzRIZVBEUW5KM2hqR3VUTnU1bEp3?= =?utf-8?B?dnVWM2o4QjVIWnlUVmZydTI1TnBidlJWSE5nemlURlh5USt2MzdTakYvSjFj?= =?utf-8?B?VTNKWTZJVWFtck5OQUN1TGJGbkZ6NFJLM292bmZ0RkNqV0dkZzhnam9uLzI1?= =?utf-8?B?L0VuQ2hWb21JZmY5QzdJNkx4RVE0Z1dtNlNzSzNPYnNSbkc0STNGZFRKT0F6?= =?utf-8?B?M0JUcHpkWGdhTGhkSURwUzFZTlFBTjZ2QUNHbzJXZ01EdlpuR2ljZHhpNEo2?= =?utf-8?B?TGErbXFFc1dXQ0dtY0N5amM1NTVodXhQQ3gvb1dITTNZeUFpaU1hOUNsL0lt?= =?utf-8?B?cmgrSXBrbGJwNHEwMmpnSHp1SHVpbGFDZlgrMVVmSHV1V29Kdi8wUmJTdWZl?= =?utf-8?B?RTl1c3ExNXZoQWVETTVrODdJNzA2bDVGWmdaN1V0dnRkblNyeTRhSSsvMEYx?= =?utf-8?B?WkZtSDI2NXRFdFBsMVhXV2tCcWVxNVF4VFlySmxURWhIQ21mOWoxUnVPU0hq?= =?utf-8?B?K0cvTGhpenJnRWRXU29FdDZkNFRPRUNtV1B4SFFpcm5oWDRQdVo2bjFmZ05P?= =?utf-8?B?S2pxWWV0Q1FFWDk2VWFDTy8zdVFUcGR0aTBRTFpSb1pJUDZGSFZxdzRyWG5M?= =?utf-8?B?Qmc4UVZNZEdrODhsMlBqaDF5NG5Ncm1HM3RDQ3QwM09ycmk0OTl2OTZFMXVo?= =?utf-8?B?R2pBZFEzRFE5M2szMHFIRVp0Wlg4STh0YUZ1bHovWlhwbWVoZlRGdzlWUzJU?= =?utf-8?B?ci9pbzAyRTRKZ0NxMHUzN20xN1NuQ1FYUm8ycWdYcnJsWlhld20wTVUrQjVi?= =?utf-8?B?MHY2K3hObWxEd1hvQWllVWNNUFZRSWNLdzVKNGluQVJKdTBxZlJoSHlTUldl?= =?utf-8?B?SUQ3V01Gc2thdmxreVRHcVpQcnlkbktHanFFZ2dsa29VN1dJK2huWksrenhk?= =?utf-8?B?Y3lWemFhRTJldUs5Y0xuTm5HdEZuT1NlV21JZWFXVGtXY1U3NU96bDFaQVhP?= =?utf-8?B?R0FmN2dobGZmMCtGYUpGekhybFFzS1d3ZEIwRGpRRmdqaWJac0tyaDl2Z1ZW?= =?utf-8?B?L0RnNFgrV2t3Wit6ZVlYcDQ5TnRHZWI3RWFvRFF0RHhSdndGWlBaaGIzdjln?= =?utf-8?B?c29QTlhKazd0K0pjSDZmTDlmb1h0YXNnR2dtQnBlMlBFWUh1aEs0QXIwSzMz?= =?utf-8?Q?4+4f1LL5wMUROm0w=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: cb60f841-39d5-4efa-87da-08df2ec783f9 X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Oct 2026 16:30:55.8344 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: pH4Ctlu11MAcy9jfYycFY4nkg6TZZZlw6KWMTPZ+mB2xyCIpkBhKwXAsgu7FhIQ3TuoYntpuPx+2C9FEr1t5WbdxFe408Ce4ISCWJg7SppA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS4PR08MB7553 From: Arun Menon error_fatal is passed to vmstate_load_state() and vmstate_save_state() functions. This was introduced in commit c632ffbd74. This would exit(1) on error, and therefore does not allow to propagate the error back to the caller. To maintain consistency with prior error handling i.e. either propagating the error to the caller or reporting it, we must set the error within a local Error object instead of using error_fatal. Reviewed-by: Cornelia Huck Signed-off-by: Arun Menon Reviewed-by: Akihiko Odaki Link: https://lore.kernel.org/r/20251028-solve_error_fatal_regression-v2-1-dab24c808a28@redhat.com [peterx: always uninit var ret, per Akihiko] [peterx: touchups on line ordering, spacings etc.] andrey.drobyshev: This commit was cherry-picked from the upstream commit 986c3292c6b8, adapted for the hci-dev base, which predates the upstream commit bcb536cabe10 ("error: Kill @error_warn"): virtio_gpu_load() has no 'err' local there yet, so it is declared here. Signed-off-by: Peter Xu --- hw/display/virtio-gpu.c | 22 +++++++++++++++------- hw/pci/pci.c | 15 +++++++++++++-- hw/s390x/virtio-ccw.c | 17 +++++++++++++++-- hw/scsi/spapr_vscsi.c | 10 ++++++++-- hw/virtio/virtio-mmio.c | 15 +++++++++++++-- hw/virtio/virtio-pci.c | 15 +++++++++++++-- hw/virtio/virtio.c | 10 +++++++--- 7 files changed, 84 insertions(+), 20 deletions(-) diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c index 477ec700a13..4bc8c778508 100644 --- a/hw/display/virtio-gpu.c +++ b/hw/display/virtio-gpu.c @@ -1223,7 +1223,8 @@ static int virtio_gpu_save(QEMUFile *f, void *opaque, size_t size, { VirtIOGPU *g = opaque; struct virtio_gpu_simple_resource *res; - int i; + Error *err = NULL; + int i, ret; /* in 2d mode we should never find unprocessed commands here */ assert(QTAILQ_EMPTY(&g->cmdq)); @@ -1246,8 +1247,12 @@ static int virtio_gpu_save(QEMUFile *f, void *opaque, size_t size, } qemu_put_be32(f, 0); /* end of list */ - return vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL, - &error_fatal); + ret = vmstate_save_state(f, &vmstate_virtio_gpu_scanouts, g, NULL, + &err); + if (ret < 0) { + error_report_err(err); + } + return ret; } static bool virtio_gpu_load_restore_mapping(VirtIOGPU *g, @@ -1283,9 +1288,10 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size, const VMStateField *field) { VirtIOGPU *g = opaque; + Error *err = NULL; struct virtio_gpu_simple_resource *res; uint32_t resource_id, pformat; - int i; + int i, ret; g->hostmem = 0; @@ -1344,9 +1350,11 @@ static int virtio_gpu_load(QEMUFile *f, void *opaque, size_t size, } /* load & apply scanout state */ - vmstate_load_state(f, &vmstate_virtio_gpu_scanouts, g, 1, &error_fatal); - - return 0; + ret = vmstate_load_state(f, &vmstate_virtio_gpu_scanouts, g, 1, &err); + if (ret < 0) { + error_report_err(err); + } + return ret; } static int virtio_gpu_blob_save(QEMUFile *f, void *opaque, size_t size, diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 5d7d17f6529..50f062045a9 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -926,21 +926,32 @@ const VMStateDescription vmstate_pci_device = { void pci_device_save(PCIDevice *s, QEMUFile *f) { + Error *local_err = NULL; + int ret; + /* Clear interrupt status bit: it is implicit * in irq_state which we are saving. * This makes us compatible with old devices * which never set or clear this bit. */ s->config[PCI_STATUS] &= ~PCI_STATUS_INTERRUPT; - vmstate_save_state(f, &vmstate_pci_device, s, NULL, &error_fatal); + ret = vmstate_save_state(f, &vmstate_pci_device, s, NULL, &local_err); + if (ret < 0) { + error_report_err(local_err); + } /* Restore the interrupt status bit. */ pci_update_irq_status(s); } int pci_device_load(PCIDevice *s, QEMUFile *f) { + Error *local_err = NULL; int ret; + ret = vmstate_load_state(f, &vmstate_pci_device, s, s->version_id, - &error_fatal); + &local_err); + if (ret < 0) { + error_report_err(local_err); + } /* Restore the interrupt status bit. */ pci_update_irq_status(s); return ret; diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 4cb1ced001a..4a3ffb84f8f 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -1130,13 +1130,26 @@ static int virtio_ccw_load_queue(DeviceState *d, int n, QEMUFile *f) static void virtio_ccw_save_config(DeviceState *d, QEMUFile *f) { VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d); - vmstate_save_state(f, &vmstate_virtio_ccw_dev, dev, NULL, &error_fatal); + Error *local_err = NULL; + int ret; + + ret = vmstate_save_state(f, &vmstate_virtio_ccw_dev, dev, NULL, &local_err); + if (ret < 0) { + error_report_err(local_err); + } } static int virtio_ccw_load_config(DeviceState *d, QEMUFile *f) { VirtioCcwDevice *dev = VIRTIO_CCW_DEVICE(d); - return vmstate_load_state(f, &vmstate_virtio_ccw_dev, dev, 1, &error_fatal); + Error *local_err = NULL; + int ret; + + ret = vmstate_load_state(f, &vmstate_virtio_ccw_dev, dev, 1, &local_err); + if (ret < 0) { + error_report_err(local_err); + } + return ret; } static void virtio_ccw_pre_plugged(DeviceState *d, Error **errp) diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index f0a7dd2b882..a6591319db7 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -628,10 +628,16 @@ static const VMStateDescription vmstate_spapr_vscsi_req = { static void vscsi_save_request(QEMUFile *f, SCSIRequest *sreq) { vscsi_req *req = sreq->hba_private; - assert(req->active); + Error *local_err = NULL; + int rc; - vmstate_save_state(f, &vmstate_spapr_vscsi_req, req, NULL, &error_fatal); + assert(req->active); + rc = vmstate_save_state(f, &vmstate_spapr_vscsi_req, req, NULL, &local_err); + if (rc < 0) { + error_report_err(local_err); + return; + } trace_spapr_vscsi_save_request(req->qtag, req->cur_desc_num, req->cur_desc_offset); } diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c index fb58c364527..c05c00bcd4a 100644 --- a/hw/virtio/virtio-mmio.c +++ b/hw/virtio/virtio-mmio.c @@ -612,15 +612,26 @@ static const VMStateDescription vmstate_virtio_mmio = { static void virtio_mmio_save_extra_state(DeviceState *opaque, QEMUFile *f) { VirtIOMMIOProxy *proxy = VIRTIO_MMIO(opaque); + Error *local_err = NULL; + int ret; - vmstate_save_state(f, &vmstate_virtio_mmio, proxy, NULL, &error_fatal); + ret = vmstate_save_state(f, &vmstate_virtio_mmio, proxy, NULL, &local_err); + if (ret < 0) { + error_report_err(local_err); + } } static int virtio_mmio_load_extra_state(DeviceState *opaque, QEMUFile *f) { VirtIOMMIOProxy *proxy = VIRTIO_MMIO(opaque); + Error *local_err = NULL; + int ret; - return vmstate_load_state(f, &vmstate_virtio_mmio, proxy, 1, &error_fatal); + ret = vmstate_load_state(f, &vmstate_virtio_mmio, proxy, 1, &local_err); + if (ret < 0) { + error_report_err(local_err); + } + return ret; } static bool virtio_mmio_has_extra_state(DeviceState *opaque) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 7273da4c018..c276fbb017c 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -189,15 +189,26 @@ static bool virtio_pci_has_extra_state(DeviceState *d) static void virtio_pci_save_extra_state(DeviceState *d, QEMUFile *f) { VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); + Error *local_err = NULL; + int ret; - vmstate_save_state(f, &vmstate_virtio_pci, proxy, NULL, &error_fatal); + ret = vmstate_save_state(f, &vmstate_virtio_pci, proxy, NULL, &local_err); + if (ret < 0) { + error_report_err(local_err); + } } static int virtio_pci_load_extra_state(DeviceState *d, QEMUFile *f) { VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); + Error *local_err = NULL; + int ret; - return vmstate_load_state(f, &vmstate_virtio_pci, proxy, 1, &error_fatal); + ret = vmstate_load_state(f, &vmstate_virtio_pci, proxy, 1, &local_err); + if (ret < 0) { + error_report_err(local_err); + } + return ret; } static void virtio_pci_save_queue(DeviceState *d, int n, QEMUFile *f) diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index a7063d5555e..d4b2e67c274 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -3016,7 +3016,7 @@ int virtio_save(VirtIODevice *vdev, QEMUFile *f) VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus); VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev); uint32_t guest_features_lo = (vdev->guest_features & 0xffffffff); - int i; + int i, ret; Error *local_err = NULL; if (k->save_config) { @@ -3061,7 +3061,7 @@ int virtio_save(VirtIODevice *vdev, QEMUFile *f) } if (vdc->vmsd) { - int ret = vmstate_save_state(f, vdc->vmsd, vdev, NULL, &local_err); + ret = vmstate_save_state(f, vdc->vmsd, vdev, NULL, &local_err); if (ret) { error_report_err(local_err); return ret; @@ -3069,7 +3069,11 @@ int virtio_save(VirtIODevice *vdev, QEMUFile *f) } /* Subsections */ - return vmstate_save_state(f, &vmstate_virtio, vdev, NULL, &error_fatal); + ret = vmstate_save_state(f, &vmstate_virtio, vdev, NULL, &local_err); + if (ret < 0) { + error_report_err(local_err); + } + return ret; } /* A wrapper for use as a VMState .put function */ -- 2.47.1