All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 05/15] mirror: Drop permissions on s->target on completion
Date: Mon, 29 May 2017 17:06:44 +0200	[thread overview]
Message-ID: <1496070414-6744-6-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1496070414-6744-1-git-send-email-kwolf@redhat.com>

This fixes an assertion failure that was triggered by qemu-iotests 129
on some CI host, while the same test case didn't seem to fail on other
hosts.

Essentially the problem is that the blk_unref(s->target) in
mirror_exit() doesn't necessarily mean that the BlockBackend goes away
immediately. It is possible that the job completion was triggered nested
in mirror_drain(), which looks like this:

    BlockBackend *target = s->target;
    blk_ref(target);
    blk_drain(target);
    blk_unref(target);

In this case, the write permissions for s->target are retained until
after blk_drain(), which makes removing mirror_top_bs fail for the
active commit case (can't have a writable backing file in the chain
without the filter driver).

Explicitly dropping the permissions first means that the additional
reference doesn't hurt and the job can complete successfully even if
called from the nested blk_drain().

Cc: qemu-stable@nongnu.org
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
---
 block/mirror.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/block/mirror.c b/block/mirror.c
index e86f8f8..e778ee0 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -514,7 +514,12 @@ static void mirror_exit(BlockJob *job, void *opaque)
 
     /* Remove target parent that still uses BLK_PERM_WRITE/RESIZE before
      * inserting target_bs at s->to_replace, where we might not be able to get
-     * these permissions. */
+     * these permissions.
+     *
+     * Note that blk_unref() alone doesn't necessarily drop permissions because
+     * we might be running nested inside mirror_drain(), which takes an extra
+     * reference, so use an explicit blk_set_perm() first. */
+    blk_set_perm(s->target, 0, BLK_PERM_ALL, &error_abort);
     blk_unref(s->target);
     s->target = NULL;
 
-- 
1.8.3.1

  parent reply	other threads:[~2017-05-29 15:07 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-29 15:06 [Qemu-devel] [PULL 00/15] Block layer patches Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 01/15] stream: fix crash in stream_start() when block_job_create() fails Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 02/15] qemu-iotests: Test streaming with missing job ID Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 03/15] iotests: 147: Don't test inet6 if not available Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 04/15] nvme: Add support for Controller Memory Buffers Kevin Wolf
2017-05-29 15:06 ` Kevin Wolf [this message]
2017-05-29 15:06 ` [Qemu-devel] [PULL 06/15] qcow2: remove extra local_error variable Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 07/15] qemu-img: Fix documentation of convert Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 08/15] qemu-img: add support for --object with 'dd' command Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 09/15] qemu-img: fix --image-opts usage with dd command Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 10/15] qemu-img: introduce --target-image-opts for 'convert' command Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 11/15] qemu-img: copy *key-secret opts when opening newly created files Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 12/15] qemu-img: Fix leakage of options on error Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 13/15] block: Tweak error message related to qemu-img amend Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 14/15] block: Fix backing paths for filenames with colons Kevin Wolf
2017-05-29 15:06 ` [Qemu-devel] [PULL 15/15] block/file-*: *_parse_filename() and colons Kevin Wolf
2017-05-30  9:44 ` [Qemu-devel] [Qemu-block] [PULL 00/15] Block layer patches Stefan Hajnoczi

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=1496070414-6744-6-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.