From nobody Thu Dec 18 22:20:08 2025 Delivered-To: importer@patchew.org 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; Authentication-Results: mx.zohomail.com; dkim=pass; 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=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1576777596; cv=none; d=zohomail.com; s=zohoarc; b=TRaFWyB1+1JG51pSl8L0055noHbvg72TuCzyyQB4E1MuGNv8z2zJpiIA6WWiZLdjoGqZ/fQbkx2rpS6c62EqntHvfKasKtczPw49ewZy0KPd86fnf5aMJ+aZXnPdDX5SxuZkaG77k+ei6F7rxyoXYHBzvWoAUAHMF2+ZbFXs8NU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1576777596; 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=meKYZHvu6iLzH5cv3ecnPslSJkM31+5zXd/Sw8MPy/0=; b=oC3vTkMZuCqhyOeQ8R5U1TY43e8RHvkx4oc03q4pjnNJzDQX4niby1sYTJJuVIBYe7sBn4F0qWv2r6lLDq2z+TGP0jEOohGYG3VwjhcuHLKLQowmYWmQT+dNpQhcdrfRrdmIENbl6w+vWsJaGa0GeXnHgzFdMxGxXN/sOYDDVX0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=pass 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 1576777596217520.7545810529509; Thu, 19 Dec 2019 09:46:36 -0800 (PST) Received: from localhost ([::1]:45572 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ihzsh-0006e9-1G for importer@patchew.org; Thu, 19 Dec 2019 12:46:35 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:47245) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ihzYk-0007F0-Jh for qemu-devel@nongnu.org; Thu, 19 Dec 2019 12:26:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ihzYi-0008C1-CA for qemu-devel@nongnu.org; Thu, 19 Dec 2019 12:25:58 -0500 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:41189 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ihzYf-00082M-6I for qemu-devel@nongnu.org; Thu, 19 Dec 2019 12:25:54 -0500 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-143-YhbXKbZ-NIeEYaWaK146Lg-1; Thu, 19 Dec 2019 12:25:42 -0500 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 5C77718B9F5C; Thu, 19 Dec 2019 17:25:41 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-53.ams2.redhat.com [10.36.117.53]) by smtp.corp.redhat.com (Postfix) with ESMTP id A49DC620C0; Thu, 19 Dec 2019 17:25:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1576776345; 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=meKYZHvu6iLzH5cv3ecnPslSJkM31+5zXd/Sw8MPy/0=; b=YRfLsud352GuUGuzogql/nM62M1VElCqAHtzXZ73QbiN2nBzdSC1JSpk/h+aY6Q9J5BceU T6bxvRrEeDvLozXkwTQsW9QVzGXX8iQEFSJwHWa5Xkw5h+nFia+TCCEgrGJigHDTm4+VD/ gNmuRCawbSWodayBJpKUdEeqRViMZIY= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 28/30] block: Activate recursively even for already active nodes Date: Thu, 19 Dec 2019 18:24:39 +0100 Message-Id: <20191219172441.7289-29-kwolf@redhat.com> In-Reply-To: <20191219172441.7289-1-kwolf@redhat.com> References: <20191219172441.7289-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: YhbXKbZ-NIeEYaWaK146Lg-1 X-Mimecast-Spam-Score: 0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.120 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, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" bdrv_invalidate_cache_all() assumes that all nodes in a given subtree are either active or inactive when it starts. Therefore, as soon as it arrives at an already active node, it stops. However, this assumption is wrong. For example, it's possible to take a snapshot of an inactive node, which results in an active overlay over an inactive backing file. The active overlay is probably also the root node of an inactive BlockBackend (blk->disable_perm =3D=3D true). In this case, bdrv_invalidate_cache_all() does not need to do anything to activate the overlay node, but it still needs to recurse into the children and the parents to make sure that after returning success, really everything is activated. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf Reviewed-by: Max Reitz --- block.c | 50 ++++++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/block.c b/block.c index 73029fad64..1b6f7c86e8 100644 --- a/block.c +++ b/block.c @@ -5335,10 +5335,6 @@ static void coroutine_fn bdrv_co_invalidate_cache(Bl= ockDriverState *bs, return; } =20 - if (!(bs->open_flags & BDRV_O_INACTIVE)) { - return; - } - QLIST_FOREACH(child, &bs->children, next) { bdrv_co_invalidate_cache(child->bs, &local_err); if (local_err) { @@ -5360,34 +5356,36 @@ static void coroutine_fn bdrv_co_invalidate_cache(B= lockDriverState *bs, * just keep the extended permissions for the next time that an activa= tion * of the image is tried. */ - bs->open_flags &=3D ~BDRV_O_INACTIVE; - bdrv_get_cumulative_perm(bs, &perm, &shared_perm); - ret =3D bdrv_check_perm(bs, NULL, perm, shared_perm, NULL, NULL, &loca= l_err); - if (ret < 0) { - bs->open_flags |=3D BDRV_O_INACTIVE; - error_propagate(errp, local_err); - return; - } - bdrv_set_perm(bs, perm, shared_perm); - - if (bs->drv->bdrv_co_invalidate_cache) { - bs->drv->bdrv_co_invalidate_cache(bs, &local_err); - if (local_err) { + if (bs->open_flags & BDRV_O_INACTIVE) { + bs->open_flags &=3D ~BDRV_O_INACTIVE; + bdrv_get_cumulative_perm(bs, &perm, &shared_perm); + ret =3D bdrv_check_perm(bs, NULL, perm, shared_perm, NULL, NULL, &= local_err); + if (ret < 0) { bs->open_flags |=3D BDRV_O_INACTIVE; error_propagate(errp, local_err); return; } - } + bdrv_set_perm(bs, perm, shared_perm); =20 - FOR_EACH_DIRTY_BITMAP(bs, bm) { - bdrv_dirty_bitmap_skip_store(bm, false); - } + if (bs->drv->bdrv_co_invalidate_cache) { + bs->drv->bdrv_co_invalidate_cache(bs, &local_err); + if (local_err) { + bs->open_flags |=3D BDRV_O_INACTIVE; + error_propagate(errp, local_err); + return; + } + } =20 - ret =3D refresh_total_sectors(bs, bs->total_sectors); - if (ret < 0) { - bs->open_flags |=3D BDRV_O_INACTIVE; - error_setg_errno(errp, -ret, "Could not refresh total sector count= "); - return; + FOR_EACH_DIRTY_BITMAP(bs, bm) { + bdrv_dirty_bitmap_skip_store(bm, false); + } + + ret =3D refresh_total_sectors(bs, bs->total_sectors); + if (ret < 0) { + bs->open_flags |=3D BDRV_O_INACTIVE; + error_setg_errno(errp, -ret, "Could not refresh total sector c= ount"); + return; + } } =20 QLIST_FOREACH(parent, &bs->parents, next_parent) { --=20 2.20.1