From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, berto@igalia.com, qemu-devel@nongnu.org,
mreitz@redhat.com, stefanha@redhat.com
Subject: [Qemu-devel] [PATCH for-2.4 4/5] block: Reorder cleanups in bdrv_close()
Date: Wed, 8 Jul 2015 21:36:42 +0200 [thread overview]
Message-ID: <1436384203-10576-5-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1436384203-10576-1-git-send-email-kwolf@redhat.com>
Block drivers may still want to access their child nodes in their
.bdrv_close handler. If they unref and/or detach a child by themselves,
this should not result in a double free.
There is additional code for backing files, which are just a special
case of child nodes. The same applies for them.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/block.c b/block.c
index b723cf2..d5c9f03 100644
--- a/block.c
+++ b/block.c
@@ -1901,6 +1901,14 @@ void bdrv_close(BlockDriverState *bs)
if (bs->drv) {
BdrvChild *child, *next;
+ bs->drv->bdrv_close(bs);
+
+ if (bs->backing_hd) {
+ BlockDriverState *backing_hd = bs->backing_hd;
+ bdrv_set_backing_hd(bs, NULL);
+ bdrv_unref(backing_hd);
+ }
+
QLIST_FOREACH_SAFE(child, &bs->children, next, next) {
/* TODO Remove bdrv_unref() from drivers' close function and use
* bdrv_unref_child() here */
@@ -1910,12 +1918,6 @@ void bdrv_close(BlockDriverState *bs)
bdrv_detach_child(child);
}
- if (bs->backing_hd) {
- BlockDriverState *backing_hd = bs->backing_hd;
- bdrv_set_backing_hd(bs, NULL);
- bdrv_unref(backing_hd);
- }
- bs->drv->bdrv_close(bs);
g_free(bs->opaque);
bs->opaque = NULL;
bs->drv = NULL;
--
1.8.3.1
next prev parent reply other threads:[~2015-07-08 19:37 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-08 19:36 [Qemu-devel] [PATCH for-2.4 0/5] block: Fix backing file child when modifying graph Kevin Wolf
2015-07-08 19:36 ` [Qemu-devel] [PATCH for-2.4 1/5] block: Move bdrv_attach_child() calls up the call chain Kevin Wolf
2015-07-10 15:33 ` Max Reitz
2015-07-08 19:36 ` [Qemu-devel] [PATCH for-2.4 2/5] block: Introduce bdrv_open_child() Kevin Wolf
2015-07-10 15:51 ` Max Reitz
2015-07-10 16:39 ` Kevin Wolf
2015-07-08 19:36 ` [Qemu-devel] [PATCH for-2.4 3/5] block: Introduce bdrv_unref_child() Kevin Wolf
2015-07-10 16:00 ` Max Reitz
2015-07-08 19:36 ` Kevin Wolf [this message]
2015-07-10 16:05 ` [Qemu-devel] [PATCH for-2.4 4/5] block: Reorder cleanups in bdrv_close() Max Reitz
2015-07-08 19:36 ` [Qemu-devel] [PATCH for-2.4 5/5] block: Fix backing file child when modifying graph Kevin Wolf
2015-07-10 16:13 ` Max Reitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1436384203-10576-5-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=berto@igalia.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).