From nobody Sun May 19 03:38:19 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1598527033; cv=none; d=zohomail.com; s=zohoarc; b=j5mfOq8Q0mTzQ0se0qRzZVvADfJkrfcbTyKnYKSMkbp6wiry3YyVQcDcdTY0Bp76Qss/pqhvjfQzp/7/A1fBaJTtH3TinDl4cOwfj8d8rwIsSX/2oXL7zDyxZFO+I3TSy9NqsO8e8dp5/00SNuWZ5KIy/xcXxEjDHimL8Jq51wo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1598527033; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=UaJ9FIRlEa+ZpnwXZCF1dherHLU9UGuonkm1N6ye2K4=; b=dpkhrBjr30kbpQCVtjdi6AzbEi4RWUC39cRBu35DFKSXWXCQ0tDe6N3hL5PfqUGQLP1XvnTLhffQpAYziBseYELCdfRf1uz6YAXH+ORgMx25NwSOa1ZEUUBi1lYO3pHbKIi2tzkY9LjWwsl5DUdApwAham9tnbq1r1IDx5gMidY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1598527033164791.2555400018; Thu, 27 Aug 2020 04:17:13 -0700 (PDT) Received: from localhost ([::1]:58866 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kBFu3-0005I5-HE for importer@patchew.org; Thu, 27 Aug 2020 07:17:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54196) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kBFtG-0004AK-J4 for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:22 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:34877 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kBFtE-0000mg-60 for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:22 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-188--gy-qDtkMjawdd6OoXjbHg-1; Thu, 27 Aug 2020 07:16:16 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BD87A185FD78; Thu, 27 Aug 2020 11:16:15 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.51]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5981378370; Thu, 27 Aug 2020 11:16:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1598526978; 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=UaJ9FIRlEa+ZpnwXZCF1dherHLU9UGuonkm1N6ye2K4=; b=RzQQCeC9uzvYaJ0C2oISUv+f7IOwVLQXo0rndnyi3Uo3qWRZ/E1oOqUvYRwyrmBU1I2kq9 NK9C+L0m3r6zSRPmiFfrfYNVi45UyJ0vEyytwsZEBm/7EtiMtd07ewl3f3t9Rr0VRGH4KV HARhvD90ArgKaYdcSjdR2AjpZBGPdPQ= X-MC-Unique: -gy-qDtkMjawdd6OoXjbHg-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH v3 1/7] migration: improve error reporting of block driver state name Date: Thu, 27 Aug 2020 12:16:00 +0100 Message-Id: <20200827111606.1408275-2-berrange@redhat.com> In-Reply-To: <20200827111606.1408275-1-berrange@redhat.com> References: <20200827111606.1408275-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=berrange@redhat.com X-Mimecast-Spam-Score: 0.003 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.139.110.120; envelope-from=berrange@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/27 00:13:19 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.959, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Peter Krempa , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , "Denis V. Lunev" , qemu-block@nongnu.org, Juan Quintela , John Snow , Markus Armbruster , "Dr. David Alan Gilbert" , Pavel Dovgalyuk , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) With blockdev, a BlockDriverState may not have a device name, so using a node name is required as an alternative. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Daniel P. Berrang=C3=A9 --- migration/savevm.c | 12 ++++++------ tests/qemu-iotests/267.out | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/migration/savevm.c b/migration/savevm.c index a843d202b5..304d98ff78 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2682,7 +2682,7 @@ int save_snapshot(const char *name, Error **errp) =20 if (!bdrv_all_can_snapshot(&bs)) { error_setg(errp, "Device '%s' is writable but does not support " - "snapshots", bdrv_get_device_name(bs)); + "snapshots", bdrv_get_device_or_node_name(bs)); return ret; } =20 @@ -2691,7 +2691,7 @@ int save_snapshot(const char *name, Error **errp) 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_name(bs1)); + "'%s': ", bdrv_get_device_or_node_name(bs1)); return ret; } } @@ -2766,7 +2766,7 @@ int save_snapshot(const char *name, Error **errp) ret =3D bdrv_all_create_snapshot(sn, bs, vm_state_size, &bs); if (ret < 0) { error_setg(errp, "Error while creating snapshot on '%s'", - bdrv_get_device_name(bs)); + bdrv_get_device_or_node_name(bs)); goto the_end; } =20 @@ -2884,14 +2884,14 @@ int load_snapshot(const char *name, Error **errp) if (!bdrv_all_can_snapshot(&bs)) { error_setg(errp, "Device '%s' is writable but does not support snapshots= ", - bdrv_get_device_name(bs)); + bdrv_get_device_or_node_name(bs)); return -ENOTSUP; } ret =3D bdrv_all_find_snapshot(name, &bs); if (ret < 0) { error_setg(errp, "Device '%s' does not have the requested snapshot '%s'", - bdrv_get_device_name(bs), name); + bdrv_get_device_or_node_name(bs), name); return ret; } =20 @@ -2920,7 +2920,7 @@ int load_snapshot(const char *name, Error **errp) ret =3D bdrv_all_goto_snapshot(name, &bs, errp); if (ret < 0) { error_prepend(errp, "Could not load snapshot '%s' on '%s': ", - name, bdrv_get_device_name(bs)); + name, bdrv_get_device_or_node_name(bs)); goto err_drain; } =20 diff --git a/tests/qemu-iotests/267.out b/tests/qemu-iotests/267.out index d6d80c099f..215902b3ad 100644 --- a/tests/qemu-iotests/267.out +++ b/tests/qemu-iotests/267.out @@ -81,11 +81,11 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D134= 217728 Testing: -blockdev driver=3Dfile,filename=3DTEST_DIR/t.IMGFMT,node-name=3D= file QEMU X.Y.Z monitor - type 'help' for more information (qemu) savevm snap0 -Error: Device '' is writable but does not support snapshots +Error: Device 'file' is writable but does not support snapshots (qemu) info snapshots No available block device supports snapshots (qemu) loadvm snap0 -Error: Device '' is writable but does not support snapshots +Error: Device 'file' is writable but does not support snapshots (qemu) quit =20 Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D134217728 --=20 2.26.2 From nobody Sun May 19 03:38:19 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1598527095; cv=none; d=zohomail.com; s=zohoarc; b=KHQg4Jha4nbU2pyUCjbRjPZSGmTjSWxyLgC2853mcBqEvbwTM74Eb7eTv8Cb3WOQwobJyC49FntojWJGNDXTPrFET1aRlGe4j7gWFbFiWpcEDJ3M3h04kTIUxpWpRHRBn9qzKogj4fMoBquP24fqVnUnvJbkhmttfvk2okhI7Ig= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1598527095; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=xUUJHZkbWklWm0AkpQRcowpWMIHEJ8SdMw1RXyEdJho=; b=PPEuB+A46rkv9mls1SbvVQDgbbfMeAC9SJxkSOJdGorSd0FB3Tp2Z15gqeUVBrJ9+gM5o1w3XbbreG7AgA+Wzf49M8TUFN++6VasEwpeTlMzswxOwjkxd0NhBoJfEcRCidng9LF/xlCuZlFvkJJYilElzBVVdjPRP4WgJBisiTk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1598527095027188.39338924198557; Thu, 27 Aug 2020 04:18:15 -0700 (PDT) Received: from localhost ([::1]:34950 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kBFv3-00072W-OF for importer@patchew.org; Thu, 27 Aug 2020 07:18:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54314) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kBFtQ-0004Up-VG for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:32 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:52499 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kBFtN-0000o9-Jv for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:32 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-398-5QtibcF3OmGohnqBpELJkw-1; Thu, 27 Aug 2020 07:16:24 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A5D05802B48; Thu, 27 Aug 2020 11:16:23 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.51]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2A1DC78370; Thu, 27 Aug 2020 11:16:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1598526988; 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=xUUJHZkbWklWm0AkpQRcowpWMIHEJ8SdMw1RXyEdJho=; b=BoYKxuHDprvzzWnfqXorr1FH7AKkJVN/11VDT/nh081paIA/TpiLqGsPVVHG7FkMwg4JlM sWyH+D5L8TRI5SI8eaLSR9FCwN2oWF4T7tYV7b8lqZ8aQLHD1ERqoshfTWP82g38RIPK7l AdUYCxycrzAPlEIIMUpLnrHKIy7Kej8= X-MC-Unique: 5QtibcF3OmGohnqBpELJkw-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH v3 2/7] block: push error reporting into bdrv_all_*_snapshot functions Date: Thu, 27 Aug 2020 12:16:01 +0100 Message-Id: <20200827111606.1408275-3-berrange@redhat.com> In-Reply-To: <20200827111606.1408275-1-berrange@redhat.com> References: <20200827111606.1408275-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=berrange@redhat.com X-Mimecast-Spam-Score: 0.003 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.139.110.120; envelope-from=berrange@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/27 00:13:19 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.959, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Peter Krempa , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , "Denis V. Lunev" , qemu-block@nongnu.org, Juan Quintela , John Snow , Markus Armbruster , "Dr. David Alan Gilbert" , Pavel Dovgalyuk , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) 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 --- block/monitor/block-hmp-cmds.c | 7 ++-- block/snapshot.c | 77 +++++++++++++++++----------------- include/block/snapshot.h | 14 +++---- migration/savevm.c | 37 +++++----------- monitor/hmp-cmds.c | 7 +--- tests/qemu-iotests/267.out | 10 ++--- 6 files changed, 65 insertions(+), 87 deletions(-) diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index 4c8c375172..9df11494d6 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -898,10 +898,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); @@ -951,7 +952,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 bd9fb01817..6839060622 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -400,14 +400,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; =20 aio_context_acquire(ctx); if (bdrv_all_snapshots_includes_bs(bs)) { @@ -415,26 +415,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; =20 aio_context_acquire(ctx); if (bdrv_all_snapshots_includes_bs(bs) && @@ -445,26 +444,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; =20 aio_context_acquire(ctx); if (bdrv_all_snapshots_includes_bs(bs)) { @@ -472,75 +470,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; =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; =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; @@ -558,5 +556,8 @@ BlockDriverState *bdrv_all_find_vmstate_bs(void) break; } } + if (!bs) { + error_setg(errp, "No block device supports snapshots"); + } return bs; } diff --git a/include/block/snapshot.h b/include/block/snapshot.h index 2bfcd57578..ba1528eee0 100644 --- a/include/block/snapshot.h +++ b/include/block/snapshot.h @@ -76,17 +76,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/migration/savevm.c b/migration/savevm.c index 304d98ff78..3826c437cc 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); @@ -2763,10 +2757,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 @@ -2868,7 +2860,7 @@ void qmp_xen_load_devices_state(const char *filename,= 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; @@ -2881,23 +2873,16 @@ int load_snapshot(const char *name, Error **errp) return -EINVAL; } =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); @@ -2917,10 +2902,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 7711726fd2..9bb50b9abf 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1137,15 +1137,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/tests/qemu-iotests/267.out b/tests/qemu-iotests/267.out index 215902b3ad..c65cce893a 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 19 03:38:19 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1598527170; cv=none; d=zohomail.com; s=zohoarc; b=PVRg5VSzQG3BGg8XfxZ5AUzlsIfaJ/t5aur3EJCh9VFxdbEU2Z+DWc6AXdm0HO6WwybcFInSeaPlkjT+qM5IgO9Rhe639v2ISFIzuwlwCZ+PYFtMiFdtbP2COymZXA/V9XamXDea5u+tzJEZKl56tdUXy1rh5/P/Gz3l5AxWsN4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1598527170; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=B4NDq7xY/p5nEHU+fj0NRxwrZ3KkfBVlXtATn0X/fuM=; b=X8TjveW/BhXjOJn/sQjIh8rrpo1Mj5jjts76iwWaB+wi1xhy+huDll0mqEsCmV0EGZ6Qk/NiCsHF0d56aV6g11+xr87x0zzIOu0p3wR2/P/R8oYdtdkE7Gl/AoED9m5sWG0hpdl2DPZdKFO/1Z3us5rzNh+zY34wn7Cw8+X9NzY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 15985271708851014.9964904549175; Thu, 27 Aug 2020 04:19:30 -0700 (PDT) Received: from localhost ([::1]:38770 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kBFwG-0000KL-Nm for importer@patchew.org; Thu, 27 Aug 2020 07:19:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54318) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kBFtR-0004Uy-0Y for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:33 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:22408) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kBFtP-0000oP-5q for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:32 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-456-ywK183ZVPm-1VzSDJyqixQ-1; Thu, 27 Aug 2020 07:16:28 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B08E6420EA; Thu, 27 Aug 2020 11:16:27 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.51]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1066978370; Thu, 27 Aug 2020 11:16:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1598526990; 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=B4NDq7xY/p5nEHU+fj0NRxwrZ3KkfBVlXtATn0X/fuM=; b=gsb3ceBNGH1vz4NDZRFHZtjPS+yln66epCW/OlBJbqgPyTf/+mitybAFa1ueoX6/6lo/MB 9fnjqyzkqxnJVsAeU+fm8uPO7LUJsYjWilNH1X1tBytwuaREsVc3/Cj4oNonxgS86j3VVL XiNWulOV1P3jkh5OkqfGLLfATWHUenc= X-MC-Unique: ywK183ZVPm-1VzSDJyqixQ-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH v3 3/7] migration: stop returning errno from load_snapshot() Date: Thu, 27 Aug 2020 12:16:02 +0100 Message-Id: <20200827111606.1408275-4-berrange@redhat.com> In-Reply-To: <20200827111606.1408275-1-berrange@redhat.com> References: <20200827111606.1408275-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=berrange@redhat.com X-Mimecast-Spam-Score: 0.003 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=63.128.21.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/27 02:54:02 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.959, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Peter Krempa , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , "Denis V. Lunev" , qemu-block@nongnu.org, Juan Quintela , John Snow , Markus Armbruster , "Dr. David Alan Gilbert" , Pavel Dovgalyuk , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) 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 -1. Reviewed-by: Dr. David Alan Gilbert Signed-off-by: Daniel P. Berrang=C3=A9 --- migration/savevm.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/migration/savevm.c b/migration/savevm.c index 3826c437cc..711137bcbe 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2870,20 +2870,20 @@ int load_snapshot(const char *name, Error **errp) if (!replay_can_snapshot()) { error_setg(errp, "Record/replay does not allow loading snapshot " "right now. Try once more later."); - return -EINVAL; + return -1; } =20 if (!bdrv_all_can_snapshot(errp)) { - return -ENOTSUP; + return -1; } ret =3D bdrv_all_find_snapshot(name, errp); if (ret < 0) { - return ret; + return -1; } =20 bs_vm_state =3D bdrv_all_find_vmstate_bs(errp); if (!bs_vm_state) { - return -ENOTSUP; + return -1; } 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 -1; } 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 -1; } =20 /* Flush all IO requests so they don't interfere with the new state. = */ @@ -2911,7 +2911,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 @@ -2927,14 +2926,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 -1; } =20 return 0; =20 err_drain: bdrv_drain_all_end(); - return ret; + return -1; } =20 void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev) --=20 2.26.2 From nobody Sun May 19 03:38:19 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1598527243; cv=none; d=zohomail.com; s=zohoarc; b=ihhsCL/wW3etq5Yc7UWIMijNMTRku29ovC6RLaDubRa1+cwG2KFgmQI24a/2yTIEQ+87PqNd3dL4BghuYX92/KuWWjHF+QUqhQkpALyyUsSCmFZ3lkyBmtgb2NXTEptSU99sbxnLlltotNeYxHLTEbiJvVXAftVc0TDHXMfKGp4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1598527243; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=pH0aMo2pBShZudod285fqHKNj1KmjnYdwcJsClAlFus=; b=Z3ofZm/HNsp+yi46JCSZzwjY/pjIOR828y2ZKMFGlxgz+lUieQtbkzqE5MrQ/w2fkYJY/Poex5BvDHnFwuJMpiQyWaJU3xZ8DfZ4ef1NaoVn0O6GRC5JHGGQ+Aeqs6BHf9ZgsUSD47RV6qIz8A0idridXisovikLvhp6HENHUyc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1598527243656993.9453613559624; Thu, 27 Aug 2020 04:20:43 -0700 (PDT) Received: from localhost ([::1]:41450 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kBFxS-0001dW-Ca for importer@patchew.org; Thu, 27 Aug 2020 07:20:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54390) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kBFtZ-0004pQ-Tl for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:41 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:60738 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kBFtX-0000pj-Jd for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:41 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-570-wH0FzQ0NPZm8nRbtCV6DXg-1; Thu, 27 Aug 2020 07:16:35 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 375E1801AC2; Thu, 27 Aug 2020 11:16:34 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.51]) by smtp.corp.redhat.com (Postfix) with ESMTP id 05A61757EC; Thu, 27 Aug 2020 11:16:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1598526998; 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=pH0aMo2pBShZudod285fqHKNj1KmjnYdwcJsClAlFus=; b=boNanlPTzPqRROKLyV9C5yMzhFrk4BRNz7/iwVuE00SPwyL+Y4IGLt/lRNCnhaO/9DIcxJ MIBTSULAYXxDp/Gj4TCxhPRiPMlMLxHdYrKNwgLAOfNEiNYj2lP1EuEMYnFh0rcNQxpPbF DZkpIPKlo6lvqbQqHt4zMYLyQLBZomU= X-MC-Unique: wH0FzQ0NPZm8nRbtCV6DXg-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH v3 4/7] block: add ability to specify list of blockdevs during snapshot Date: Thu, 27 Aug 2020 12:16:03 +0100 Message-Id: <20200827111606.1408275-5-berrange@redhat.com> In-Reply-To: <20200827111606.1408275-1-berrange@redhat.com> References: <20200827111606.1408275-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=berrange@redhat.com X-Mimecast-Spam-Score: 0.003 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.139.110.120; envelope-from=berrange@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/27 00:13:19 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.959, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Peter Krempa , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , "Denis V. Lunev" , qemu-block@nongnu.org, Juan Quintela , John Snow , Markus Armbruster , "Dr. David Alan Gilbert" , Pavel Dovgalyuk , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) When running snapshot operations, there are various rules for which blockdevs are included/excluded. While this provides reasonable default behaviour, there are scenarios that are not well handled by the default logic. Some of the conditions do not have a single correct answer. Thus there needs to be a way for the mgmt app to provide an explicit list of blockdevs to perform snapshots across. This can be achieved by passing a list of node names that should be used. Signed-off-by: Daniel P. Berrang=C3=A9 --- block/monitor/block-hmp-cmds.c | 4 +- block/snapshot.c | 167 +++++++++++++++++++++++---------- include/block/snapshot.h | 13 +-- migration/savevm.c | 16 ++-- monitor/hmp-cmds.c | 2 +- 5 files changed, 138 insertions(+), 64 deletions(-) diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index 9df11494d6..db76c43cc2 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -900,7 +900,7 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdic= t) SnapshotEntry *snapshot_entry; Error *err =3D NULL; =20 - bs =3D bdrv_all_find_vmstate_bs(&err); + bs =3D bdrv_all_find_vmstate_bs(NULL, &err); if (!bs) { error_report_err(err); return; @@ -952,7 +952,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, NULL) =3D=3D 0) { + if (bdrv_all_find_snapshot(sn_tab[i].name, NULL, 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 6839060622..5691cdc6cb 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -385,6 +385,36 @@ int bdrv_snapshot_load_tmp_by_id_or_name(BlockDriverSt= ate *bs, return ret; } =20 + +static int bdrv_all_get_snapshot_devices(strList *devices, + GList **all_bdrvs, + Error **errp) +{ + g_autoptr(GList) bdrvs =3D NULL; + + if (devices) { + while (devices) { + BlockDriverState *bs =3D bdrv_find_node(devices->value); + if (!bs) { + error_setg(errp, "No block device node '%s'", devices->val= ue); + return -1; + } + bdrvs =3D g_list_append(bdrvs, bs); + devices =3D devices->next; + } + } else { + BlockDriverState *bs; + BdrvNextIterator it; + for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { + bdrvs =3D g_list_append(bdrvs, bs); + } + } + + *all_bdrvs =3D g_steal_pointer(&bdrvs); + return 0; +} + + static bool bdrv_all_snapshots_includes_bs(BlockDriverState *bs) { if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) { @@ -400,43 +430,56 @@ 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(Error **errp) +bool bdrv_all_can_snapshot(strList *devices, Error **errp) { - BlockDriverState *bs; - BdrvNextIterator it; + g_autoptr(GList) bdrvs =3D NULL; + GList *iterbdrvs; =20 - for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { + if (bdrv_all_get_snapshot_devices(devices, &bdrvs, errp) < 0) { + return false; + } + + iterbdrvs =3D bdrvs; + while (iterbdrvs) { + BlockDriverState *bs =3D iterbdrvs->data; AioContext *ctx =3D bdrv_get_aio_context(bs); bool ok; =20 aio_context_acquire(ctx); - if (bdrv_all_snapshots_includes_bs(bs)) { + if (devices || bdrv_all_snapshots_includes_bs(bs)) { ok =3D bdrv_can_snapshot(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); return false; } + + iterbdrvs =3D iterbdrvs->next; } =20 return true; } =20 -int bdrv_all_delete_snapshot(const char *name, Error **errp) +int bdrv_all_delete_snapshot(const char *name, strList *devices, Error **e= rrp) { - BlockDriverState *bs; - BdrvNextIterator it; - QEMUSnapshotInfo sn1, *snapshot =3D &sn1; + g_autoptr(GList) bdrvs =3D NULL; + GList *iterbdrvs; =20 - for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { + if (bdrv_all_get_snapshot_devices(devices, &bdrvs, errp) < 0) { + return -1; + } + + iterbdrvs =3D bdrvs; + while (iterbdrvs) { + BlockDriverState *bs =3D iterbdrvs->data; AioContext *ctx =3D bdrv_get_aio_context(bs); - int ret; + QEMUSnapshotInfo sn1, *snapshot =3D &sn1; + int ret =3D 0; =20 aio_context_acquire(ctx); - if (bdrv_all_snapshots_includes_bs(bs) && + if ((devices || bdrv_all_snapshots_includes_bs(bs)) && bdrv_snapshot_find(bs, snapshot, name) >=3D 0) { ret =3D bdrv_snapshot_delete(bs, snapshot->id_str, @@ -446,61 +489,76 @@ int bdrv_all_delete_snapshot(const char *name, Error = **errp) 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); return -1; } + + iterbdrvs =3D iterbdrvs->next; } =20 return 0; } =20 =20 -int bdrv_all_goto_snapshot(const char *name, Error **errp) +int bdrv_all_goto_snapshot(const char *name, strList *devices, Error **err= p) { - BlockDriverState *bs; - BdrvNextIterator it; + g_autoptr(GList) bdrvs =3D NULL; + GList *iterbdrvs; =20 - for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { + if (bdrv_all_get_snapshot_devices(devices, &bdrvs, errp) < 0) { + return -1; + } + + iterbdrvs =3D bdrvs; + while (iterbdrvs) { + BlockDriverState *bs =3D iterbdrvs->data; AioContext *ctx =3D bdrv_get_aio_context(bs); - int ret; + int ret =3D 0; =20 aio_context_acquire(ctx); - if (bdrv_all_snapshots_includes_bs(bs)) { + if (devices || bdrv_all_snapshots_includes_bs(bs)) { ret =3D bdrv_snapshot_goto(bs, name, errp); } 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); return -1; } + + iterbdrvs =3D iterbdrvs->next; } =20 return 0; } =20 -int bdrv_all_find_snapshot(const char *name, Error **errp) +int bdrv_all_find_snapshot(const char *name, strList *devices, Error **err= p) { - QEMUSnapshotInfo sn; - BlockDriverState *bs; - BdrvNextIterator it; + g_autoptr(GList) bdrvs =3D NULL; + GList *iterbdrvs; =20 - for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { + if (bdrv_all_get_snapshot_devices(devices, &bdrvs, errp) < 0) { + return -1; + } + + iterbdrvs =3D bdrvs; + while (iterbdrvs) { + BlockDriverState *bs =3D iterbdrvs->data; AioContext *ctx =3D bdrv_get_aio_context(bs); - int ret; + QEMUSnapshotInfo sn; + int ret =3D 0; =20 aio_context_acquire(ctx); - if (bdrv_all_snapshots_includes_bs(bs)) { + if (devices || bdrv_all_snapshots_includes_bs(bs)) { ret =3D bdrv_snapshot_find(bs, &sn, name); } aio_context_release(ctx); 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); return -1; } + + iterbdrvs =3D iterbdrvs->next; } =20 return 0; @@ -509,20 +567,27 @@ 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, + strList *devices, Error **errp) { - BlockDriverState *bs; - BdrvNextIterator it; + g_autoptr(GList) bdrvs =3D NULL; + GList *iterbdrvs; =20 - for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { + if (bdrv_all_get_snapshot_devices(devices, &bdrvs, errp) < 0) { + return -1; + } + + iterbdrvs =3D bdrvs; + while (iterbdrvs) { + BlockDriverState *bs =3D iterbdrvs->data; AioContext *ctx =3D bdrv_get_aio_context(bs); - int ret; + int ret =3D 0; =20 aio_context_acquire(ctx); if (bs =3D=3D vm_state_bs) { sn->vm_state_size =3D vm_state_size; ret =3D bdrv_snapshot_create(bs, sn); - } else if (bdrv_all_snapshots_includes_bs(bs)) { + } else if (devices || bdrv_all_snapshots_includes_bs(bs)) { sn->vm_state_size =3D 0; ret =3D bdrv_snapshot_create(bs, sn); } @@ -530,34 +595,42 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn, 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); return -1; } + + iterbdrvs =3D iterbdrvs->next; } =20 return 0; } =20 -BlockDriverState *bdrv_all_find_vmstate_bs(Error **errp) +BlockDriverState *bdrv_all_find_vmstate_bs(strList *devices, Error **errp) { - BlockDriverState *bs; - BdrvNextIterator it; + g_autoptr(GList) bdrvs =3D NULL; + GList *iterbdrvs; + + if (bdrv_all_get_snapshot_devices(devices, &bdrvs, errp) < 0) { + return NULL; + } =20 - for (bs =3D bdrv_first(&it); bs; bs =3D bdrv_next(&it)) { + iterbdrvs =3D bdrvs; + while (iterbdrvs) { + BlockDriverState *bs =3D iterbdrvs->data; AioContext *ctx =3D bdrv_get_aio_context(bs); - bool found; + bool found =3D false; =20 aio_context_acquire(ctx); - found =3D bdrv_all_snapshots_includes_bs(bs) && bdrv_can_snapshot(= bs); + found =3D (devices || bdrv_all_snapshots_includes_bs(bs)) && + bdrv_can_snapshot(bs); aio_context_release(ctx); =20 if (found) { - bdrv_next_cleanup(&it); - break; + return bs; } + + iterbdrvs =3D iterbdrvs->next; } - if (!bs) { - error_setg(errp, "No block device supports snapshots"); - } - return bs; + + error_setg(errp, "No block device supports snapshots"); + return NULL; } diff --git a/include/block/snapshot.h b/include/block/snapshot.h index ba1528eee0..1c5b0705a9 100644 --- a/include/block/snapshot.h +++ b/include/block/snapshot.h @@ -25,7 +25,7 @@ #ifndef SNAPSHOT_H #define SNAPSHOT_H =20 - +#include "qapi/qapi-builtin-types.h" =20 #define SNAPSHOT_OPT_BASE "snapshot." #define SNAPSHOT_OPT_ID "snapshot.id" @@ -76,15 +76,16 @@ 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(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); +bool bdrv_all_can_snapshot(strList *devices, Error **errp); +int bdrv_all_delete_snapshot(const char *name, strList *devices, Error **e= rrp); +int bdrv_all_goto_snapshot(const char *name, strList *devices, Error **err= p); +int bdrv_all_find_snapshot(const char *name, strList *devices, Error **err= p); int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn, BlockDriverState *vm_state_bs, uint64_t vm_state_size, + strList *devices, Error **errp); =20 -BlockDriverState *bdrv_all_find_vmstate_bs(Error **errp); +BlockDriverState *bdrv_all_find_vmstate_bs(strList *devices, Error **errp); =20 #endif diff --git a/migration/savevm.c b/migration/savevm.c index 711137bcbe..ae56de1a85 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2680,18 +2680,18 @@ int save_snapshot(const char *name, Error **errp) return ret; } =20 - if (!bdrv_all_can_snapshot(errp)) { + if (!bdrv_all_can_snapshot(NULL, errp)) { return ret; } =20 /* Delete old snapshots of the same name */ if (name) { - if (bdrv_all_delete_snapshot(name, errp) < 0) { + if (bdrv_all_delete_snapshot(name, NULL, errp) < 0) { return ret; } } =20 - bs =3D bdrv_all_find_vmstate_bs(errp); + bs =3D bdrv_all_find_vmstate_bs(NULL, errp); if (bs =3D=3D NULL) { return ret; } @@ -2757,7 +2757,7 @@ 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, errp); + ret =3D bdrv_all_create_snapshot(sn, bs, vm_state_size, NULL, errp); if (ret < 0) { goto the_end; } @@ -2873,15 +2873,15 @@ int load_snapshot(const char *name, Error **errp) return -1; } =20 - if (!bdrv_all_can_snapshot(errp)) { + if (!bdrv_all_can_snapshot(NULL, errp)) { return -1; } - ret =3D bdrv_all_find_snapshot(name, errp); + ret =3D bdrv_all_find_snapshot(name, NULL, errp); if (ret < 0) { return -1; } =20 - bs_vm_state =3D bdrv_all_find_vmstate_bs(errp); + bs_vm_state =3D bdrv_all_find_vmstate_bs(NULL, errp); if (!bs_vm_state) { return -1; } @@ -2902,7 +2902,7 @@ 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, errp); + ret =3D bdrv_all_goto_snapshot(name, NULL, errp); if (ret < 0) { goto err_drain; } diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 9bb50b9abf..51f624b5ea 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1140,7 +1140,7 @@ void hmp_delvm(Monitor *mon, const QDict *qdict) Error *err =3D NULL; const char *name =3D qdict_get_str(qdict, "name"); =20 - bdrv_all_delete_snapshot(name, &err); + bdrv_all_delete_snapshot(name, NULL, &err); hmp_handle_error(mon, err); } =20 --=20 2.26.2 From nobody Sun May 19 03:38:19 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1598527297; cv=none; d=zohomail.com; s=zohoarc; b=OHHGL8ICc/0yHN0wfJufhuTzZQ4nGhGsHg4XCOIAnDGuK87BsWeeZyaOew04Jla4pdZIxcRhbhNyGO3xgxIDrlL6cGJIGO0AxDN3PK56UbJULlEOzj6W5+P55RGw/JV/xB0i2AMqfbRSg4bAqw8QcDHnyPqmUIzVHhn/itQ0wtQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1598527297; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=TIaPxJ3W4oIpuEkSXLVUr3gtmgczeyz6Ejvy/R1YbP4=; b=eLNFWFL1U4/vM1WmFvWHpEdEjaVZfsahcdhuDM4L21GeD1KOqHYVZLiJGNbp18Fl4hTh0w2uft8E1LWaOIdzs8fxeAu3hlLcpHfnaYtZH7V0T9E1ofbJHaWBRVT7Mtx8om9aAaQbvwyJIABkG9YaCQAb2KvV9lKOD4VxMBDjEnM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 159852729726339.780447486121034; Thu, 27 Aug 2020 04:21:37 -0700 (PDT) Received: from localhost ([::1]:43762 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kBFyJ-0002fo-QX for importer@patchew.org; Thu, 27 Aug 2020 07:21:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54440) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kBFte-0004za-M4 for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:46 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:48411 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kBFtb-0000qg-Q1 for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:46 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-445-0E1zL4s6PVWNgzvRGcgYig-1; Thu, 27 Aug 2020 07:16:39 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id EA75B185FD72; Thu, 27 Aug 2020 11:16:37 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.51]) by smtp.corp.redhat.com (Postfix) with ESMTP id 95A26757EC; Thu, 27 Aug 2020 11:16:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1598527002; 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=TIaPxJ3W4oIpuEkSXLVUr3gtmgczeyz6Ejvy/R1YbP4=; b=IEAIu/Sd0sRLlwYvQuktRIFi/vyrA2x0dmqKRVe30GwoW8KlD1lNRE8VPgPrFdMS0HCnoc V7W5wOn/JaoEdkYwDY5/nDFp3Mbyurtn5ZIR9iAMA9byt85gBUrImjQHcDrHYJXiwteHPM yerQ1I0qlLJ9L9G6Llu5O2WrHZFQHmM= X-MC-Unique: 0E1zL4s6PVWNgzvRGcgYig-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH v3 5/7] block: allow specifying name of block device for vmstate storage Date: Thu, 27 Aug 2020 12:16:04 +0100 Message-Id: <20200827111606.1408275-6-berrange@redhat.com> In-Reply-To: <20200827111606.1408275-1-berrange@redhat.com> References: <20200827111606.1408275-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=berrange@redhat.com X-Mimecast-Spam-Score: 0.003 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=207.211.31.120; envelope-from=berrange@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/27 02:56:52 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.959, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Peter Krempa , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , "Denis V. Lunev" , qemu-block@nongnu.org, Juan Quintela , John Snow , Markus Armbruster , "Dr. David Alan Gilbert" , Pavel Dovgalyuk , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Currently the vmstate will be stored in the first block device that supports snapshots. Historically this would have usually been the root device, but with UEFI it might be the variable store. There needs to be a way to override the choice of block device to store the state in. Signed-off-by: Daniel P. Berrang=C3=A9 --- block/monitor/block-hmp-cmds.c | 2 +- block/snapshot.c | 17 +++++++++++++++-- include/block/snapshot.h | 4 +++- migration/savevm.c | 4 ++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c index db76c43cc2..81d1b52262 100644 --- a/block/monitor/block-hmp-cmds.c +++ b/block/monitor/block-hmp-cmds.c @@ -900,7 +900,7 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdic= t) SnapshotEntry *snapshot_entry; Error *err =3D NULL; =20 - bs =3D bdrv_all_find_vmstate_bs(NULL, &err); + bs =3D bdrv_all_find_vmstate_bs(NULL, NULL, &err); if (!bs) { error_report_err(err); return; diff --git a/block/snapshot.c b/block/snapshot.c index 5691cdc6cb..1f7b9a5146 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -604,7 +604,9 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn, return 0; } =20 -BlockDriverState *bdrv_all_find_vmstate_bs(strList *devices, Error **errp) +BlockDriverState *bdrv_all_find_vmstate_bs(const char *vmstate_bs, + strList *devices, + Error **errp) { g_autoptr(GList) bdrvs =3D NULL; GList *iterbdrvs; @@ -624,6 +626,13 @@ BlockDriverState *bdrv_all_find_vmstate_bs(strList *de= vices, Error **errp) bdrv_can_snapshot(bs); aio_context_release(ctx); =20 + if (vmstate_bs && g_str_equal(vmstate_bs, + bdrv_get_node_name(bs))) { + error_setg(errp, "block device '%s' does not support snapshots= ", + vmstate_bs); + return NULL; + } + if (found) { return bs; } @@ -631,6 +640,10 @@ BlockDriverState *bdrv_all_find_vmstate_bs(strList *de= vices, Error **errp) iterbdrvs =3D iterbdrvs->next; } =20 - error_setg(errp, "No block device supports snapshots"); + if (vmstate_bs) { + error_setg(errp, "Block device '%s' does not exist", vmstate_bs); + } else { + error_setg(errp, "No block device supports snapshots"); + } return NULL; } diff --git a/include/block/snapshot.h b/include/block/snapshot.h index 1c5b0705a9..05550e5da1 100644 --- a/include/block/snapshot.h +++ b/include/block/snapshot.h @@ -86,6 +86,8 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn, strList *devices, Error **errp); =20 -BlockDriverState *bdrv_all_find_vmstate_bs(strList *devices, Error **errp); +BlockDriverState *bdrv_all_find_vmstate_bs(const char *vmstate_bs, + strList *devices, + Error **errp); =20 #endif diff --git a/migration/savevm.c b/migration/savevm.c index ae56de1a85..4a52704132 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -2691,7 +2691,7 @@ int save_snapshot(const char *name, Error **errp) } } =20 - bs =3D bdrv_all_find_vmstate_bs(NULL, errp); + bs =3D bdrv_all_find_vmstate_bs(NULL, NULL, errp); if (bs =3D=3D NULL) { return ret; } @@ -2881,7 +2881,7 @@ int load_snapshot(const char *name, Error **errp) return -1; } =20 - bs_vm_state =3D bdrv_all_find_vmstate_bs(NULL, errp); + bs_vm_state =3D bdrv_all_find_vmstate_bs(NULL, NULL, errp); if (!bs_vm_state) { return -1; } --=20 2.26.2 From nobody Sun May 19 03:38:19 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1598527098; cv=none; d=zohomail.com; s=zohoarc; b=nv7KGQFN2P0/kRnuQRneybvzQq3uAaJyTBNPgOLk+IFghw7KEkw93d0hfaNiJ+qEaXu0dOkbbcgqaAjsaeBji454Z11jw55N1hmP/slPyYKvxaPWnHQtuFgWzAQ55OXNpZKZ3PW8LxED5ZPcJi36JNYvyEcrDFbCRCLEnR/wEy8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1598527098; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=6MTm9GZUU94JUI9HFeqfI2EzkRE/Yym1IGbvVhzy8w4=; b=U5Z5jFzN0JUBiSCDd0YMnFJ4Vpm0E1jSnt9ZNQliWIuBcKKeZtHmcAfHJHLe5OrZ0FOsh2SrhBj5V5xPdyXDYSc9O5myQqJ8teKMSv8uOcF1k8AwfKthOcW8S9QXBDEMAKVK4z+X9TfMnBG9LbJG00uTwBfLUjMpdh1ftb/Foy4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1598527098468941.6390737471468; Thu, 27 Aug 2020 04:18:18 -0700 (PDT) Received: from localhost ([::1]:35214 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kBFv7-00078w-7t for importer@patchew.org; Thu, 27 Aug 2020 07:18:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54466) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kBFti-00056A-7P for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:50 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:59727) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kBFtg-0000rU-Bi for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:49 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-29-rScVcUjHNaWZOyj3V8CQGA-1; Thu, 27 Aug 2020 07:16:45 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8A8FE801AEB; Thu, 27 Aug 2020 11:16:44 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.51]) by smtp.corp.redhat.com (Postfix) with ESMTP id 62FF578370; Thu, 27 Aug 2020 11:16:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1598527007; 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=6MTm9GZUU94JUI9HFeqfI2EzkRE/Yym1IGbvVhzy8w4=; b=RYjPEzPw49f4tcDFlEX9SsT8ZtiUsohEBSiDlSDzRG9/njSOfwmMR+dEAfPMKaUOSB9SMB bHFSAMt4nP/i7Ho4GYVR52o2Te0A74QanFVxf0WxOdA+d3x3dVuFZdUZSnwzOSMR6DRpyt tuZYqEFmt0kYnEl/XyBxS8a/sPzMdiE= X-MC-Unique: rScVcUjHNaWZOyj3V8CQGA-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH v3 6/7] iotests: add support for capturing and matching QMP events Date: Thu, 27 Aug 2020 12:16:05 +0100 Message-Id: <20200827111606.1408275-7-berrange@redhat.com> In-Reply-To: <20200827111606.1408275-1-berrange@redhat.com> References: <20200827111606.1408275-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=berrange@redhat.com X-Mimecast-Spam-Score: 0.002 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/27 02:10:07 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.959, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Peter Krempa , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , "Denis V. Lunev" , qemu-block@nongnu.org, Juan Quintela , John Snow , Markus Armbruster , "Dr. David Alan Gilbert" , Pavel Dovgalyuk , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) When using the _launch_qemu and _send_qemu_cmd functions from common.qemu, any QMP events get mixed in with the output from the commands and responses. This makes it difficult to write a test case as the ordering of events in the output is not stable. This introduces a variable 'capture_events' which can be set to a list of event names. Any events listed in this variable will not be printed, instead collected in the $QEMU_EVENTS environment variable. A new '_wait_event' function can be invoked to collect events at a fixed point in time. The function will first pull events cached in $QEMU_EVENTS variable, and if none are found, will then read more from QMP. Signed-off-by: Daniel P. Berrang=C3=A9 --- tests/qemu-iotests/common.qemu | 107 ++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) diff --git a/tests/qemu-iotests/common.qemu b/tests/qemu-iotests/common.qemu index de680cf1c7..87d7a54001 100644 --- a/tests/qemu-iotests/common.qemu +++ b/tests/qemu-iotests/common.qemu @@ -53,6 +53,15 @@ _in_fd=3D4 # If $mismatch_only is set, only non-matching responses will # be echoed. # +# If $capture_events is non-empty, then any QMP event names it lists +# will not be echoed out, but instead collected in the $QEMU_EVENTS +# variable. The _wait_event function can later be used to received +# the cached events. +# +# If $only_capture_events is set to anything but an empty string, +# when an error will be raised if a QMP message is seen which is +# not an event listed in $capture_events. +# # If $success_or_failure is set, the meaning of the arguments is # changed as follows: # $2: A string to search for in the response; if found, this indicates @@ -78,6 +87,32 @@ _timed_wait_for() QEMU_STATUS[$h]=3D0 while IFS=3D read -t ${QEMU_COMM_TIMEOUT} resp <&${QEMU_OUT[$h]} do + if [ -n "$capture_events" ]; then + capture=3D0 + local evname + for evname in $capture_events + do + grep -q "\"event\": \"${evname}\"" < <(echo "${resp}") + if [ $? -eq 0 ]; then + capture=3D1 + fi + done + if [ $capture =3D 1 ]; + then + ev=3D$(echo "${resp}" | tr -d '\r' | tr % .) + QEMU_EVENTS=3D"${QEMU_EVENTS:+${QEMU_EVENTS}%}${ev}" + if [ -n "$only_capture_events" ]; then + return + else + continue + fi + fi + fi + if [ -n "$only_capture_events" ]; then + echo "Only expected $capture_events but got ${resp}" + exit 1 + fi + if [ -z "${silent}" ] && [ -z "${mismatch_only}" ]; then echo "${resp}" | _filter_testdir | _filter_qemu \ | _filter_qemu_io | _filter_qmp | _filter_hmp @@ -177,12 +212,82 @@ _send_qemu_cmd() let count--; done if [ ${QEMU_STATUS[$h]} -ne 0 ] && [ -z "${qemu_error_no_exit}" ]; then - echo "Timeout waiting for ${1} on handle ${h}" + echo "Timeout waiting for command ${1} response on handle ${h}" exit 1 #Timeout means the test failed fi } =20 =20 +# Check event cache for a named QMP event +# +# Input parameters: +# $1: Name of the QMP event to check for +# +# Checks if the named QMP event that was previously captured +# into $QEMU_EVENTS. When matched, the QMP event will be echoed +# and the $matched variable set to 1. +# +# _wait_event is more suitable for test usage in most cases +_check_cached_events() +{ + local evname=3D${1} + + local match=3D"\"event\": \"$evname\"" + + matched=3D0 + if [ -n "$QEMU_EVENTS" ]; then + CURRENT_QEMU_EVENTS=3D$QEMU_EVENTS + QEMU_EVENTS=3D + old_IFS=3D$IFS + IFS=3D"%" + for ev in $CURRENT_QEMU_EVENTS + do + grep -q "$match" < <(echo "${ev}") + if [ $? -eq 0 -a $matched =3D 0 ]; then + echo "${ev}" | _filter_testdir | _filter_qemu \ + | _filter_qemu_io | _filter_qmp | _filter_hmp + matched=3D1 + else + QEMU_EVENTS=3D"${QEMU_EVENTS:+${QEMU_EVENTS}%}${ev}" + fi + done + IFS=3D$old_IFS + fi +} + +# Wait for a named QMP event +# +# Input parameters: +# $1: QEMU handle to use +# $2: Name of the QMP event to wait for +# +# Checks if the named QMP event that was previously captured +# into $QEMU_EVENTS. If none are present, then waits for the +# event to arrive on the QMP channel. When matched, the QMP +# event will be echoed +_wait_event() +{ + local h=3D${1} + local evname=3D${2} + + while true + do + _check_cached_events $evname + + if [ $matched =3D 1 ]; + then + return + fi + + only_capture_events=3D1 qemu_error_no_exit=3D1 _timed_wait_for ${h} + + if [ ${QEMU_STATUS[$h]} -ne 0 ] ; then + echo "Timeout waiting for event ${evname} on handle ${h}" + exit 1 #Timeout means the test failed + fi + done +} + # Launch a QEMU process. # # Input parameters: --=20 2.26.2 From nobody Sun May 19 03:38:19 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1598527365; cv=none; d=zohomail.com; s=zohoarc; b=QVoQzdVakGyslQk3HJRYDbOJvyZp/UBRy+HxPFQU0TMuhmWWQgrjlnaIdIUcp3nV44eyLHzxadO/AcUdZoywZZWIH1NZvDq5vm1l5QObt/p2qysNqCQv1XfDp0j6lLmB5oPZuaTBGjFbUQSuQfvZ9U1CbrZrw0VngowqkHLIIqM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1598527365; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=VFmAqgi0oDnUbE1d/mBrknkR9Vzfje8F61ZX8h/v9RU=; b=hARvv7q7ACtXYLYZhsVm7QbZrM4TrbohLpH6w0BF0CZerrfNbHUYcsMbiOuRI01a+8JeJG+0bKI9/cWY2jX2ZO+OuBOwBgo0GKEykjCbnViV848H8TZsdRd52mKD26UmLjEfV5KmnnrGW5hYd5RshA8sNXPVIZqF0WRGT/EK/Pg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 159852736502128.82690595781969; Thu, 27 Aug 2020 04:22:45 -0700 (PDT) Received: from localhost ([::1]:46072 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kBFzP-0003dX-3v for importer@patchew.org; Thu, 27 Aug 2020 07:22:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54578) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kBFtr-0005Mb-Et for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:59 -0400 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:41741 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kBFtl-0000sG-H4 for qemu-devel@nongnu.org; Thu, 27 Aug 2020 07:16:59 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-470-ylmg2vPtMIGFOZS9Uq1thQ-1; Thu, 27 Aug 2020 07:16:49 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 6844E420E7; Thu, 27 Aug 2020 11:16:48 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.36.110.51]) by smtp.corp.redhat.com (Postfix) with ESMTP id DDF637049B; Thu, 27 Aug 2020 11:16:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1598527012; 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=VFmAqgi0oDnUbE1d/mBrknkR9Vzfje8F61ZX8h/v9RU=; b=X7gr8FnVMzJDwkW2UzZbDFEjYAbgYDrTSGUDLofJ6kGTac9E6AamgWHGIXC+I8HvgDsFj0 hWgJ/Z8K96nEp8QS0H2esUfLY705zRxmeYwhgXLtJgSR6+Xirmi/EUkYtNcLan5kBMXS1/ JNd3Fy81RhF0+YmfX27kNWJJfQrkykQ= X-MC-Unique: ylmg2vPtMIGFOZS9Uq1thQ-1 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH v3 7/7] migration: introduce snapshot-{save, load, delete} QMP commands Date: Thu, 27 Aug 2020 12:16:06 +0100 Message-Id: <20200827111606.1408275-8-berrange@redhat.com> In-Reply-To: <20200827111606.1408275-1-berrange@redhat.com> References: <20200827111606.1408275-1-berrange@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=berrange@redhat.com X-Mimecast-Spam-Score: 0.004 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.139.110.61; envelope-from=berrange@redhat.com; helo=us-smtp-delivery-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/27 07:16:16 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.959, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Peter Krempa , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , "Denis V. Lunev" , qemu-block@nongnu.org, Juan Quintela , John Snow , Markus Armbruster , "Dr. David Alan Gilbert" , Pavel Dovgalyuk , Paolo Bonzini , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) savevm, loadvm and delvm are some of the few HMP commands that have never been converted to use QMP. The primary reason for this lack of conversion is that they block execution of the thread for as long as they run. Despite this downside, however, libvirt and applications using libvirt have used these commands for as long as QMP has existed, via the "human-monitor-command" passthrough command. IOW, while it is clearly desirable to be able to fix the blocking problem, this is not an immediate obstacle to real world usage. Meanwhile there is a need for other features which involve adding new parameters to the commands. This is possible with HMP passthrough, but it provides no reliable way for apps to introspect features, so using QAPI modelling is highly desirable. This patch thus introduces new snapshot-{load,save,delete} commands to QMP that are intended to replace the old HMP counterparts. The new commands are given different names, because they will be using the new QEMU job framework and thus will have diverging behaviour from the HMP originals. It would thus be misleading to keep the same name. While this design uses the generic job framework, the current impl is still blocking. The intention that the blocking problem is fixed later. None the less applications using these new commands should assume that they are asynchronous and thus wait for the job status change event to indicate completion. Signed-off-by: Daniel P. Berrang=C3=A9 --- include/migration/snapshot.h | 10 +- migration/savevm.c | 220 ++++++++++++++++++++- monitor/hmp-cmds.c | 4 +- qapi/job.json | 9 +- qapi/migration.json | 135 +++++++++++++ replay/replay-snapshot.c | 4 +- softmmu/vl.c | 2 +- tests/qemu-iotests/310 | 255 ++++++++++++++++++++++++ tests/qemu-iotests/310.out | 369 +++++++++++++++++++++++++++++++++++ tests/qemu-iotests/group | 1 + 10 files changed, 991 insertions(+), 18 deletions(-) create mode 100755 tests/qemu-iotests/310 create mode 100644 tests/qemu-iotests/310.out diff --git a/include/migration/snapshot.h b/include/migration/snapshot.h index c85b6ec75b..f2ed9d1e43 100644 --- a/include/migration/snapshot.h +++ b/include/migration/snapshot.h @@ -15,7 +15,13 @@ #ifndef QEMU_MIGRATION_SNAPSHOT_H #define QEMU_MIGRATION_SNAPSHOT_H =20 -int save_snapshot(const char *name, Error **errp); -int load_snapshot(const char *name, Error **errp); +#include "qapi/qapi-builtin-types.h" + +int save_snapshot(const char *name, + const char *vmstate, strList *devices, + Error **errp); +int load_snapshot(const char *name, + const char *vmstate, strList *devices, + Error **errp); =20 #endif diff --git a/migration/savevm.c b/migration/savevm.c index 4a52704132..c5d8131d82 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -43,6 +43,8 @@ #include "qapi/error.h" #include "qapi/qapi-commands-migration.h" #include "qapi/qapi-commands-misc.h" +#include "qapi/clone-visitor.h" +#include "qapi/qapi-builtin-visit.h" #include "qapi/qmp/qerror.h" #include "qemu/error-report.h" #include "sysemu/cpus.h" @@ -2658,7 +2660,8 @@ int qemu_load_device_state(QEMUFile *f) return 0; } =20 -int save_snapshot(const char *name, Error **errp) +int save_snapshot(const char *name, const char *vmstate, + strList *devices, Error **errp) { BlockDriverState *bs; QEMUSnapshotInfo sn1, *sn =3D &sn1, old_sn1, *old_sn =3D &old_sn1; @@ -2680,18 +2683,18 @@ int save_snapshot(const char *name, Error **errp) return ret; } =20 - if (!bdrv_all_can_snapshot(NULL, errp)) { + if (!bdrv_all_can_snapshot(devices, errp)) { return ret; } =20 /* Delete old snapshots of the same name */ if (name) { - if (bdrv_all_delete_snapshot(name, NULL, errp) < 0) { + if (bdrv_all_delete_snapshot(name, devices, errp) < 0) { return ret; } } =20 - bs =3D bdrv_all_find_vmstate_bs(NULL, NULL, errp); + bs =3D bdrv_all_find_vmstate_bs(vmstate, devices, errp); if (bs =3D=3D NULL) { return ret; } @@ -2757,7 +2760,7 @@ 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, NULL, errp); + ret =3D bdrv_all_create_snapshot(sn, bs, vm_state_size, devices, errp); if (ret < 0) { goto the_end; } @@ -2858,7 +2861,8 @@ void qmp_xen_load_devices_state(const char *filename,= Error **errp) migration_incoming_state_destroy(); } =20 -int load_snapshot(const char *name, Error **errp) +int load_snapshot(const char *name, const char *vmstate, + strList *devices, Error **errp) { BlockDriverState *bs_vm_state; QEMUSnapshotInfo sn; @@ -2873,15 +2877,15 @@ int load_snapshot(const char *name, Error **errp) return -1; } =20 - if (!bdrv_all_can_snapshot(NULL, errp)) { + if (!bdrv_all_can_snapshot(devices, errp)) { return -1; } - ret =3D bdrv_all_find_snapshot(name, NULL, errp); + ret =3D bdrv_all_find_snapshot(name, devices, errp); if (ret < 0) { return -1; } =20 - bs_vm_state =3D bdrv_all_find_vmstate_bs(NULL, NULL, errp); + bs_vm_state =3D bdrv_all_find_vmstate_bs(vmstate, devices, errp); if (!bs_vm_state) { return -1; } @@ -2902,7 +2906,7 @@ 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, NULL, errp); + ret =3D bdrv_all_goto_snapshot(name, devices, errp); if (ret < 0) { goto err_drain; } @@ -2936,6 +2940,19 @@ err_drain: return -1; } =20 +static int delete_snapshot(const char *name, strList *devices, Error **err= p) +{ + if (!bdrv_all_can_snapshot(devices, errp)) { + return -1; + } + + if (bdrv_all_delete_snapshot(name, devices, errp) < 0) { + return -1; + } + + return 0; +} + void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev) { qemu_ram_set_idstr(mr->ram_block, @@ -2963,3 +2980,186 @@ bool vmstate_check_only_migratable(const VMStateDes= cription *vmsd) =20 return !(vmsd && vmsd->unmigratable); } + +typedef struct SnapshotJob { + Job common; + char *tag; + char *vmstate; + strList *devices; + Coroutine *co; + Error **errp; + int ret; +} SnapshotJob; + +static void qmp_snapshot_job_free(SnapshotJob *s) +{ + g_free(s->tag); + g_free(s->vmstate); + qapi_free_strList(s->devices); +} + + +static void snapshot_load_job_bh(void *opaque) +{ + Job *job =3D opaque; + SnapshotJob *s =3D container_of(job, SnapshotJob, common); + int saved_vm_running; + + job_progress_set_remaining(&s->common, 1); + + saved_vm_running =3D runstate_is_running(); + vm_stop(RUN_STATE_RESTORE_VM); + + s->ret =3D load_snapshot(s->tag, s->vmstate, s->devices, s->errp); + if (s->ret =3D=3D 0 && saved_vm_running) { + vm_start(); + } + + job_progress_update(&s->common, 1); + + qmp_snapshot_job_free(s); + aio_co_wake(s->co); +} + +static void snapshot_save_job_bh(void *opaque) +{ + Job *job =3D opaque; + SnapshotJob *s =3D container_of(job, SnapshotJob, common); + + job_progress_set_remaining(&s->common, 1); + s->ret =3D save_snapshot(s->tag, s->vmstate, s->devices, s->errp); + job_progress_update(&s->common, 1); + + qmp_snapshot_job_free(s); + aio_co_wake(s->co); +} + +static void snapshot_delete_job_bh(void *opaque) +{ + Job *job =3D opaque; + SnapshotJob *s =3D container_of(job, SnapshotJob, common); + + job_progress_set_remaining(&s->common, 1); + s->ret =3D delete_snapshot(s->tag, s->devices, s->errp); + job_progress_update(&s->common, 1); + + qmp_snapshot_job_free(s); + aio_co_wake(s->co); +} + +static int coroutine_fn snapshot_save_job_run(Job *job, Error **errp) +{ + SnapshotJob *s =3D container_of(job, SnapshotJob, common); + s->errp =3D errp; + s->co =3D qemu_coroutine_self(); + aio_bh_schedule_oneshot(qemu_get_aio_context(), + snapshot_save_job_bh, job); + qemu_coroutine_yield(); + return s->ret; +} + +static int coroutine_fn snapshot_load_job_run(Job *job, Error **errp) +{ + SnapshotJob *s =3D container_of(job, SnapshotJob, common); + s->errp =3D errp; + s->co =3D qemu_coroutine_self(); + aio_bh_schedule_oneshot(qemu_get_aio_context(), + snapshot_load_job_bh, job); + qemu_coroutine_yield(); + return s->ret; +} + +static int coroutine_fn snapshot_delete_job_run(Job *job, Error **errp) +{ + SnapshotJob *s =3D container_of(job, SnapshotJob, common); + s->errp =3D errp; + s->co =3D qemu_coroutine_self(); + aio_bh_schedule_oneshot(qemu_get_aio_context(), + snapshot_delete_job_bh, job); + qemu_coroutine_yield(); + return s->ret; +} + + +static const JobDriver snapshot_load_job_driver =3D { + .instance_size =3D sizeof(SnapshotJob), + .job_type =3D JOB_TYPE_SNAPSHOT_LOAD, + .run =3D snapshot_load_job_run, +}; + +static const JobDriver snapshot_save_job_driver =3D { + .instance_size =3D sizeof(SnapshotJob), + .job_type =3D JOB_TYPE_SNAPSHOT_SAVE, + .run =3D snapshot_save_job_run, +}; + +static const JobDriver snapshot_delete_job_driver =3D { + .instance_size =3D sizeof(SnapshotJob), + .job_type =3D JOB_TYPE_SNAPSHOT_DELETE, + .run =3D snapshot_delete_job_run, +}; + + +void qmp_snapshot_save(const char *job_id, + const char *tag, + bool has_vmstate, const char *vmstate, + bool has_devices, strList *devices, + Error **errp) +{ + SnapshotJob *s; + + s =3D job_create(job_id, &snapshot_save_job_driver, NULL, + qemu_get_aio_context(), JOB_MANUAL_DISMISS, + NULL, NULL, errp); + if (!s) { + return; + } + + s->tag =3D g_strdup(tag); + s->vmstate =3D has_vmstate ? g_strdup(vmstate) : NULL; + s->devices =3D has_devices ? QAPI_CLONE(strList, devices) : NULL; + + job_start(&s->common); +} + +void qmp_snapshot_load(const char *job_id, + const char *tag, + bool has_vmstate, const char *vmstate, + bool has_devices, strList *devices, + Error **errp) +{ + SnapshotJob *s; + + s =3D job_create(job_id, &snapshot_load_job_driver, NULL, + qemu_get_aio_context(), JOB_MANUAL_DISMISS, + NULL, NULL, errp); + if (!s) { + return; + } + + s->tag =3D g_strdup(tag); + s->vmstate =3D has_vmstate ? g_strdup(vmstate) : NULL; + s->devices =3D has_devices ? QAPI_CLONE(strList, devices) : NULL; + + job_start(&s->common); +} + +void qmp_snapshot_delete(const char *job_id, + const char *tag, + bool has_devices, strList *devices, + Error **errp) +{ + SnapshotJob *s; + + s =3D job_create(job_id, &snapshot_delete_job_driver, NULL, + qemu_get_aio_context(), JOB_MANUAL_DISMISS, + NULL, NULL, errp); + if (!s) { + return; + } + + s->tag =3D g_strdup(tag); + s->devices =3D has_devices ? QAPI_CLONE(strList, devices) : NULL; + + job_start(&s->common); +} diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c index 51f624b5ea..2ac2c109db 100644 --- a/monitor/hmp-cmds.c +++ b/monitor/hmp-cmds.c @@ -1121,7 +1121,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, NULL, NULL, &err) =3D=3D 0 && saved_vm_running= ) { vm_start(); } hmp_handle_error(mon, err); @@ -1131,7 +1131,7 @@ void hmp_savevm(Monitor *mon, const QDict *qdict) { Error *err =3D NULL; =20 - save_snapshot(qdict_get_try_str(qdict, "name"), &err); + save_snapshot(qdict_get_try_str(qdict, "name"), NULL, NULL, &err); hmp_handle_error(mon, err); } =20 diff --git a/qapi/job.json b/qapi/job.json index 280c2f76f1..51bee470f0 100644 --- a/qapi/job.json +++ b/qapi/job.json @@ -22,10 +22,17 @@ # # @amend: image options amend job type, see "x-blockdev-amend" (since 5.1) # +# @snapshot-load: snapshot load job type, see "loadvm" (since 5.2) +# +# @snapshot-save: snapshot save job type, see "savevm" (since 5.2) +# +# @snapshot-delete: snapshot delete job type, see "delvm" (since 5.2) +# # Since: 1.7 ## { 'enum': 'JobType', - 'data': ['commit', 'stream', 'mirror', 'backup', 'create', 'amend'] } + 'data': ['commit', 'stream', 'mirror', 'backup', 'create', 'amend', + 'snapshot-load', 'snapshot-save', 'snapshot-delete'] } =20 ## # @JobStatus: diff --git a/qapi/migration.json b/qapi/migration.json index 5f6b06172c..d70f627b77 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -1720,3 +1720,138 @@ ## { 'event': 'UNPLUG_PRIMARY', 'data': { 'device-id': 'str' } } + +## +# @snapshot-save: +# +# Save a VM snapshot +# +# @job-id: identifier for the newly created job +# @tag: name of the snapshot to create. If it already +# exists it will be replaced. +# @devices: list of block device node names to save a snapshot to +# @vmstate: block device node name to save vmstate to +# +# Applications should not assume that the snapshot save is complete +# when this command returns. Completion is indicated by the job +# status. Clients can wait for the JOB_STATUS_CHANGE event. If the +# job aborts, errors can be obtained via the 'query-jobs' command, +# though. Note that at this time most vmstate procssing errors only +# get printed to stderr. This limitation will be fixed at a future +# date. +# +# Note that the VM CPUs will be paused during the time it takes to +# save the snapshot +# +# If @devices is not specified, or is an empty list, then the +# historical default logic for picking devices will be used. +# +# If @vmstate is not specified, then the first valid block +# device will be used for vmstate. +# +# Returns: nothing +# +# Example: +# +# -> { "execute": "snapshot-save", +# "data": { +# "job-id": "snapsave0", +# "tag": "my-snap", +# "vmstate": "disk0", +# "devices": ["disk0", "disk1"] +# } +# } +# <- { "return": { } } +# +# Since: 5.2 +## +{ 'command': 'snapshot-save', + 'data': { 'job-id': 'str', + 'tag': 'str', + '*vmstate': 'str', + '*devices': ['str'] } } + +## +# @snapshot-load: +# +# Load a VM snapshot +# +# @job-id: identifier for the newly created job +# @tag: name of the snapshot to load. +# @devices: list of block device node names to load a snapshot from +# @vmstate: block device node name to load vmstate from +# +# Applications should not assume that the snapshot load is complete +# when this command returns. Completion is indicated by the job +# status. Clients can wait for the JOB_STATUS_CHANGE event. If the +# job aborts, errors can be obtained via the 'query-jobs' command, +# though. Note that at this time most vmstate procssing errors only +# get printed to stderr. This limitation will be fixed at a future +# date. +# +# If @devices is not specified, or is an empty list, then the +# historical default logic for picking devices will be used. +# +# If @vmstate is not specified, then the first valid block +# device will be used for vmstate. +# +# Returns: nothing +# +# Example: +# +# -> { "execute": "snapshot-load", +# "data": { +# "job-id": "snapload0", +# "tag": "my-snap", +# "vmstate": "disk0", +# "devices": ["disk0", "disk1"] +# } +# } +# <- { "return": { } } +# +# Since: 5.2 +## +{ 'command': 'snapshot-load', + 'data': { 'job-id': 'str', + 'tag': 'str', + '*vmstate': 'str', + '*devices': ['str'] } } + +## +# @snapshot-delete: +# +# Delete a VM snapshot +# +# @job-id: identifier for the newly created job +# @tag: name of the snapshot to delete. +# @devices: list of block device node names to delete a snapshot from +# +# Applications should not assume that the snapshot load is complete +# when this command returns. Completion is indicated by the job +# status. Clients can wait for the JOB_STATUS_CHANGE event. +# +# Note that the VM CPUs will be paused during the time it takes to +# delete the snapshot +# +# If @devices is not specified, or is an empty list, then the +# historical default logic for picking devices will be used. +# +# Returns: nothing +# +# Example: +# +# -> { "execute": "snapshot-delete", +# "data": { +# "job-id": "snapdelete0", +# "tag": "my-snap", +# "devices": ["disk0", "disk1"] +# } +# } +# <- { "return": { } } +# +# Since: 5.2 +## +{ 'command': 'snapshot-delete', + 'data': { 'job-id': 'str', + 'tag': 'str', + '*devices': ['str'] } } diff --git a/replay/replay-snapshot.c b/replay/replay-snapshot.c index e26fa4c892..f0f45a4f24 100644 --- a/replay/replay-snapshot.c +++ b/replay/replay-snapshot.c @@ -77,13 +77,13 @@ 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, NULL, NULL, &err) !=3D 0) { error_report_err(err); error_report("Could not create snapshot for icount record"= ); exit(1); } } else if (replay_mode =3D=3D REPLAY_MODE_PLAY) { - if (load_snapshot(replay_snapshot, &err) !=3D 0) { + if (load_snapshot(replay_snapshot, NULL, NULL, &err) !=3D 0) { 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 0cc86b0766..8dbc2fe638 100644 --- a/softmmu/vl.c +++ b/softmmu/vl.c @@ -4459,7 +4459,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, NULL, NULL, &local_err) < 0) { error_report_err(local_err); autostart =3D 0; exit(1); diff --git a/tests/qemu-iotests/310 b/tests/qemu-iotests/310 new file mode 100755 index 0000000000..66cb58d2c8 --- /dev/null +++ b/tests/qemu-iotests/310 @@ -0,0 +1,255 @@ +#!/usr/bin/env bash +# +# Test which nodes are involved in internal snapshots +# +# Copyright (C) 2019 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# creator +owner=3Dberrange@redhat.com + +seq=3D`basename $0` +echo "QA output created by $seq" + +status=3D1 # failure is the default! + +_cleanup() +{ + _cleanup_qemu + _cleanup_test_img + TEST_IMG=3D"$TEST_IMG.alt1" _cleanup_test_img + TEST_IMG=3D"$TEST_IMG.alt2" _cleanup_test_img + rm -f "$SOCK_DIR/nbd" +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +. ./common.qemu + +_supported_fmt qcow2 +_supported_proto file +_supported_os Linux +_require_drivers copy-on-read + +# Internal snapshots are (currently) impossible with refcount_bits=3D1, +# and generally impossible with external data files +_unsupported_imgopts 'refcount_bits=3D1[^0-9]' data_file + +_require_devices virtio-blk + + +size=3D128M + +if [ -n "$BACKING_FILE" ]; then + _make_test_img -b "$BACKING_FILE" -F $IMGFMT $size +else + _make_test_img $size +fi + + _make_test_img $size + +echo "Single disk test" + +export capture_events=3D"JOB_STATUS_CHANGE STOP RESUME" + +run_snapshot() +{ + local op=3D$1 + + _send_qemu_cmd $QEMU_HANDLE "{\"execute\": \"snapshot-${op}\", \"argum= ents\": {\"job-id\": \"snap${op}0\", \"tag\": \"snap0\", \"devices\": $SNAP= _DEVICES}}" "return" + # created + _wait_event $QEMU_HANDLE "JOB_STATUS_CHANGE" + # running + _wait_event $QEMU_HANDLE "JOB_STATUS_CHANGE" + if [ $op =3D "delete" ]; then + if [ $SNAP_DELETE_FAIL =3D 1 ]; then + # aborting + _wait_event $QEMU_HANDLE "JOB_STATUS_CHANGE" + else + # waiting + _wait_event $QEMU_HANDLE "JOB_STATUS_CHANGE" + # pending + _wait_event $QEMU_HANDLE "JOB_STATUS_CHANGE" + fi + else + if [ $SNAP_FAIL =3D 0 ]; then + _wait_event $QEMU_HANDLE "STOP" + _wait_event $QEMU_HANDLE "RESUME" + # waiting + _wait_event $QEMU_HANDLE "JOB_STATUS_CHANGE" + # pending + _wait_event $QEMU_HANDLE "JOB_STATUS_CHANGE" + else + if [ $op =3D "load" ]; then + _wait_event $QEMU_HANDLE "STOP" + fi + # aborting + _wait_event $QEMU_HANDLE "JOB_STATUS_CHANGE" + fi + fi + # concluded + _wait_event $QEMU_HANDLE "JOB_STATUS_CHANGE" + _send_qemu_cmd $QEMU_HANDLE "{\"execute\": \"query-jobs\"}" "return" + _send_qemu_cmd $QEMU_HANDLE "{\"execute\": \"job-dismiss\", \"argument= s\": {\"id\": \"snap${op}0\"}}" "return" + # null + _wait_event $QEMU_HANDLE "JOB_STATUS_CHANGE" +} + +run_test() +{ + keep_stderr=3Dy + _launch_qemu -nodefaults -nographic "$@" + + _send_qemu_cmd $QEMU_HANDLE '{"execute": "qmp_capabilities"}' 'return' + + run_snapshot "save" + run_snapshot "load" + run_snapshot "delete" + + _send_qemu_cmd $QEMU_HANDLE '{"execute": "quit"}' 'return' + + wait=3D1 _cleanup_qemu +} + + +echo +echo "=3D=3D=3D=3D=3D Snapshot single qcow2 image =3D=3D=3D=3D=3D" +echo + +SNAP_DEVICES=3D'["diskfmt0"]' SNAP_FAIL=3D0 SNAP_DELETE_FAIL=3D0 \ + run_test \ + -blockdev "{'driver':'file','filename':'$TEST_IMG','node-name':'disk0'= }" \ + -blockdev "{'driver':'qcow2','file':'disk0','node-name':'diskfmt0'}" + +echo +echo "=3D=3D=3D=3D=3D Snapshot no image =3D=3D=3D=3D=3D" +echo + +TEST_IMG=3D"$TEST_IMG.alt1" _make_test_img $size + +SNAP_DEVICES=3D"[]" SNAP_FAIL=3D1 SNAP_DELETE_FAIL=3D0 \ + run_test + + +echo +echo "=3D=3D=3D=3D=3D Snapshot missing image =3D=3D=3D=3D=3D" +echo + +SNAP_DEVICES=3D'["diskfmt1729"]' SNAP_FAIL=3D1 SNAP_DELETE_FAIL=3D1 \ + run_test \ + -blockdev "{'driver':'file','filename':'$TEST_IMG','node-name':'disk0'= }" \ + -blockdev "{'driver':'qcow2','file':'disk0','node-name':'diskfmt0'}" + + +echo +echo "=3D=3D=3D=3D=3D Snapshot protocol instead of format =3D=3D=3D=3D=3D" +echo + +SNAP_DEVICES=3D'["disk0"]' SNAP_FAIL=3D1 SNAP_DELETE_FAIL=3D1 \ + run_test \ + -blockdev "{'driver':'file','filename':'$TEST_IMG','node-name':'disk0'= }" \ + -blockdev "{'driver':'qcow2','file':'disk0','node-name':'diskfmt0'}" + + +echo +echo "=3D=3D=3D=3D=3D Snapshot dual qcow2 image =3D=3D=3D=3D=3D" +echo + +SNAP_DEVICES=3D'["diskfmt0", "diskfmt1"]' SNAP_FAIL=3D0 SNAP_DELETE_FAIL= =3D0 \ + run_test \ + -blockdev "{'driver':'file','filename':'$TEST_IMG','node-name':'disk0'= }" \ + -blockdev "{'driver':'qcow2','file':'disk0','node-name':'diskfmt0'}" \ + -blockdev "{'driver':'file','filename':'$TEST_IMG.alt1','node-name':'d= isk1'}" \ + -blockdev "{'driver':'qcow2','file':'disk1','node-name':'diskfmt1'}" + + +echo +echo "=3D=3D=3D=3D=3D Snapshot error with raw image =3D=3D=3D=3D=3D" +echo + +IMGOPTS=3D IMGFMT=3Draw TEST_IMG=3D"$TEST_IMG.alt2" _make_test_img $size + +SNAP_DEVICES=3D'["diskfmt0", "diskfmt1", "diskfmt2"]' SNAP_FAIL=3D1 SNAP_D= ELETE_FAIL=3D1 \ + run_test \ + -blockdev "{'driver':'file','filename':'$TEST_IMG','node-name':'disk0'= }" \ + -blockdev "{'driver':'qcow2','file':'disk0','node-name':'diskfmt0'}" \ + -blockdev "{'driver':'file','filename':'$TEST_IMG.alt1','node-name':'d= isk1'}" \ + -blockdev "{'driver':'qcow2','file':'disk1','node-name':'diskfmt1'}" \ + -blockdev "{'driver':'file','filename':'$TEST_IMG.alt2','node-name':'d= isk2'}" \ + -blockdev "{'driver':'raw','file':'disk2','node-name':'diskfmt2'}" + + +echo +echo "=3D=3D=3D=3D=3D Snapshot with raw image excluded =3D=3D=3D=3D=3D" +echo + +SNAP_DEVICES=3D'["diskfmt0", "diskfmt1"]' SNAP_FAIL=3D0 SNAP_DELETE_FAIL= =3D0 \ + run_test \ + -blockdev "{'driver':'file','filename':'$TEST_IMG','node-name':'disk0'= }" \ + -blockdev "{'driver':'qcow2','file':'disk0','node-name':'diskfmt0'}" \ + -blockdev "{'driver':'file','filename':'$TEST_IMG.alt1','node-name':'d= isk1'}" \ + -blockdev "{'driver':'qcow2','file':'disk1','node-name':'diskfmt1'}" \ + -blockdev "{'driver':'file','filename':'$TEST_IMG.alt2','node-name':'d= isk2'}" \ + -blockdev "{'driver':'raw','file':'disk2','node-name':'diskfmt2'}" + +echo +echo "=3D=3D=3D=3D=3D Snapshot bad error reporting to stderr =3D=3D=3D=3D= =3D" +echo + +# This demonstrates that we're not capturing vmstate loading failures +# into QMP errors, they're ending up in stderr instead. vmstate needs +# to report errors via Error object but that is a major piece of work +# for the future. This test case's expected output log will need +# adjusting when that is done. + +SNAP_DEVICES=3D'["diskfmt0"]' +SNAP_FAIL=3D1 +SNAP_DELETE_FAIL=3D0 + +keep_stderr=3Dy +_launch_qemu -nodefaults -nographic \ + -device virtio-rng \ + -blockdev "{'driver':'file','filename':'$TEST_IMG','node-name':'disk0'= }" \ + -blockdev "{'driver':'qcow2','file':'disk0','node-name':'diskfmt0'}" + +_send_qemu_cmd $QEMU_HANDLE '{"execute": "qmp_capabilities"}' 'return' + +run_snapshot "save" + +_send_qemu_cmd $QEMU_HANDLE '{"execute": "quit"}' 'return' + +wait=3D1 _cleanup_qemu + +# leave off virtio-rng to provoke vmstate failure +_launch_qemu -nodefaults -nographic \ + -blockdev "{'driver':'file','filename':'$TEST_IMG','node-name':'disk0'= }" \ + -blockdev "{'driver':'qcow2','file':'disk0','node-name':'diskfmt0'}" + +_send_qemu_cmd $QEMU_HANDLE '{"execute": "qmp_capabilities"}' 'return' + +run_snapshot "load" +run_snapshot "delete" + +_send_qemu_cmd $QEMU_HANDLE '{"execute": "quit"}' 'return' + +wait=3D1 _cleanup_qemu + +# success, all done +echo "*** done" +rm -f $seq.full +status=3D0 diff --git a/tests/qemu-iotests/310.out b/tests/qemu-iotests/310.out new file mode 100644 index 0000000000..32c797ab1e --- /dev/null +++ b/tests/qemu-iotests/310.out @@ -0,0 +1,369 @@ +QA output created by 310 +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D134217728 +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D134217728 +Single disk test + +=3D=3D=3D=3D=3D Snapshot single qcow2 image =3D=3D=3D=3D=3D + +{"execute": "qmp_capabilities"} +{"return": {}} +{"execute": "snapshot-save", "arguments": {"job-id": "snapsave0", "tag": "= snap0", "devices": ["diskfmt0"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "RESUME"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapsave0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-save", "id": "snapsave0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapsave0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapsave0"}} +{"execute": "snapshot-load", "arguments": {"job-id": "snapload0", "tag": "= snap0", "devices": ["diskfmt0"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "RESUME"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapload0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-load", "id": "snapload0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapload0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapload0"}} +{"execute": "snapshot-delete", "arguments": {"job-id": "snapdelete0", "tag= ": "snap0", "devices": ["diskfmt0"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapdelete0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-delete", "id": "snapdelete0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapdelete0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapdelete0"}} +{"execute": "quit"} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} + +=3D=3D=3D=3D=3D Snapshot no image =3D=3D=3D=3D=3D + +Formatting 'TEST_DIR/t.IMGFMT.alt1', fmt=3DIMGFMT size=3D134217728 +{"execute": "qmp_capabilities"} +{"return": {}} +{"execute": "snapshot-save", "arguments": {"job-id": "snapsave0", "tag": "= snap0", "devices": []}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapsave0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-save", "id": "snapsave0", "error": "No block device= supports snapshots"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapsave0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapsave0"}} +{"execute": "snapshot-load", "arguments": {"job-id": "snapload0", "tag": "= snap0", "devices": []}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapload0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-load", "id": "snapload0", "error": "No block device= supports snapshots"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapload0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapload0"}} +{"execute": "snapshot-delete", "arguments": {"job-id": "snapdelete0", "tag= ": "snap0", "devices": []}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapdelete0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-delete", "id": "snapdelete0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapdelete0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapdelete0"}} +{"execute": "quit"} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} + +=3D=3D=3D=3D=3D Snapshot missing image =3D=3D=3D=3D=3D + +{"execute": "qmp_capabilities"} +{"return": {}} +{"execute": "snapshot-save", "arguments": {"job-id": "snapsave0", "tag": "= snap0", "devices": ["diskfmt1729"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapsave0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-save", "id": "snapsave0", "error": "No block device= node 'diskfmt1729'"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapsave0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapsave0"}} +{"execute": "snapshot-load", "arguments": {"job-id": "snapload0", "tag": "= snap0", "devices": ["diskfmt1729"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapload0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-load", "id": "snapload0", "error": "No block device= node 'diskfmt1729'"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapload0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapload0"}} +{"execute": "snapshot-delete", "arguments": {"job-id": "snapdelete0", "tag= ": "snap0", "devices": ["diskfmt1729"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapdelete0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-delete", "id": "snapdelete0", "error": "No block de= vice node 'diskfmt1729'"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapdelete0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapdelete0"}} +{"execute": "quit"} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} + +=3D=3D=3D=3D=3D Snapshot protocol instead of format =3D=3D=3D=3D=3D + +{"execute": "qmp_capabilities"} +{"return": {}} +{"execute": "snapshot-save", "arguments": {"job-id": "snapsave0", "tag": "= snap0", "devices": ["disk0"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapsave0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-save", "id": "snapsave0", "error": "Device 'disk0' = is writable but does not support snapshots"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapsave0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapsave0"}} +{"execute": "snapshot-load", "arguments": {"job-id": "snapload0", "tag": "= snap0", "devices": ["disk0"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapload0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-load", "id": "snapload0", "error": "Device 'disk0' = is writable but does not support snapshots"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapload0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapload0"}} +{"execute": "snapshot-delete", "arguments": {"job-id": "snapdelete0", "tag= ": "snap0", "devices": ["disk0"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapdelete0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-delete", "id": "snapdelete0", "error": "Device 'dis= k0' is writable but does not support snapshots"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapdelete0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapdelete0"}} +{"execute": "quit"} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} + +=3D=3D=3D=3D=3D Snapshot dual qcow2 image =3D=3D=3D=3D=3D + +{"execute": "qmp_capabilities"} +{"return": {}} +{"execute": "snapshot-save", "arguments": {"job-id": "snapsave0", "tag": "= snap0", "devices": ["diskfmt0", "diskfmt1"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "RESUME"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapsave0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-save", "id": "snapsave0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapsave0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapsave0"}} +{"execute": "snapshot-load", "arguments": {"job-id": "snapload0", "tag": "= snap0", "devices": ["diskfmt0", "diskfmt1"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "RESUME"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapload0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-load", "id": "snapload0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapload0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapload0"}} +{"execute": "snapshot-delete", "arguments": {"job-id": "snapdelete0", "tag= ": "snap0", "devices": ["diskfmt0", "diskfmt1"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapdelete0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-delete", "id": "snapdelete0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapdelete0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapdelete0"}} +{"execute": "quit"} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} + +=3D=3D=3D=3D=3D Snapshot error with raw image =3D=3D=3D=3D=3D + +Formatting 'TEST_DIR/t.qcow2.alt2', fmt=3DIMGFMT size=3D134217728 +{"execute": "qmp_capabilities"} +{"return": {}} +{"execute": "snapshot-save", "arguments": {"job-id": "snapsave0", "tag": "= snap0", "devices": ["diskfmt0", "diskfmt1", "diskfmt2"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapsave0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-save", "id": "snapsave0", "error": "Device 'diskfmt= 2' is writable but does not support snapshots"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapsave0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapsave0"}} +{"execute": "snapshot-load", "arguments": {"job-id": "snapload0", "tag": "= snap0", "devices": ["diskfmt0", "diskfmt1", "diskfmt2"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapload0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-load", "id": "snapload0", "error": "Device 'diskfmt= 2' is writable but does not support snapshots"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapload0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapload0"}} +{"execute": "snapshot-delete", "arguments": {"job-id": "snapdelete0", "tag= ": "snap0", "devices": ["diskfmt0", "diskfmt1", "diskfmt2"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapdelete0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-delete", "id": "snapdelete0", "error": "Device 'dis= kfmt2' is writable but does not support snapshots"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapdelete0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapdelete0"}} +{"execute": "quit"} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} + +=3D=3D=3D=3D=3D Snapshot with raw image excluded =3D=3D=3D=3D=3D + +{"execute": "qmp_capabilities"} +{"return": {}} +{"execute": "snapshot-save", "arguments": {"job-id": "snapsave0", "tag": "= snap0", "devices": ["diskfmt0", "diskfmt1"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "RESUME"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapsave0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-save", "id": "snapsave0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapsave0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapsave0"}} +{"execute": "snapshot-load", "arguments": {"job-id": "snapload0", "tag": "= snap0", "devices": ["diskfmt0", "diskfmt1"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "RESUME"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapload0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-load", "id": "snapload0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapload0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapload0"}} +{"execute": "snapshot-delete", "arguments": {"job-id": "snapdelete0", "tag= ": "snap0", "devices": ["diskfmt0", "diskfmt1"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapdelete0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-delete", "id": "snapdelete0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapdelete0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapdelete0"}} +{"execute": "quit"} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} + +=3D=3D=3D=3D=3D Snapshot bad error reporting to stderr =3D=3D=3D=3D=3D + +{"execute": "qmp_capabilities"} +{"return": {}} +{"execute": "snapshot-save", "arguments": {"job-id": "snapsave0", "tag": "= snap0", "devices": ["diskfmt0"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapsave0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-save", "id": "snapsave0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapsave0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapsave0"}} +{"execute": "quit"} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} +{"execute": "qmp_capabilities"} +{"return": {}} +{"execute": "snapshot-load", "arguments": {"job-id": "snapload0", "tag": "= snap0", "devices": ["diskfmt0"]}} +qemu-system-x86_64: Unknown savevm section or instance '0000:00:02.0/virti= o-rng' 0. Make sure that your current VM setup matches your saved VM setup,= including any hotplugged devices +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapsave0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "STOP"} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "aborting", "id": "snapload0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-load", "id": "snapload0", "error": "Error -22 while= loading VM state"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapload0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapload0"}} +{"execute": "snapshot-delete", "arguments": {"job-id": "snapdelete0", "tag= ": "snap0", "devices": ["diskfmt0"]}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "null", "id": "snapload0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "waiting", "id": "snapdelete0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "pending", "id": "snapdelete0"}} +{"execute": "query-jobs"} +{"return": [{"current-progress": 1, "status": "concluded", "total-progress= ": 1, "type": "snapshot-delete", "id": "snapdelete0"}]} +{"execute": "job-dismiss", "arguments": {"id": "snapdelete0"}} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "concluded", "id": "snapdelete0"}} +{"execute": "quit"} +{"return": {}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index a53ea7f78b..b2a5dfbc5a 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -290,6 +290,7 @@ 277 rw quick 279 rw backing quick 280 rw migration quick +310 rw quick 281 rw quick 282 rw img quick 283 auto quick --=20 2.26.2