From nobody Wed Nov 12 05:23:19 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.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; Authentication-Results: mx.zohomail.com; spf=pass (zoho.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=1568718418; cv=none; d=zoho.com; s=zohoarc; b=oj1FBNlEsXwYslCZUimHyTMCm4nIRUv5ybArqV5s4GJwJrTKvsVvx7s2pb3QpNKkW3nZ5qdlNpi7ttJHiX0FM0j5Iy1FZjGTToQ6RvyeHsO3ZnuMXUC9jwOy4pOst7glp4h6CLRZQBIocCE1D34laMC32eCcMe8cLbC9yUf+8Aw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568718418; h=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:ARC-Authentication-Results; bh=BtOcrx59jx66EK90IJ1BWIkmEWnTZqk2+J4ILrcloSw=; b=UEModTehgdkH6KPQrqBa6G0M/7iHJnz8iCBah2TC4BbBN7tWfLUW+PXSm81qAzC4tx+tEqFUrZWu0hhCyHIldbaIeCeicFCj6xNoPMcVrvrVVNL8532v4oL8TbCGRH7G3ZLXhcSu9cRdm9XLOvwJY91reHsrSjWfJ/6OGpWli+M= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.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 1568718418088315.9164676448404; Tue, 17 Sep 2019 04:06:58 -0700 (PDT) Received: from localhost ([::1]:44288 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iABJw-0005io-EF for importer@patchew.org; Tue, 17 Sep 2019 07:06:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52424) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iABI6-0004Mk-P0 for qemu-devel@nongnu.org; Tue, 17 Sep 2019 07:05:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iABI4-00078B-Vf for qemu-devel@nongnu.org; Tue, 17 Sep 2019 07:05:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56098) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iABHx-00073l-5g; Tue, 17 Sep 2019 07:04:55 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6B0E0309175F; Tue, 17 Sep 2019 11:04:52 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-116-202.ams2.redhat.com [10.36.116.202]) by smtp.corp.redhat.com (Postfix) with ESMTP id 36E6860606; Tue, 17 Sep 2019 11:04:51 +0000 (UTC) From: Kevin Wolf To: qemu-block@nongnu.org Date: Tue, 17 Sep 2019 13:04:42 +0200 Message-Id: <20190917110443.2029-2-kwolf@redhat.com> In-Reply-To: <20190917110443.2029-1-kwolf@redhat.com> References: <20190917110443.2029-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Tue, 17 Sep 2019 11:04:52 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 1/2] block/snapshot: Restrict set of snapshot nodes 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: kwolf@redhat.com, pkrempa@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Nodes involved in internal snapshots were those that were returned by bdrv_next(), inserted and not read-only. bdrv_next() in turn returns all nodes that are either the root node of a BlockBackend or monitor-owned nodes. With the typical -drive use, this worked well enough. However, in the typical -blockdev case, the user defines one node per option, making all nodes monitor-owned nodes. This includes protocol nodes etc. which often are not snapshottable, so "savevm" only returns an error. Change the conditions so that internal snapshot still include all nodes that have a BlockBackend attached (we definitely want to snapshot anything attached to a guest device and probably also the built-in NBD server; snapshotting block job BlockBackends is more of an accident, but a preexisting one), but other monitor-owned nodes are only included if they have no parents. This makes internal snapshots usable again with typical -blockdev configurations. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf Reviewed-by: Eric Blake Reviewed-by: Max Reitz Reviewed-by: Peter Krempa Tested-by: Peter Krempa --- block/snapshot.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/block/snapshot.c b/block/snapshot.c index f2f48f926a..8081616ae9 100644 --- a/block/snapshot.c +++ b/block/snapshot.c @@ -31,6 +31,7 @@ #include "qapi/qmp/qerror.h" #include "qapi/qmp/qstring.h" #include "qemu/option.h" +#include "sysemu/block-backend.h" =20 QemuOptsList internal_snapshot_opts =3D { .name =3D "snapshot", @@ -384,6 +385,16 @@ int bdrv_snapshot_load_tmp_by_id_or_name(BlockDriverSt= ate *bs, return ret; } =20 +static bool bdrv_all_snapshots_includes_bs(BlockDriverState *bs) +{ + if (!bdrv_is_inserted(bs) || bdrv_is_read_only(bs)) { + return false; + } + + /* Include all nodes that are either in use by a BlockBackend, or that + * aren't attached to any node, but owned by the monitor. */ + return bdrv_has_blk(bs) || QLIST_EMPTY(&bs->parents); +} =20 /* Group operations. All block drivers are involved. * These functions will properly handle dataplane (take aio_context_acquire @@ -399,7 +410,7 @@ bool bdrv_all_can_snapshot(BlockDriverState **first_bad= _bs) AioContext *ctx =3D bdrv_get_aio_context(bs); =20 aio_context_acquire(ctx); - if (bdrv_is_inserted(bs) && !bdrv_is_read_only(bs)) { + if (bdrv_all_snapshots_includes_bs(bs)) { ok =3D bdrv_can_snapshot(bs); } aio_context_release(ctx); @@ -426,8 +437,9 @@ int bdrv_all_delete_snapshot(const char *name, BlockDri= verState **first_bad_bs, AioContext *ctx =3D bdrv_get_aio_context(bs); =20 aio_context_acquire(ctx); - if (bdrv_can_snapshot(bs) && - bdrv_snapshot_find(bs, snapshot, name) >=3D 0) { + if (bdrv_all_snapshots_includes_bs(bs) && + bdrv_snapshot_find(bs, snapshot, name) >=3D 0) + { ret =3D bdrv_snapshot_delete(bs, snapshot->id_str, snapshot->name, err); } @@ -455,7 +467,7 @@ int bdrv_all_goto_snapshot(const char *name, BlockDrive= rState **first_bad_bs, AioContext *ctx =3D bdrv_get_aio_context(bs); =20 aio_context_acquire(ctx); - if (bdrv_can_snapshot(bs)) { + if (bdrv_all_snapshots_includes_bs(bs)) { ret =3D bdrv_snapshot_goto(bs, name, errp); } aio_context_release(ctx); @@ -481,7 +493,7 @@ int bdrv_all_find_snapshot(const char *name, BlockDrive= rState **first_bad_bs) AioContext *ctx =3D bdrv_get_aio_context(bs); =20 aio_context_acquire(ctx); - if (bdrv_can_snapshot(bs)) { + if (bdrv_all_snapshots_includes_bs(bs)) { err =3D bdrv_snapshot_find(bs, &sn, name); } aio_context_release(ctx); @@ -512,7 +524,7 @@ int bdrv_all_create_snapshot(QEMUSnapshotInfo *sn, if (bs =3D=3D vm_state_bs) { sn->vm_state_size =3D vm_state_size; err =3D bdrv_snapshot_create(bs, sn); - } else if (bdrv_can_snapshot(bs)) { + } else if (bdrv_all_snapshots_includes_bs(bs)) { sn->vm_state_size =3D 0; err =3D bdrv_snapshot_create(bs, sn); } @@ -538,7 +550,7 @@ BlockDriverState *bdrv_all_find_vmstate_bs(void) bool found; =20 aio_context_acquire(ctx); - found =3D bdrv_can_snapshot(bs); + found =3D bdrv_all_snapshots_includes_bs(bs) && bdrv_can_snapshot(= bs); aio_context_release(ctx); =20 if (found) { --=20 2.20.1 From nobody Wed Nov 12 05:23:19 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.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; Authentication-Results: mx.zohomail.com; spf=pass (zoho.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=1568718426; cv=none; d=zoho.com; s=zohoarc; b=RgKgWKyjp0xn1lCvPchink15xqJ7ODIxyf4maOXQX07YFjhI2ZPIwoDbWOM0apkXYQyMcW0SmJZ7Zo74o8EaSa9ZeUwauxCNzza6QdFK4AF9i+LywQIQ9HZpFQwwmtIW2L3RhTCXCup9ERBuB/1vcZpZGJqQ2rItrcyjOkBLmmg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1568718426; h=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:ARC-Authentication-Results; bh=M2lV9GGoruN1vtnhLXBn/dj4UZIIAhP5qOyqtyMMWWA=; b=hMDPbBszVEbQZv4JN6s47d5KN9Jv6LFCM288nMAzXBPEij7xguRXm1U4thO1YsjfzIryqEXPGyeOt7x+prrCA3iXHAkWMjHXSFZacxIHRQdpn9hxOLzdiNhFLc4xsmqHGhcPnfyiiwg4XcX1/eSbX+wfzgRUigSrSdS2Kb05zzs= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.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 1568718426895530.5818494315386; Tue, 17 Sep 2019 04:07:06 -0700 (PDT) Received: from localhost ([::1]:44290 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iABK5-0005vS-Ao for importer@patchew.org; Tue, 17 Sep 2019 07:07:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52450) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iABIA-0004Qk-Kk for qemu-devel@nongnu.org; Tue, 17 Sep 2019 07:05:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iABI8-0007D3-5F for qemu-devel@nongnu.org; Tue, 17 Sep 2019 07:05:06 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40430) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iABHz-00074o-3H; Tue, 17 Sep 2019 07:04:56 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 21FADA2666F; Tue, 17 Sep 2019 11:04:54 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-116-202.ams2.redhat.com [10.36.116.202]) by smtp.corp.redhat.com (Postfix) with ESMTP id B88E460606; Tue, 17 Sep 2019 11:04:52 +0000 (UTC) From: Kevin Wolf To: qemu-block@nongnu.org Date: Tue, 17 Sep 2019 13:04:43 +0200 Message-Id: <20190917110443.2029-3-kwolf@redhat.com> In-Reply-To: <20190917110443.2029-1-kwolf@redhat.com> References: <20190917110443.2029-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.6.2 (mx1.redhat.com [10.5.110.68]); Tue, 17 Sep 2019 11:04:54 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 2/2] iotests: Test internal snapshots with -blockdev 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: kwolf@redhat.com, pkrempa@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Signed-off-by: Kevin Wolf Reviewed-by: Peter Krempa Tested-by: Peter Krempa --- tests/qemu-iotests/267 | 165 ++++++++++++++++++++++++++++ tests/qemu-iotests/267.out | 182 +++++++++++++++++++++++++++++++ tests/qemu-iotests/common.filter | 5 +- tests/qemu-iotests/group | 1 + 4 files changed, 349 insertions(+), 4 deletions(-) create mode 100755 tests/qemu-iotests/267 create mode 100644 tests/qemu-iotests/267.out diff --git a/tests/qemu-iotests/267 b/tests/qemu-iotests/267 new file mode 100755 index 0000000000..0d085c60a7 --- /dev/null +++ b/tests/qemu-iotests/267 @@ -0,0 +1,165 @@ +#!/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=3Dkwolf@redhat.com + +seq=3D`basename $0` +echo "QA output created by $seq" + +status=3D1 # failure is the default! + +_cleanup() +{ + _cleanup_test_img + rm -f "$TEST_DIR/nbd" +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +_supported_fmt qcow2 +_supported_proto file +_supported_os Linux + +do_run_qemu() +{ + echo Testing: "$@" + ( + if ! test -t 0; then + while read cmd; do + echo $cmd + done + fi + echo quit + ) | $QEMU -nographic -monitor stdio -nodefaults "$@" + echo +} + +run_qemu() +{ + do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_hmp | + _filter_generated_node_ids | _filter_imgfmt +} + +size=3D128M + +run_test() +{ + _make_test_img $size + printf "savevm snap0\ninfo snapshots\nloadvm snap0\n" | run_qemu "$@" = | _filter_date +} + + +echo +echo "=3D=3D=3D No block devices at all =3D=3D=3D" +echo + +run_test + +echo +echo "=3D=3D=3D -drive if=3Dnone =3D=3D=3D" +echo + +run_test -drive driver=3Dfile,file=3D"$TEST_IMG",if=3Dnone +run_test -drive driver=3D$IMGFMT,file=3D"$TEST_IMG",if=3Dnone +run_test -drive driver=3D$IMGFMT,file=3D"$TEST_IMG",if=3Dnone -device virt= io-blk,drive=3Dnone0 + +echo +echo "=3D=3D=3D -drive if=3Dvirtio =3D=3D=3D" +echo + +run_test -drive driver=3Dfile,file=3D"$TEST_IMG",if=3Dvirtio +run_test -drive driver=3D$IMGFMT,file=3D"$TEST_IMG",if=3Dvirtio + +echo +echo "=3D=3D=3D Simple -blockdev =3D=3D=3D" +echo + +run_test -blockdev driver=3Dfile,filename=3D"$TEST_IMG",node-name=3Dfile +run_test -blockdev driver=3Dfile,filename=3D"$TEST_IMG",node-name=3Dfile \ + -blockdev driver=3D$IMGFMT,file=3Dfile,node-name=3Dfmt +run_test -blockdev driver=3Dfile,filename=3D"$TEST_IMG",node-name=3Dfile \ + -blockdev driver=3Draw,file=3Dfile,node-name=3Draw \ + -blockdev driver=3D$IMGFMT,file=3Draw,node-name=3Dfmt + +echo +echo "=3D=3D=3D -blockdev with a filter on top =3D=3D=3D" +echo + +run_test -blockdev driver=3Dfile,filename=3D"$TEST_IMG",node-name=3Dfile \ + -blockdev driver=3D$IMGFMT,file=3Dfile,node-name=3Dfmt \ + -blockdev driver=3Dcopy-on-read,file=3Dfmt,node-name=3Dfilter + +echo +echo "=3D=3D=3D -blockdev with a backing file =3D=3D=3D" +echo + +TEST_IMG=3D"$TEST_IMG.base" _make_test_img $size + +IMGOPTS=3D"backing_file=3D$TEST_IMG.base" \ +run_test -blockdev driver=3Dfile,filename=3D"$TEST_IMG.base",node-name=3Db= acking-file \ + -blockdev driver=3Dfile,filename=3D"$TEST_IMG",node-name=3Dfile \ + -blockdev driver=3D$IMGFMT,file=3Dfile,backing=3Dbacking-file,nod= e-name=3Dfmt + +IMGOPTS=3D"backing_file=3D$TEST_IMG.base" \ +run_test -blockdev driver=3Dfile,filename=3D"$TEST_IMG.base",node-name=3Db= acking-file \ + -blockdev driver=3D$IMGFMT,file=3Dbacking-file,node-name=3Dbackin= g-fmt \ + -blockdev driver=3Dfile,filename=3D"$TEST_IMG",node-name=3Dfile \ + -blockdev driver=3D$IMGFMT,file=3Dfile,backing=3Dbacking-fmt,node= -name=3Dfmt + +# A snapshot should be present on the overlay, but not the backing file +echo Internal snapshots on overlay: +$QEMU_IMG snapshot -l "$TEST_IMG" | _filter_date + +echo Internal snapshots on backing file: +$QEMU_IMG snapshot -l "$TEST_IMG.base" | _filter_date + +echo +echo "=3D=3D=3D -blockdev with NBD server on the backing file =3D=3D=3D" +echo + +IMGOPTS=3D"backing_file=3D$TEST_IMG.base" _make_test_img $size +cat <