From nobody Sun May 12 11:00:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=philmd@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=philmd@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602505676; cv=none; d=zohomail.com; s=zohoarc; b=iLwQoVckPuTsPn1o5KEyay4ku4PNoU1uyz4s0xII+JKwQeMc/1gPOHmd2x6n544k0PjspoOG42BF+ORkUAb+hIg+l/uSWloDA3c9ZRoXLzBhuU7uWIxGLbJs3radRjGVPGevGbSWNZdrrdlguOtYu2LOYLjKtIJjsocHsEZKE1c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602505676; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=cutsjuQUFksJkeZWPi4YdPjNpl6WM++DBAeuVPNKPn8=; b=Y52k9+XzHHqvx4FTFt2bjd2yv9oR5FRzvlTgjNsrHfSrKJfsmkgCOHlhD8YcKrZ1uqn9EWiANFabdbR/LI+k8kEZ+QgliTTVzWscH9axX/t+uZwgkMWrciqMFS7OrsDzZNbwfCWitZ5N4UFJDfDDEsWRpUWnoq77uv5TFSaUKOA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=philmd@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1602505676927452.2921520940138; Mon, 12 Oct 2020 05:27:56 -0700 (PDT) Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-437-zMRpXMv1NkKeviVFCq1aHQ-1; Mon, 12 Oct 2020 08:27:53 -0400 Received: by mail-wm1-f70.google.com with SMTP id d197so5182053wmd.4 for ; Mon, 12 Oct 2020 05:27:52 -0700 (PDT) Return-Path: Return-Path: Received: from localhost.localdomain (106.red-83-59-162.dynamicip.rima-tde.net. [83.59.162.106]) by smtp.gmail.com with ESMTPSA id t10sm22796806wmf.46.2020.10.12.05.27.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Oct 2020 05:27:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602505674; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cutsjuQUFksJkeZWPi4YdPjNpl6WM++DBAeuVPNKPn8=; b=fZahv94zrMmDENDYqedvRS60nMALO+lT53BikVv/GsfXEistbcPoci0XD3xurFec3j7F/T Xq0o6jgIhz+0E7XRRZzpP8VkhUvD5KiGW6RSFN1LOIW1mMpa1kQpRKVvIXyV33QQ/+yzui BIAsFhL9CclhkAgMRipkatya7Y0nBTk= X-MC-Unique: zMRpXMv1NkKeviVFCq1aHQ-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=cutsjuQUFksJkeZWPi4YdPjNpl6WM++DBAeuVPNKPn8=; b=KbYaofrqvL+hylT/anQ7KKVL62useD5n/0K0Pf0rOf6kr+mklR9iKwC+gtcjldwXtI uyicxfPcThQ7yuoWVWEwHjJUHpvtSjckTKGNBd8Rv5aHFHZlLQmAGnAaNLDVV3hFGcAQ Rcy7YY2G3zVJVTsA8ySqm5rGRpfZ0kihNGfdtpH39jpmKOzfPbS3Z+Mi4T3xtDD51dBa 4L1/UX4odu2jJ/zYj4fvvLh/EYhJ1LUbZfJU2XX/8D6W3+GB8a7d8G5USHBBkawxubsA TMLhGlWGjgCpeFTvYs5+xOPX1ytEUdTUsVGlkDxYGGccHFoKlNpXR7tp1kRdcTGq+Ydn o8+Q== X-Gm-Message-State: AOAM532P+SAAqtTWf5xcRNU1+PQSJ5O1kuiCKotni5uiVgM0G4mrnKq0 fOY+QPS/WJpB16gzcz8UXigPJjgPqLjq9qFGt7Hljt8EnbTd9TpYJ5jQvicK2d/l224YIg56rlj 0QRLk9RbrpvR2gA== X-Received: by 2002:a5d:4691:: with SMTP id u17mr15981577wrq.324.1602505671776; Mon, 12 Oct 2020 05:27:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyJ9HKc78RDYPHb/4yK1Hdq9GcTzJPuKMTPZSeH/rV2wGirPXveNKRankfLaVwB/1gw30Jf3A== X-Received: by 2002:a5d:4691:: with SMTP id u17mr15981556wrq.324.1602505671530; Mon, 12 Oct 2020 05:27:51 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Pavel Dovgalyuk , Juan Quintela , Max Reitz , Paolo Bonzini , Kevin Wolf , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , "Dr. David Alan Gilbert" , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 1/3] block: push error reporting into bdrv_all_*_snapshot functions Date: Mon, 12 Oct 2020 14:27:41 +0200 Message-Id: <20201012122743.3390867-2-philmd@redhat.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20201012122743.3390867-1-philmd@redhat.com> References: <20201012122743.3390867-1-philmd@redhat.com> MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=philmd@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) From: Daniel P. Berrang=C3=A9 The bdrv_all_*_snapshot functions return a BlockDriverState pointer for the invalid backend, which the callers then use to report an error message. In some cases multiple callers are reporting the same error message, but with slightly different text. In the future there will be more error scenarios for some of these methods, which will benefit from fine grained error message reporting. So it is helpful to push error reporting down a level. Signed-off-by: Daniel P. Berrang=C3=A9 [PMD: Initialize variables] Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Max Reitz --- include/block/snapshot.h | 14 +++---- block/monitor/block-hmp-cmds.c | 7 ++-- block/snapshot.c | 77 +++++++++++++++++----------------- migration/savevm.c | 37 +++++----------- monitor/hmp-cmds.c | 7 +--- replay/replay-debugging.c | 4 +- tests/qemu-iotests/267.out | 10 ++--- 7 files changed, 67 insertions(+), 89 deletions(-) diff --git a/include/block/snapshot.h b/include/block/snapshot.h index b0fe42993dc..5cb2b696ad0 100644 --- a/include/block/snapshot.h +++ b/include/block/snapshot.h @@ -77,17 +77,15 @@ int bdrv_snapshot_load_tmp_by_id_or_name(BlockDriverSta= te *bs, * These functions will properly handle dataplane (take aio_context_acquire * when appropriate for appropriate block drivers */ =20 -bool bdrv_all_can_snapshot(BlockDriverState **first_bad_bs); -int bdrv_all_delete_snapshot(const char *name, BlockDriverState **first_bs= d_bs, - Error **errp); -int bdrv_all_goto_snapshot(const char *name, BlockDriverState **first_bad_= bs, - Error **errp); -int bdrv_all_find_snapshot(const char *name, BlockDriverState **first_bad_= bs); +bool bdrv_all_can_snapshot(Error **errp); +int bdrv_all_delete_snapshot(const char *name, Error **errp); +int bdrv_all_goto_snapshot(const char *name, Error **errp); +int bdrv_all_find_snapshot(const char *name, Error **errp); int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn, BlockDriverState *vm_state_bs, uint64_t vm_state_size, - BlockDriverState **first_bad_bs); + Error **errp); =20 -BlockDriverState *bdrv_all_find_vmstate_bs(void); +BlockDriverState *bdrv_all_find_vmstate_bs(Error **errp); =20 #endif diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index d15a2be827b..548bb6b5e3f 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -899,10 +899,11 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qd= ict) =20 ImageEntry *image_entry, *next_ie; SnapshotEntry *snapshot_entry; + Error *err =3D NULL; =20 - bs =3D bdrv_all_find_vmstate_bs(); + bs =3D bdrv_all_find_vmstate_bs(&err); if (!bs) { - monitor_printf(mon, "No available block device supports snapshots\= n"); + error_report_err(err); return; } aio_context =3D bdrv_get_aio_context(bs); @@ -952,7 +953,7 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdic= t) total =3D 0; for (i =3D 0; i < nb_sns; i++) { SnapshotEntry *next_sn; - if (bdrv_all_find_snapshot(sn_tab[i].name, &bs1) =3D=3D 0) { + if (bdrv_all_find_snapshot(sn_tab[i].name, NULL) =3D=3D 0) { global_snapshots[total] =3D i; total++; QTAILQ_FOREACH(image_entry, &image_list, next) { diff --git a/block/snapshot.c b/block/snapshot.c index a2bf3a54eb0..482e3fc7b72 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -462,14 +462,14 @@ static bool bdrv_all_snapshots_includes_bs(BlockDrive= rState *bs) * These functions will properly handle dataplane (take aio_context_acquire * when appropriate for appropriate block drivers) */ =20 -bool bdrv_all_can_snapshot(BlockDriverState **first_bad_bs) +bool bdrv_all_can_snapshot(Error **errp) { - bool ok =3D true; BlockDriverState *bs; BdrvNextIterator it; =20 for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { AioContext *ctx =3D bdrv_get_aio_context(bs); + bool ok =3D true; =20 aio_context_acquire(ctx); if (bdrv_all_snapshots_includes_bs(bs)) { @@ -477,26 +477,25 @@ bool bdrv_all_can_snapshot(BlockDriverState **first_b= ad_bs) } aio_context_release(ctx); if (!ok) { + error_setg(errp, "Device '%s' is writable but does not support= " + "snapshots", bdrv_get_device_or_node_name(bs)); bdrv_next_cleanup(&it); - goto fail; + return false; } } =20 -fail: - *first_bad_bs =3D bs; - return ok; + return true; } =20 -int bdrv_all_delete_snapshot(const char *name, BlockDriverState **first_ba= d_bs, - Error **errp) +int bdrv_all_delete_snapshot(const char *name, Error **errp) { - int ret =3D 0; BlockDriverState *bs; BdrvNextIterator it; QEMUSnapshotInfo sn1, *snapshot =3D &sn1; =20 for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { AioContext *ctx =3D bdrv_get_aio_context(bs); + int ret =3D 0; =20 aio_context_acquire(ctx); if (bdrv_all_snapshots_includes_bs(bs) && @@ -507,26 +506,25 @@ int bdrv_all_delete_snapshot(const char *name, BlockD= riverState **first_bad_bs, } aio_context_release(ctx); if (ret < 0) { + error_prepend(errp, "Could not delete snapshot '%s' on '%s': ", + name, bdrv_get_device_or_node_name(bs)); bdrv_next_cleanup(&it); - goto fail; + return -1; } } =20 -fail: - *first_bad_bs =3D bs; - return ret; + return 0; } =20 =20 -int bdrv_all_goto_snapshot(const char *name, BlockDriverState **first_bad_= bs, - Error **errp) +int bdrv_all_goto_snapshot(const char *name, Error **errp) { - int ret =3D 0; BlockDriverState *bs; BdrvNextIterator it; =20 for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { AioContext *ctx =3D bdrv_get_aio_context(bs); + int ret =3D 0; =20 aio_context_acquire(ctx); if (bdrv_all_snapshots_includes_bs(bs)) { @@ -534,75 +532,75 @@ int bdrv_all_goto_snapshot(const char *name, BlockDri= verState **first_bad_bs, } aio_context_release(ctx); if (ret < 0) { + error_prepend(errp, "Could not load snapshot '%s' on '%s': ", + name, bdrv_get_device_or_node_name(bs)); bdrv_next_cleanup(&it); - goto fail; + return -1; } } =20 -fail: - *first_bad_bs =3D bs; - return ret; + return 0; } =20 -int bdrv_all_find_snapshot(const char *name, BlockDriverState **first_bad_= bs) +int bdrv_all_find_snapshot(const char *name, Error **errp) { QEMUSnapshotInfo sn; - int err =3D 0; BlockDriverState *bs; BdrvNextIterator it; =20 for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { AioContext *ctx =3D bdrv_get_aio_context(bs); + int ret =3D 0; =20 aio_context_acquire(ctx); if (bdrv_all_snapshots_includes_bs(bs)) { - err =3D bdrv_snapshot_find(bs, &sn, name); + ret =3D bdrv_snapshot_find(bs, &sn, name); } aio_context_release(ctx); - if (err < 0) { + if (ret < 0) { + error_setg(errp, "Could not find snapshot '%s' on '%s'", + name, bdrv_get_device_or_node_name(bs)); bdrv_next_cleanup(&it); - goto fail; + return -1; } } =20 -fail: - *first_bad_bs =3D bs; - return err; + return 0; } =20 int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn, BlockDriverState *vm_state_bs, uint64_t vm_state_size, - BlockDriverState **first_bad_bs) + Error **errp) { - int err =3D 0; BlockDriverState *bs; BdrvNextIterator it; =20 for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { AioContext *ctx =3D bdrv_get_aio_context(bs); + int ret =3D 0; =20 aio_context_acquire(ctx); if (bs =3D=3D vm_state_bs) { sn->vm_state_size =3D vm_state_size; - err =3D bdrv_snapshot_create(bs, sn); + ret =3D bdrv_snapshot_create(bs, sn); } else if (bdrv_all_snapshots_includes_bs(bs)) { sn->vm_state_size =3D 0; - err =3D bdrv_snapshot_create(bs, sn); + ret =3D bdrv_snapshot_create(bs, sn); } aio_context_release(ctx); - if (err < 0) { + if (ret < 0) { + error_setg(errp, "Could not create snapshot '%s' on '%s'", + sn->name, bdrv_get_device_or_node_name(bs)); bdrv_next_cleanup(&it); - goto fail; + return -1; } } =20 -fail: - *first_bad_bs =3D bs; - return err; + return 0; } =20 -BlockDriverState *bdrv_all_find_vmstate_bs(void) +BlockDriverState *bdrv_all_find_vmstate_bs(Error **errp) { BlockDriverState *bs; BdrvNextIterator it; @@ -620,5 +618,8 @@ BlockDriverState *bdrv_all_find_vmstate_bs(void) break; } } + if (!bs) { + error_setg(errp, "No block device supports snapshots"); + } return bs; } diff --git a/migration/savevm.c b/migration/savevm.c index d2e141f7b1d..a52da440f4b 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2660,7 +2660,7 @@ int qemu_load_device_state(QEMUFile *f) =20 int save_snapshot(const char *name, Error **errp) { - BlockDriverState *bs, *bs1; + BlockDriverState *bs; QEMUSnapshotInfo sn1, *sn =3D &sn1, old_sn1, *old_sn =3D &old_sn1; int ret =3D -1, ret2; QEMUFile *f; @@ -2680,25 +2680,19 @@ int save_snapshot(const char *name, Error **errp) return ret; } =20 - if (!bdrv_all_can_snapshot(&bs)) { - error_setg(errp, "Device '%s' is writable but does not support " - "snapshots", bdrv_get_device_or_node_name(bs)); + if (!bdrv_all_can_snapshot(errp)) { return ret; } =20 /* Delete old snapshots of the same name */ if (name) { - ret =3D bdrv_all_delete_snapshot(name, &bs1, errp); - if (ret < 0) { - error_prepend(errp, "Error while deleting snapshot on device " - "'%s': ", bdrv_get_device_or_node_name(bs1)); + if (bdrv_all_delete_snapshot(name, errp) < 0) { return ret; } } =20 - bs =3D bdrv_all_find_vmstate_bs(); + bs =3D bdrv_all_find_vmstate_bs(errp); if (bs =3D=3D NULL) { - error_setg(errp, "No block device can accept snapshots"); return ret; } aio_context =3D bdrv_get_aio_context(bs); @@ -2768,10 +2762,8 @@ int save_snapshot(const char *name, Error **errp) aio_context_release(aio_context); aio_context =3D NULL; =20 - ret =3D bdrv_all_create_snapshot(sn, bs, vm_state_size, &bs); + ret =3D bdrv_all_create_snapshot(sn, bs, vm_state_size, errp); if (ret < 0) { - error_setg(errp, "Error while creating snapshot on '%s'", - bdrv_get_device_or_node_name(bs)); goto the_end; } =20 @@ -2874,30 +2866,23 @@ void qmp_xen_load_devices_state(const char *filenam= e, Error **errp) =20 int load_snapshot(const char *name, Error **errp) { - BlockDriverState *bs, *bs_vm_state; + BlockDriverState *bs_vm_state; QEMUSnapshotInfo sn; QEMUFile *f; int ret; AioContext *aio_context; MigrationIncomingState *mis =3D migration_incoming_get_current(); =20 - if (!bdrv_all_can_snapshot(&bs)) { - error_setg(errp, - "Device '%s' is writable but does not support snapshots= ", - bdrv_get_device_or_node_name(bs)); + if (!bdrv_all_can_snapshot(errp)) { return -ENOTSUP; } - ret =3D bdrv_all_find_snapshot(name, &bs); + ret =3D bdrv_all_find_snapshot(name, errp); if (ret < 0) { - error_setg(errp, - "Device '%s' does not have the requested snapshot '%s'", - bdrv_get_device_or_node_name(bs), name); return ret; } =20 - bs_vm_state =3D bdrv_all_find_vmstate_bs(); + bs_vm_state =3D bdrv_all_find_vmstate_bs(errp); if (!bs_vm_state) { - error_setg(errp, "No block device supports snapshots"); return -ENOTSUP; } aio_context =3D bdrv_get_aio_context(bs_vm_state); @@ -2923,10 +2908,8 @@ int load_snapshot(const char *name, Error **errp) /* Flush all IO requests so they don't interfere with the new state. = */ bdrv_drain_all_begin(); =20 - ret =3D bdrv_all_goto_snapshot(name, &bs, errp); + ret =3D bdrv_all_goto_snapshot(name, errp); if (ret < 0) { - error_prepend(errp, "Could not load snapshot '%s' on '%s': ", - name, bdrv_get_device_or_node_name(bs)); goto err_drain; } =20 diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 9789f4277f5..f48173820ff 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1139,15 +1139,10 @@ void hmp_savevm(Monitor *mon, const QDict *qdict) =20 void hmp_delvm(Monitor *mon, const QDict *qdict) { - BlockDriverState *bs; Error *err =3D NULL; const char *name =3D qdict_get_str(qdict, "name"); =20 - if (bdrv_all_delete_snapshot(name, &bs, &err) < 0) { - error_prepend(&err, - "deleting snapshot on device '%s': ", - bdrv_get_device_name(bs)); - } + bdrv_all_delete_snapshot(name, &err); hmp_handle_error(mon, err); } =20 diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c index ee9e86daa9b..8785489c02d 100644 --- a/replay/replay-debugging.c +++ b/replay/replay-debugging.c @@ -149,7 +149,7 @@ static char *replay_find_nearest_snapshot(int64_t icoun= t, =20 *snapshot_icount =3D -1; =20 - bs =3D bdrv_all_find_vmstate_bs(); + bs =3D bdrv_all_find_vmstate_bs(NULL); if (!bs) { goto fail; } @@ -160,7 +160,7 @@ static char *replay_find_nearest_snapshot(int64_t icoun= t, aio_context_release(aio_context); =20 for (i =3D 0; i < nb_sns; i++) { - if (bdrv_all_find_snapshot(sn_tab[i].name, &bs) =3D=3D 0) { + if (bdrv_all_find_snapshot(sn_tab[i].name, NULL) =3D=3D 0) { if (sn_tab[i].icount !=3D -1ULL && sn_tab[i].icount <=3D icount && (!nearest || nearest->icount < sn_tab[i].icount)) { diff --git a/tests/qemu-iotests/267.out b/tests/qemu-iotests/267.out index 27471ffae83..6149029b25d 100644 --- a/tests/qemu-iotests/267.out +++ b/tests/qemu-iotests/267.out @@ -6,9 +6,9 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D1342177= 28 Testing: QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm snap0 -Error: No block device can accept snapshots +Error: No block device supports snapshots (qemu) info snapshots -No available block device supports snapshots +No block device supports snapshots (qemu) loadvm snap0 Error: No block device supports snapshots (qemu) quit @@ -22,7 +22,7 @@ QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm snap0 Error: Device 'none0' is writable but does not support snapshots (qemu) info snapshots -No available block device supports snapshots +No block device supports snapshots (qemu) loadvm snap0 Error: Device 'none0' is writable but does not support snapshots (qemu) quit @@ -58,7 +58,7 @@ QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm snap0 Error: Device 'virtio0' is writable but does not support snapshots (qemu) info snapshots -No available block device supports snapshots +No block device supports snapshots (qemu) loadvm snap0 Error: Device 'virtio0' is writable but does not support snapshots (qemu) quit @@ -83,7 +83,7 @@ QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm snap0 Error: Device 'file' is writable but does not support snapshots (qemu) info snapshots -No available block device supports snapshots +No block device supports snapshots (qemu) loadvm snap0 Error: Device 'file' is writable but does not support snapshots (qemu) quit --=20 2.26.2 From nobody Sun May 12 11:00:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) client-ip=63.128.21.124; envelope-from=philmd@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=philmd@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602505680; cv=none; d=zohomail.com; s=zohoarc; b=mBcojkUjf/j0QnagP9YgSUGyp+GnpDFdqY4gzHHRFhXL2UZbTfPl9zaH/J2aACYUCPILI5mNT6E5iQrC55ynAP6oF4spzmoKvCd1UubQWxswN5A96GoHyrgPZO5hSEIE26FprAdZ0zHCP7g4/y6THi1UdF+0njp9rfFjkk2o7Z4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602505680; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=GF3rPFB8TmDLVdIBNNrbowCvUxvjAQ6sUwTvdnLn0c0=; b=l+DYkddhoZS+wZAzz05RWq8j8AR5pQez7i/1RV/gT8rQyDI+y33bMIIumdHD7ZTO8M+9/UypYPJqGKyDf0UK/3K2KIMIhJ/WWglo+y9o3Y5AqvvBCh5QUH/iLikjJwqz27Vj2qy7mb8TNvAqkbSja96KOkBjcPxViTdH4RBqpm4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=philmd@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mx.zohomail.com with SMTPS id 1602505680794143.78621518094724; Mon, 12 Oct 2020 05:28:00 -0700 (PDT) Received: from mail-wr1-f69.google.com (mail-wr1-f69.google.com [209.85.221.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-380-sXQI79r2NDKVIerpaNaRbA-1; Mon, 12 Oct 2020 08:27:58 -0400 Received: by mail-wr1-f69.google.com with SMTP id u15so9280715wrn.4 for ; Mon, 12 Oct 2020 05:27:57 -0700 (PDT) Return-Path: Return-Path: Received: from localhost.localdomain (106.red-83-59-162.dynamicip.rima-tde.net. [83.59.162.106]) by smtp.gmail.com with ESMTPSA id c185sm1996288wma.44.2020.10.12.05.27.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Oct 2020 05:27:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602505679; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=GF3rPFB8TmDLVdIBNNrbowCvUxvjAQ6sUwTvdnLn0c0=; b=QBOzvtcKtRXR/4j0FT5N9DqQk8hEBom3fg0jXN5TlQrEcRzedkkSpkkM5gBTg2uPr1gwvw FEkrNdcOuf56KPP51eQhkXCP7xVAqolN7CLNKnmGmsbjBteWqOqwaQNovebJP2oKpIAqnq g4dTiLR0o8g/RRWGs3AFDdXG1kWFJzg= X-MC-Unique: sXQI79r2NDKVIerpaNaRbA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GF3rPFB8TmDLVdIBNNrbowCvUxvjAQ6sUwTvdnLn0c0=; b=jnl9HkhvUEFdzFtSZASKlXnIF/4n/dOQTbnicaj/p5FWmQi8wKCdwvwiFdTcLR/DE+ jfIa6D82wQ6APiKFPEoIIBmc76PkweRXY7FpfYXKIsJ0XFGahuq7z3xOQIO8E0AUot3q +9aqe/R5axoh8k3KUqe8/xFZcLfxoMnnHHdEzwTLdiGJB1u0rJeFs0oOEDl4+RofuLH1 pNnx0Qkl88Q48lpcQAmrqPqzRzeRsZH8rA2V2poSkl0DL4vrvvMgnJ4XnVl/x2gN03v/ Gz33ODI8VANcGyeqwt9zQmoTHjvg35j1LQeWEHrPkSR8x3//yR1stQ7pfoWGghGxJeWZ ok8g== X-Gm-Message-State: AOAM532+E4rHwo9NPZJ4misp8w2byNzlcEaS3/RDbZW324o4SJ/Nbs3d qwvvI6cu8xWGOG8Eiz8/MZzMXibr6yphFH2FbsYxpzdV4z+IlWD70irJzyH4Lz3KTMPIZxPBfwg Q/7Qy5Fxgj2GDSg== X-Received: by 2002:a1c:e444:: with SMTP id b65mr11312709wmh.65.1602505676784; Mon, 12 Oct 2020 05:27:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx41js+WBMb2MispfLdqaz4gLSVYW8awTTGLAgTHE5/rIMaRjQ/nDK3HficsiAXqvS9xlAYjw== X-Received: by 2002:a1c:e444:: with SMTP id b65mr11312685wmh.65.1602505676574; Mon, 12 Oct 2020 05:27:56 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Pavel Dovgalyuk , Juan Quintela , Max Reitz , Paolo Bonzini , Kevin Wolf , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , "Dr. David Alan Gilbert" , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Pavel Dovgalyuk Subject: [PATCH v2 2/3] migration: Make save_snapshot() return bool, not 0/-1 Date: Mon, 12 Oct 2020 14:27:42 +0200 Message-Id: <20201012122743.3390867-3-philmd@redhat.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20201012122743.3390867-1-philmd@redhat.com> References: <20201012122743.3390867-1-philmd@redhat.com> MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=philmd@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Just for consistency, following the example documented since commit e3fe3988d7 ("error: Document Error API usage rules"), return a boolean value indicating an error is set or not. Acked-by: Pavel Dovgalyuk Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- include/migration/snapshot.h | 9 ++++++++- migration/savevm.c | 16 ++++++++-------- replay/replay-debugging.c | 2 +- replay/replay-snapshot.c | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/include/migration/snapshot.h b/include/migration/snapshot.h index c85b6ec75b7..a40c34307b5 100644 --- a/include/migration/snapshot.h +++ b/include/migration/snapshot.h @@ -15,7 +15,14 @@ #ifndef QEMU_MIGRATION_SNAPSHOT_H #define QEMU_MIGRATION_SNAPSHOT_H =20 -int save_snapshot(const char *name, Error **errp); +/** + * save_snapshot: Save a snapshot. + * @name: path to snapshot + * @errp: pointer to error object + * On success, return %true. + * On failure, store an error through @errp and return %false. + */ +bool save_snapshot(const char *name, Error **errp); int load_snapshot(const char *name, Error **errp); =20 #endif diff --git a/migration/savevm.c b/migration/savevm.c index a52da440f4b..fd2e5e8b663 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2658,7 +2658,7 @@ int qemu_load_device_state(QEMUFile *f) return 0; } =20 -int save_snapshot(const char *name, Error **errp) +bool save_snapshot(const char *name, Error **errp) { BlockDriverState *bs; QEMUSnapshotInfo sn1, *sn =3D &sn1, old_sn1, *old_sn =3D &old_sn1; @@ -2671,29 +2671,29 @@ int save_snapshot(const char *name, Error **errp) AioContext *aio_context; =20 if (migration_is_blocked(errp)) { - return ret; + return false; } =20 if (!replay_can_snapshot()) { error_setg(errp, "Record/replay does not allow making snapshot " "right now. Try once more later."); - return ret; + return false; } =20 if (!bdrv_all_can_snapshot(errp)) { - return ret; + return false; } =20 /* Delete old snapshots of the same name */ if (name) { if (bdrv_all_delete_snapshot(name, errp) < 0) { - return ret; + return false; } } =20 bs =3D bdrv_all_find_vmstate_bs(errp); if (bs =3D=3D NULL) { - return ret; + return false; } aio_context =3D bdrv_get_aio_context(bs); =20 @@ -2702,7 +2702,7 @@ int save_snapshot(const char *name, Error **errp) ret =3D global_state_store(); if (ret) { error_setg(errp, "Error saving global state"); - return ret; + return false; } vm_stop(RUN_STATE_SAVE_VM); =20 @@ -2779,7 +2779,7 @@ int save_snapshot(const char *name, Error **errp) if (saved_vm_running) { vm_start(); } - return ret; + return ret =3D=3D 0; } =20 void qmp_xen_save_devices_state(const char *filename, bool has_live, bool = live, diff --git a/replay/replay-debugging.c b/replay/replay-debugging.c index 8785489c02d..5458a73fced 100644 --- a/replay/replay-debugging.c +++ b/replay/replay-debugging.c @@ -327,7 +327,7 @@ void replay_gdb_attached(void) */ if (replay_mode =3D=3D REPLAY_MODE_PLAY && !replay_snapshot) { - if (save_snapshot("start_debugging", NULL) !=3D 0) { + if (!save_snapshot("start_debugging", NULL)) { /* Can't create the snapshot. Continue conventional debugging.= */ } } diff --git a/replay/replay-snapshot.c b/replay/replay-snapshot.c index e26fa4c892e..4f2560d1568 100644 --- a/replay/replay-snapshot.c +++ b/replay/replay-snapshot.c @@ -77,7 +77,7 @@ void replay_vmstate_init(void) =20 if (replay_snapshot) { if (replay_mode =3D=3D REPLAY_MODE_RECORD) { - if (save_snapshot(replay_snapshot, &err) !=3D 0) { + if (!save_snapshot(replay_snapshot, &err)) { error_report_err(err); error_report("Could not create snapshot for icount record"= ); exit(1); --=20 2.26.2 From nobody Sun May 12 11:00:51 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=philmd@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=philmd@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1602505687; cv=none; d=zohomail.com; s=zohoarc; b=fOp+Bm83CXgtpIVsnWuf2RXPuNmKHIwC7ThhVYq3QA8bZjvavt9VbM8p/wfb2+ZudsPTk7DqNZhQEnNs5RtYVde/hgOyPJPTjwsJGj99ZsbKXMq3LAkA4Cc3cnlUzE5Y8pOxtwhIHb8paeBIbwW8Vv5REQgQ87sxknJLtJoP/rs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1602505687; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:To; bh=plnZZZCVxgXXJPFVOHnuh5Pe0AHG0Eyi5aYw9WHIkco=; b=RUDCNQF1WuysIrvCoGEaqKjycCrKUdWhHjoVaSETX9YdvNt6e2dT6HyUT35IxzmrBRrlc9+bLr5hWKdbEZrg43saxBsP1EmDBhpDwGdUPYn2G/4X4KEhSUdqm1tTwyRwkK4H8SoQhcuBhtw1Q7CsQhaU5eQgciPJkld6hp1SUxA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=philmd@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1602505687520597.2349470829241; Mon, 12 Oct 2020 05:28:07 -0700 (PDT) Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-393-uS7XNGDhPbeqh3N11urBrA-1; Mon, 12 Oct 2020 08:28:03 -0400 Received: by mail-wr1-f70.google.com with SMTP id u15so9280820wrn.4 for ; Mon, 12 Oct 2020 05:28:03 -0700 (PDT) Return-Path: Return-Path: Received: from localhost.localdomain (106.red-83-59-162.dynamicip.rima-tde.net. [83.59.162.106]) by smtp.gmail.com with ESMTPSA id x15sm27756648wrr.36.2020.10.12.05.28.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Oct 2020 05:28:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1602505685; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=plnZZZCVxgXXJPFVOHnuh5Pe0AHG0Eyi5aYw9WHIkco=; b=OZhuBK7xxB90ZTRLQf9CixWGkGn+23KoKTjfPC8V84CPFqRz4zQDTYhjYdkZUQ30uOjvYr VdvifZT2ZbmzkpLhcTxroROVkW16Gkfx4M30AKMKiEvJ1vqCGoGRVRxNnPoxvRjdQojgsS KxC2XPwdXfSpqIGtlNRjTrk2/k2xbhA= X-MC-Unique: uS7XNGDhPbeqh3N11urBrA-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=plnZZZCVxgXXJPFVOHnuh5Pe0AHG0Eyi5aYw9WHIkco=; b=l/TltO4Arc3wlfiWKmtdvMg31BgeIVUJjYw06zyRETXv8J1iEssuOzQTcpTQXm22Ce x3/HajxwdJTChq1OpQkYAiuMTSCnjv3I6r3LJf+PUHAniE0fcb0RBTYOwvmq1OgbkgZy 33a2yJlOjJcDRswrBpJCIpgKdGQWkI2xTcyr8ZRVi7BKWqZ23iFMMxPF0jA3PzokL7z/ ULIy4fPnz+E9nO9ml5WYuamDuiZHXemwR+9mEjDr8xZi2FyJ0ZK+syEqcAojjdjoAo7l i+ULW1yb+/6sIYkx/0+TXPnow9Wf67TpOX8fyF6cr+KmuNsUiiawGe+eojGvoKy6zrIr E4Ag== X-Gm-Message-State: AOAM533SZwp65FcKcoAVZsOMIJ3MPAmLoVSUHqZzOKIruskfxHjz5vDJ pYSXiybgLFMNzdOG1QxT6TxSc9p52G0EPTBmceKGJ26WIECd4W52O7Xfvt2el6E9OUAHaievRyu BKgOzimY4wC/OYg== X-Received: by 2002:a1c:a3c2:: with SMTP id m185mr8633429wme.161.1602505681921; Mon, 12 Oct 2020 05:28:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxYvdBzLGTGinRNhKWAf4Orm0U7MgjIWG+FaAtJ+vTHylLfT5HKjpTu2oL31+36nsSCRx63Fg== X-Received: by 2002:a1c:a3c2:: with SMTP id m185mr8633416wme.161.1602505681693; Mon, 12 Oct 2020 05:28:01 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Cc: qemu-block@nongnu.org, Pavel Dovgalyuk , Juan Quintela , Max Reitz , Paolo Bonzini , Kevin Wolf , =?UTF-8?q?Daniel=20P=20=2E=20Berrang=C3=A9?= , "Dr. David Alan Gilbert" , Pavel Dovgalyuk , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 3/3] migration: stop returning errno from load_snapshot() Date: Mon, 12 Oct 2020 14:27:43 +0200 Message-Id: <20201012122743.3390867-4-philmd@redhat.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20201012122743.3390867-1-philmd@redhat.com> References: <20201012122743.3390867-1-philmd@redhat.com> MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=philmd@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) From: Daniel P. Berrang=C3=A9 None of the callers care about the errno value since there is a full Error object populated. This gives consistency with save_snapshot() which already just returns a boolean value. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Daniel P. Berrang=C3=A9 [PMD: Return false/true instead of -1/0, document function] Acked-by: Pavel Dovgalyuk Signed-off-by: Philippe Mathieu-Daud=C3=A9 --- include/migration/snapshot.h | 9 ++++++++- migration/savevm.c | 19 +++++++++---------- monitor/hmp-cmds.c | 2 +- replay/replay-snapshot.c | 2 +- softmmu/vl.c | 2 +- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/include/migration/snapshot.h b/include/migration/snapshot.h index a40c34307b5..9bc989a6b49 100644 --- a/include/migration/snapshot.h +++ b/include/migration/snapshot.h @@ -23,6 +23,13 @@ * On failure, store an error through @errp and return %false. */ bool save_snapshot(const char *name, Error **errp); -int load_snapshot(const char *name, Error **errp); +/** + * save_snapshot: Load a snapshot. + * @name: path to snapshot + * @errp: pointer to error object + * On success, return %true. + * On failure, store an error through @errp and return %false. + */ +bool load_snapshot(const char *name, Error **errp); =20 #endif diff --git a/migration/savevm.c b/migration/savevm.c index fd2e5e8b663..531bb2eca1e 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2864,7 +2864,7 @@ void qmp_xen_load_devices_state(const char *filename,= Error **errp) migration_incoming_state_destroy(); } =20 -int load_snapshot(const char *name, Error **errp) +bool load_snapshot(const char *name, Error **errp) { BlockDriverState *bs_vm_state; QEMUSnapshotInfo sn; @@ -2874,16 +2874,16 @@ int load_snapshot(const char *name, Error **errp) MigrationIncomingState *mis =3D migration_incoming_get_current(); =20 if (!bdrv_all_can_snapshot(errp)) { - return -ENOTSUP; + return false; } ret =3D bdrv_all_find_snapshot(name, errp); if (ret < 0) { - return ret; + return false; } =20 bs_vm_state =3D bdrv_all_find_vmstate_bs(errp); if (!bs_vm_state) { - return -ENOTSUP; + return false; } aio_context =3D bdrv_get_aio_context(bs_vm_state); =20 @@ -2892,11 +2892,11 @@ int load_snapshot(const char *name, Error **errp) ret =3D bdrv_snapshot_find(bs_vm_state, &sn, name); aio_context_release(aio_context); if (ret < 0) { - return ret; + return false; } else if (sn.vm_state_size =3D=3D 0) { error_setg(errp, "This is a disk-only snapshot. Revert to it " " offline using qemu-img"); - return -EINVAL; + return false; } =20 /* @@ -2917,7 +2917,6 @@ int load_snapshot(const char *name, Error **errp) f =3D qemu_fopen_bdrv(bs_vm_state, 0); if (!f) { error_setg(errp, "Could not open VM state file"); - ret =3D -EINVAL; goto err_drain; } =20 @@ -2933,14 +2932,14 @@ int load_snapshot(const char *name, Error **errp) =20 if (ret < 0) { error_setg(errp, "Error %d while loading VM state", ret); - return ret; + return false; } =20 - return 0; + return true; =20 err_drain: bdrv_drain_all_end(); - return ret; + return false; } =20 void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev) diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index f48173820ff..521fcf96eba 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1123,7 +1123,7 @@ void hmp_loadvm(Monitor *mon, const QDict *qdict) =20 vm_stop(RUN_STATE_RESTORE_VM); =20 - if (load_snapshot(name, &err) =3D=3D 0 && saved_vm_running) { + if (!load_snapshot(name, &err) && saved_vm_running) { vm_start(); } hmp_handle_error(mon, err); diff --git a/replay/replay-snapshot.c b/replay/replay-snapshot.c index 4f2560d1568..b2893659370 100644 --- a/replay/replay-snapshot.c +++ b/replay/replay-snapshot.c @@ -83,7 +83,7 @@ void replay_vmstate_init(void) exit(1); } } else if (replay_mode =3D=3D REPLAY_MODE_PLAY) { - if (load_snapshot(replay_snapshot, &err) !=3D 0) { + if (!load_snapshot(replay_snapshot, &err)) { error_report_err(err); error_report("Could not load snapshot for icount replay"); exit(1); diff --git a/softmmu/vl.c b/softmmu/vl.c index 5a11a62f78a..6eaa6b3a09a 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -4478,7 +4478,7 @@ void qemu_init(int argc, char **argv, char **envp) register_global_state(); if (loadvm) { Error *local_err =3D NULL; - if (load_snapshot(loadvm, &local_err) < 0) { + if (!load_snapshot(loadvm, &local_err)) { error_report_err(local_err); autostart =3D 0; exit(1); --=20 2.26.2