From: Kevin Wolf <kwolf@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
qemu-devel@nongnu.org, qemu-block@nongnu.org
Subject: Re: [PATCH v7 39/47] blockdev: Fix active commit choice
Date: Mon, 24 Aug 2020 17:06:14 +0200 [thread overview]
Message-ID: <20200824150614.GC10708@linux.fritz.box> (raw)
In-Reply-To: <7a02c449-2bef-08d4-bd3f-41eac0276424@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 7932 bytes --]
Am 24.08.2020 um 16:41 hat Max Reitz geschrieben:
> On 24.08.20 16:07, Kevin Wolf wrote:
> > Am 24.08.2020 um 15:18 hat Max Reitz geschrieben:
> >> On 21.08.20 17:50, Kevin Wolf wrote:
> >>> Am 25.06.2020 um 17:22 hat Max Reitz geschrieben:
> >>>> We have to perform an active commit whenever the top node has a parent
> >>>> that has taken the WRITE permission on it.
> >>>>
> >>>> Signed-off-by: Max Reitz <mreitz@redhat.com>
> >>>> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> >>>> ---
> >>>> blockdev.c | 24 +++++++++++++++++++++---
> >>>> 1 file changed, 21 insertions(+), 3 deletions(-)
> >>>>
> >>>> diff --git a/blockdev.c b/blockdev.c
> >>>> index 402f1d1df1..237fffbe53 100644
> >>>> --- a/blockdev.c
> >>>> +++ b/blockdev.c
> >>>> @@ -2589,6 +2589,7 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device,
> >>>> AioContext *aio_context;
> >>>> Error *local_err = NULL;
> >>>> int job_flags = JOB_DEFAULT;
> >>>> + uint64_t top_perm, top_shared;
> >>>>
> >>>> if (!has_speed) {
> >>>> speed = 0;
> >>>> @@ -2704,14 +2705,31 @@ void qmp_block_commit(bool has_job_id, const char *job_id, const char *device,
> >>>> goto out;
> >>>> }
> >>>>
> >>>> - if (top_bs == bs) {
> >>>> + /*
> >>>> + * Active commit is required if and only if someone has taken a
> >>>> + * WRITE permission on the top node.
> >>>
> >>> ...or if someone wants to take a WRITE permission while the job is
> >>> running.
> >>>
> >>> Future intentions of the user is something that we can't know, so maybe
> >>> this should become an option in the future (not in this series, of
> >>> course).
> >>>
> >>>> Historically, we have always
> >>>> + * used active commit for top nodes, so continue that practice.
> >>>> + * (Active commit is never really wrong.)
> >>>> + */
> >>>
> >>> Changing the practice would break compatibility with clients that start
> >>> an active commit job and then attach it to a read-write device, so we
> >>> must continue the practice. I think the comment should be clearer about
> >>> this, it sounds more like "no reason, but why not".
> >>
> >> I think that’s what I meant by “historically”. Is “legacily” a word?
> >>
> >> But sure, I can make it more explicit.
> >>
> >>> This is even more problematic because the commit job doesn't unshare
> >>> BLK_PERM_WRITE yet, so it would lead to silent corruption rather than an
> >>> error.
> >>>
> >>>> + bdrv_get_cumulative_perm(top_bs, &top_perm, &top_shared);
> >>>> + if (top_perm & BLK_PERM_WRITE ||
> >>>> + bdrv_skip_filters(top_bs) == bdrv_skip_filters(bs))
> >>>> + {
> >>>> if (has_backing_file) {
> >>>> error_setg(errp, "'backing-file' specified,"
> >>>> " but 'top' is the active layer");
> >>>
> >>> Hm, this error message isn't accurate any more.
> >>>
> >>> In fact, the implementation isn't consistent with the QAPI documentation
> >>> any more, because backing-file is only an error for the top level.
> >>
> >> Hm. I wanted to agree, and then I wanted to come up with a QAPI
> >> documentation that fits the new behavior (because I think it makes more
> >> sense to change the QAPI documentation along with the behavior change,
> >> rather than to force us to allow backing-file for anything that isn’t on
> >> the top layer).
> >>
> >> But in the process of coming up with a better description, I noticed
> >> that this doesn’t say “is a root node”, it says “is the active layer”.
> >> I would say a node in the active layer is a node that has some parent
> >> that has taken a WRITE permission on it. So actually I think that the
> >> documentation is right, and this code only now fits.
> >
> > Then you may have not only "the" active layer, but multiple active
> > layers. I find this a bit counterintuitive.
>
> Depends on what you count as a layer. I don’t think that’s a clearly
> defined term, is it? I only know of “active layer”, “format layer”,
> “protocol layer”, and you can at least have multiple format layers above
> each other. So I don’t find it counterintuitive.
>
> But perhaps it’d be best to just get away from the term “active layer”,
> as you propose below.
Hm, if I needed to describe what a layer is for me intuitively, I guess
it would be something like each non-filter node on a node chain with all
of the filters directly on top of it?
Depending on which link you follow, you get different sets of layers:
For bs->file, you get the format/protocol layer distinction. For
bs->backing, you get essentially what bdrv_backing_chain_next()
iterates.
In this context (which is talking about COW overlays), I expected the
bs->backing link to apply.
The active layer is then the COW layer that is directly referenced by a
guest device, block job or block export.
> > There is a simple reason why backing-file is an error for a root node:
> > It doesn't have overlays, so a value to write to the header of overlay
> > images just doesn't make sense.
>
> Ah, yeah...
>
> > The same reasoning doesn't apply for writable images that do have
> > overlays. Forbidding backing-file is a more arbitrary restriction there.
> > I'm not saying that we can't make arbitrary restrictions where allowing
> > an option is not worth the effort, but I feel they should be spelt out
> > more explicitly instead of twisting words like "active layer" until they
> > fit the code.
>
> I’m all for spelling it out more explicitly. I just noticed that I
> couldn’t clearly distinguish “active layer” from “other” cases of nodes
> with writers on them, which is why I noted that “active” to me means the
> post-patch behavior already.
>
> You’re right that there is no semantic reason for making it an error.
> So I just want it to be an error to be lazy. I hope you let me do that.
> (I don’t think there’s much of a problem with it, considering that
> commits on nodes that have the WRITE permission taken are basically just
> completely broken right now.)
That I'm happy to allow you to be lazy in this case is what I wanted to
express with "I'm not saying that we can't make arbitrary restrictions".
:-)
> >> Though I do think this wants for some clarification. Perhaps “If 'top'
> >> is the active layer (i.e., is a node that may be written to), specifying
> >> a backing [...]”?
> >
> > "If 'top' doesn't have an overlay image or is in use by a writer..."?
>
> I.e., avoiding the term “active layer” altogether? Sounds good. Only,
> I don’t know about “writer”... But it’s already used in
> BlockdevOptionsFile.dynamic-auto-read-only’s description, so I suppose
> we can use it here, too. (I just don’t know if as a
> non-block-layer-developer I’d know what it means.)
I was thinking of something like "is used read-write" at first, but then
realised that write-only is possible, too, so it wouldn't be entirely
accurate...
> (Also, yes, you’re right, the current behavior of giving all root nodes
> an active commit of course remains, even when there are no writers.)
>
> >> There’s more wrong with the specification, namely the whole part under
> >> @backing-file past the “(Since 2.1)”, starting with “If top == base”. I
> >> think all of that should go to the top level. (And “If top == active”
> >> should be changed to “If top is active (i.e., may be written to)”.)
> >
> > At least the latter only becomes wrong with this patch, so I think it
> > needs to be changed by this patch.
>
> Sure. So I understand you agree with moving the whole chunk, right?
I don't mind either way.
Kevin
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2020-08-24 15:07 UTC|newest]
Thread overview: 173+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-25 15:21 [PATCH v7 00/47] block: Deal with filters Max Reitz
2020-06-25 15:21 ` [PATCH v7 01/47] block: Add child access functions Max Reitz
2020-07-08 17:22 ` Andrey Shinkevich
2020-07-13 9:06 ` Vladimir Sementsov-Ogievskiy
2020-07-16 14:46 ` Max Reitz
2020-07-28 16:09 ` Christophe de Dinechin
2020-08-07 9:33 ` Vladimir Sementsov-Ogievskiy
2020-07-13 9:57 ` Vladimir Sementsov-Ogievskiy
2020-06-25 15:21 ` [PATCH v7 02/47] block: Add chain helper functions Max Reitz
2020-07-08 17:20 ` Andrey Shinkevich
2020-07-09 8:24 ` Max Reitz
2020-07-09 9:07 ` Andrey Shinkevich
2020-07-13 10:18 ` Vladimir Sementsov-Ogievskiy
2020-07-16 14:50 ` Max Reitz
2020-07-16 15:24 ` Vladimir Sementsov-Ogievskiy
2020-06-25 15:21 ` [PATCH v7 03/47] block: bdrv_cow_child() for bdrv_has_zero_init() Max Reitz
2020-07-08 17:23 ` Andrey Shinkevich
2020-08-07 9:37 ` Vladimir Sementsov-Ogievskiy
2020-06-25 15:21 ` [PATCH v7 04/47] block: bdrv_set_backing_hd() is about bs->backing Max Reitz
2020-07-08 17:24 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 05/47] block: Include filters when freezing backing chain Max Reitz
2020-07-08 17:25 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 06/47] block: Drop bdrv_is_encrypted() Max Reitz
2020-07-08 17:41 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 07/47] block: Add bdrv_supports_compressed_writes() Max Reitz
2020-07-08 17:48 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 08/47] throttle: Support compressed writes Max Reitz
2020-07-08 17:52 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 09/47] copy-on-read: " Max Reitz
2020-07-08 17:54 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 10/47] mirror-top: " Max Reitz
2020-07-08 17:58 ` Andrey Shinkevich
2020-08-18 10:27 ` Kevin Wolf
2020-08-19 15:35 ` Max Reitz
2020-08-19 16:00 ` Kevin Wolf
2020-06-25 15:21 ` [PATCH v7 11/47] backup-top: " Max Reitz
2020-07-08 17:59 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 12/47] block: Use bdrv_filter_(bs|child) where obvious Max Reitz
2020-07-08 18:24 ` Andrey Shinkevich
2020-07-09 8:59 ` Max Reitz
2020-07-09 9:11 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 13/47] block: Use CAFs in block status functions Max Reitz
2020-07-08 19:13 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 14/47] stream: Deal with filters Max Reitz
2020-07-09 14:52 ` Andrey Shinkevich
2020-07-09 15:27 ` Andrey Shinkevich
2020-07-10 15:24 ` Max Reitz
2020-07-10 17:41 ` Andrey Shinkevich
2020-07-16 14:59 ` Max Reitz
2020-08-07 10:29 ` Vladimir Sementsov-Ogievskiy
2020-08-10 8:12 ` Max Reitz
2020-08-10 11:04 ` Vladimir Sementsov-Ogievskiy
2020-08-14 15:18 ` Andrey Shinkevich
2020-08-18 20:45 ` Andrey Shinkevich
2020-08-19 12:39 ` Max Reitz
2020-08-19 13:18 ` Vladimir Sementsov-Ogievskiy
2020-07-09 15:13 ` Andrey Shinkevich
2020-07-10 15:27 ` Max Reitz
2020-08-18 14:28 ` Kevin Wolf
2020-08-19 14:47 ` Max Reitz
2020-08-19 15:16 ` Kevin Wolf
2020-08-20 8:31 ` Max Reitz
2020-08-20 9:22 ` Max Reitz
2020-08-20 10:49 ` Vladimir Sementsov-Ogievskiy
2020-08-20 11:43 ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 15/47] block: Use CAFs when working with backing chains Max Reitz
2020-07-10 15:28 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 16/47] block: Use bdrv_cow_child() in bdrv_co_truncate() Max Reitz
2020-07-10 15:54 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 17/47] block: Re-evaluate backing file handling in reopen Max Reitz
2020-07-10 19:42 ` Andrey Shinkevich
2020-07-16 15:04 ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 18/47] block: Flush all children in generic code Max Reitz
2020-07-14 12:52 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 19/47] vmdk: Drop vmdk_co_flush() Max Reitz
2020-07-14 14:52 ` Andrey Shinkevich
2020-07-16 15:08 ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 20/47] block: Iterate over children in refresh_limits Max Reitz
2020-07-14 18:37 ` Andrey Shinkevich
2020-07-16 15:14 ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 21/47] block: Use CAFs in bdrv_refresh_filename() Max Reitz
2020-07-15 12:52 ` Andrey Shinkevich
2020-07-15 12:58 ` Andrey Shinkevich
2020-07-16 15:21 ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 22/47] block: Use CAF in bdrv_co_rw_vmstate() Max Reitz
2020-07-15 13:39 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 23/47] block/snapshot: Fix fallback Max Reitz
2020-07-15 21:22 ` Andrey Shinkevich
2020-07-15 22:18 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 24/47] block: Use CAFs for debug breakpoints Max Reitz
2020-07-15 21:43 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 25/47] block: Def. impl.s for get_allocated_file_size Max Reitz
2020-07-15 22:56 ` Andrey Shinkevich
2020-08-19 10:57 ` Kevin Wolf
2020-08-19 15:53 ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 26/47] block: Improve get_allocated_file_size's default Max Reitz
2020-07-20 15:12 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 27/47] blkverify: Use bdrv_sum_allocated_file_size() Max Reitz
2020-07-20 15:10 ` Andrey Shinkevich
2020-08-19 10:46 ` Kevin Wolf
2020-08-19 15:50 ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 28/47] block/null: Implement bdrv_get_allocated_file_size Max Reitz
2020-07-20 15:10 ` Andrey Shinkevich
2020-07-24 8:58 ` Max Reitz
2020-07-24 9:49 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 29/47] blockdev: Use CAF in external_snapshot_prepare() Max Reitz
2020-07-20 16:08 ` Andrey Shinkevich
2020-07-24 9:23 ` Max Reitz
2020-07-24 10:37 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 30/47] block: Report data child for query-blockstats Max Reitz
2020-07-21 11:48 ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 31/47] block: Use child access functions for QAPI queries Max Reitz
2020-07-21 12:30 ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 32/47] block-copy: Use CAF to find sync=top base Max Reitz
2020-07-21 12:42 ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 33/47] mirror: Deal with filters Max Reitz
2020-07-22 18:31 ` Andrey Shinkevich
2020-07-24 9:49 ` Max Reitz
2020-07-24 10:27 ` Andrey Shinkevich
2020-08-19 16:50 ` Kevin Wolf
2020-08-20 10:28 ` Max Reitz
2020-06-25 15:22 ` [PATCH v7 34/47] backup: " Max Reitz
2020-07-23 15:51 ` Andrey Shinkevich
2020-07-24 9:55 ` Max Reitz
2020-06-25 15:22 ` [PATCH v7 35/47] commit: " Max Reitz
2020-07-23 17:15 ` Andrey Shinkevich
2020-07-24 10:36 ` Andrey Shinkevich
2020-08-19 17:58 ` Kevin Wolf
2020-08-20 11:27 ` Max Reitz
2020-08-20 13:47 ` Kevin Wolf
2020-06-25 15:22 ` [PATCH v7 36/47] nbd: Use CAF when looking for dirty bitmap Max Reitz
2020-07-23 17:21 ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 37/47] qemu-img: Use child access functions Max Reitz
2020-07-24 15:51 ` Andrey Shinkevich
2020-08-21 15:29 ` Kevin Wolf
2020-08-24 12:42 ` Max Reitz
2020-06-25 15:22 ` [PATCH v7 38/47] block: Drop backing_bs() Max Reitz
2020-07-24 15:55 ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 39/47] blockdev: Fix active commit choice Max Reitz
2020-08-21 15:50 ` Kevin Wolf
2020-08-24 13:18 ` Max Reitz
2020-08-24 14:07 ` Kevin Wolf
2020-08-24 14:41 ` Max Reitz
2020-08-24 15:06 ` Kevin Wolf [this message]
2020-06-25 15:22 ` [PATCH v7 40/47] block: Inline bdrv_co_block_status_from_*() Max Reitz
2020-07-24 18:00 ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 41/47] block: Leave BDS.backing_file constant Max Reitz
2020-07-27 12:27 ` Andrey Shinkevich
2020-07-28 14:10 ` Max Reitz
2020-08-24 13:14 ` Kevin Wolf
2020-08-24 14:29 ` Max Reitz
2020-06-25 15:22 ` [PATCH v7 42/47] iotests: Test that qcow2's data-file is flushed Max Reitz
2020-07-27 13:28 ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 43/47] iotests: Let complete_and_wait() work with commit Max Reitz
2020-07-27 13:35 ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 44/47] iotests: Add filter commit test cases Max Reitz
2020-07-27 17:45 ` Andrey Shinkevich
2020-07-28 14:00 ` Max Reitz
2020-06-25 15:22 ` [PATCH v7 45/47] iotests: Add filter mirror " Max Reitz
2020-08-02 11:05 ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 46/47] iotests: Add test for commit in sub directory Max Reitz
2020-08-02 12:13 ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 47/47] iotests: Test committing to overridden backing Max Reitz
2020-08-02 11:43 ` Andrey Shinkevich
2020-07-08 17:20 ` [PATCH v7 00/47] block: Deal with filters Andrey Shinkevich
2020-07-08 17:32 ` Eric Blake
2020-07-08 19:46 ` Andrey Shinkevich
2020-07-08 20:37 ` Eric Blake
2020-07-09 8:19 ` Max Reitz
2020-07-08 20:47 ` Eric Blake
2020-07-09 8:20 ` Max Reitz
2020-07-09 9:04 ` Andrey Shinkevich
2020-08-24 15:15 ` Kevin Wolf
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=20200824150614.GC10708@linux.fritz.box \
--to=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.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 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.