From nobody Mon Feb 9 13:38:42 2026 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=1563201087; cv=none; d=zoho.com; s=zohoarc; b=cMlf/9qkjA3nEzZC7XfXgPzTH2kN8a5o/Kdz8Ss8lm4Tnf1Sb2IOHFzEAVOp2hpvEYHEzqrsQSUuSjpLoDyR7mhREU8Fzvv7XVDdx1NkhvrXrQo02aCLjd629hn4+8/Ve7SVYjTQH2BS6NMQvKhA9CeuO61SZr+Uvc9SzABW5Do= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1563201087; 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=b1sz4uQSRumaPI+FDb3C2ec+WC2yGoaTGxpmFp92+MI=; b=ojaY1LQArFXkjkMF9dkYXl/+ftSfk6ktC9TKXWZ6zgnZ2PL/i3/L2jy8Gg6nm8X2V96FH9+LDNuXEVH+cjGJONEhZoPdIUqhXnDjIfKLxtN9rbA+HmDFcpmxPT9eAVB2jsVSPlh8ONhV7ocZSnHpq5RCe+P3UnzVjSJFWSfJOl8= 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 1563201087286637.8485623317692; Mon, 15 Jul 2019 07:31:27 -0700 (PDT) Received: from localhost ([::1]:39488 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hn20j-0003Xw-Jl for importer@patchew.org; Mon, 15 Jul 2019 10:31:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34411) by lists.gnu.org with esmtp (Exim 4.86_2) (envelope-from ) id 1hn1yt-0005CF-0o for qemu-devel@nongnu.org; Mon, 15 Jul 2019 10:29:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hn1yr-00061H-Va for qemu-devel@nongnu.org; Mon, 15 Jul 2019 10:29:30 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57668) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hn1ym-0005xi-Jc; Mon, 15 Jul 2019 10:29:24 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DD6913082200; Mon, 15 Jul 2019 14:29:23 +0000 (UTC) Received: from localhost (unknown [10.40.205.59]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5A0FC5D9C6; Mon, 15 Jul 2019 14:29:23 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 15 Jul 2019 16:28:59 +0200 Message-Id: <20190715142905.9078-6-mreitz@redhat.com> In-Reply-To: <20190715142905.9078-1-mreitz@redhat.com> References: <20190715142905.9078-1-mreitz@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.47]); Mon, 15 Jul 2019 14:29:23 +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] [PULL 05/11] block: Deep-clear inherits_from 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 Maydell , qemu-devel@nongnu.org, Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" BDS.inherits_from does not always point to an immediate parent node. When launching a block job with a filter node, for example, the node directly below the filter will not point to the filter, but keep its old pointee (above the filter). If that pointee goes away while the job is still running, the node's inherits_from will not be updated and thus point to garbage. To fix this, bdrv_unref_child() has to check not only the parent node's immediate children for nodes whose inherits_from needs to be cleared, but its whole subtree. Signed-off-by: Max Reitz Message-id: 20190703172813.6868-7-mreitz@redhat.com Signed-off-by: Max Reitz --- block.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/block.c b/block.c index 6565192b91..29e931e217 100644 --- a/block.c +++ b/block.c @@ -2472,18 +2472,20 @@ void bdrv_root_unref_child(BdrvChild *child) bdrv_unref(child_bs); } =20 -void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child) +/** + * Clear all inherits_from pointers from children and grandchildren of + * @root that point to @root, where necessary. + */ +static void bdrv_unset_inherits_from(BlockDriverState *root, BdrvChild *ch= ild) { - if (child =3D=3D NULL) { - return; - } - - if (child->bs->inherits_from =3D=3D parent) { - BdrvChild *c; + BdrvChild *c; =20 - /* Remove inherits_from only when the last reference between paren= t and - * child->bs goes away. */ - QLIST_FOREACH(c, &parent->children, next) { + if (child->bs->inherits_from =3D=3D root) { + /* + * Remove inherits_from only when the last reference between root = and + * child->bs goes away. + */ + QLIST_FOREACH(c, &root->children, next) { if (c !=3D child && c->bs =3D=3D child->bs) { break; } @@ -2493,6 +2495,18 @@ void bdrv_unref_child(BlockDriverState *parent, Bdrv= Child *child) } } =20 + QLIST_FOREACH(c, &child->bs->children, next) { + bdrv_unset_inherits_from(root, c); + } +} + +void bdrv_unref_child(BlockDriverState *parent, BdrvChild *child) +{ + if (child =3D=3D NULL) { + return; + } + + bdrv_unset_inherits_from(parent, child); bdrv_root_unref_child(child); } =20 --=20 2.21.0