All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: "Denis V. Lunev" <den@openvz.org>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org,
	Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>,
	Hanna Reitz <hreitz@redhat.com>,
	qemu-stable@nongnu.org
Subject: Re: [PATCH v4 3/5] block: let bdrv_reopen_commit_post() report a failure
Date: Tue, 6 Oct 2026 14:12:09 +0200	[thread overview]
Message-ID: <asTlmZ3i9tSCw4Ss@redhat.com> (raw)
In-Reply-To: <20260824133729.1141990-4-den@openvz.org>

Am 24.08.2026 um 15:37 hat Denis V. Lunev geschrieben:
> From: Denis V. Lunev <den@openvz.org>
> 
> The callback runs after bdrv_reopen_multiple() has committed the
> transaction, so it cannot reject the reopen. It can still find that
> the node it has just made writable is unusable, and has no way to say
> so: bdrv_reopen() returns success and the caller carries on.
> 
> Give it a return value and an Error argument. The reopen stays
> committed, the error only reports that the node is gone. Every queued
> node still gets its callback, the first error is the one reported. A
> callback may leave its node without a driver, and so may the I/O of a
> later bdrv_reopen_prepare(), so do not assume that the nodes still
> ahead of it in the queue have one. qcow2 is the only implementation and
> does not fail yet.
> 
> An error therefore means one of two things now, either that the reopen
> was denied and nothing changed, or that it went through and left a tree
> which cannot be used. Nothing is undone in the second case: the node is
> beyond repair by another reopen, and a caller which reacts to the error
> by reopening anything is making it worse. bdrv_reopen_multiple() says
> so, nothing else changes.
> 
> Signed-off-by: Denis V. Lunev <den@openvz.org>
> Reviewed-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
> CC: Kevin Wolf <kwolf@redhat.com>
> CC: Hanna Reitz <hreitz@redhat.com>
> CC: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
> Cc: qemu-stable@nongnu.org

What you write both in the commit messages of this and the following
patches and in this thread makes me think that you understand well that
this approach is fundamentally wrong if we're taking the transaction
model seriously, so I don't have to explain that.

If we were discussing which transaction phase should contain image
repairing completely out of the context of QEMU code, I think we would
be very quick to agree that it's the prepare phase.

The problem is just that it shows once again the old problem that the
reopen design is flawed and doesn't allow writing to the image in the
prepare phase for a ro -> rw transition. Even the already existing
qcow2_reopen_commit_post() is just a hack; in theory, the bitmaps should
be made writable in prepare and then commit should just be a switchover.
Reverting to read-only in abort is an operation that can tolerate
failure, it just gives up access.

I've been thinking for a long time that during reopen, parent nodes
should have access to both the old state and the new state of their
children to allow all necessary modifications. This feels like a very
big change, though.

I'm wondering if for ro/rw specifically (which is actually the one
setting that is always involved in these nasty cases), it might be
enough if we define the expected state after prepare to be that the
image is writable if either the old or the new state is writable. Then
commit and abort always just either leave it writable or drop write
permissions.

Do you think this would be a viable approach for your problem here or
are there additional problems why the image checking can't be done
during prepare?

Kevin



  reply	other threads:[~2026-10-07  8:49 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-24 13:37 [PATCH v4 0/5] qcow2: silent corruption when a dirty image becomes writable Denis V. Lunev
2026-08-24 13:37 ` [PATCH v4 1/5] qcow2: do not clear the dirty bit when reopening a read-only node Denis V. Lunev
2026-10-06 10:01   ` Kevin Wolf
2026-08-24 13:37 ` [PATCH v4 2/5] block: reject a reopen of an unusable node instead of crashing Denis V. Lunev
2026-10-06 10:02   ` Kevin Wolf
2026-08-24 13:37 ` [PATCH v4 3/5] block: let bdrv_reopen_commit_post() report a failure Denis V. Lunev
2026-10-06 12:12   ` Kevin Wolf [this message]
2026-08-24 13:37 ` [PATCH v4 4/5] block: remember the flags a reopen starts from Denis V. Lunev
2026-08-24 13:37 ` [PATCH v4 5/5] qcow2: repair a dirty image when it becomes writable Denis V. Lunev
2026-08-25  9:37   ` Markus Armbruster
2026-08-26 13:49     ` Denis V. Lunev
2026-08-26 15:24       ` Markus Armbruster
2026-08-26 16:37         ` Denis V. Lunev
2026-08-27  9:15           ` Markus Armbruster
2026-08-27 16:06             ` Denis V. Lunev
2026-08-31 12:31               ` Markus Armbruster
2026-08-31 19:01                 ` Denis V. Lunev
2026-08-31 22:03                   ` Denis V. Lunev
2026-10-06 10:30             ` Kevin Wolf
2026-09-21 19:40 ` [PATCH v4 0/5] qcow2: silent corruption when a dirty image " Denis V. Lunev
2026-10-05  8:57 ` Denis V. Lunev

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=asTlmZ3i9tSCw4Ss@redhat.com \
    --to=kwolf@redhat.com \
    --cc=andrey.drobyshev@virtuozzo.com \
    --cc=den@openvz.org \
    --cc=hreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@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.