From: Max Reitz <mreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
qemu-devel@nongnu.org, Max Reitz <mreitz@redhat.com>
Subject: [PATCH v4 18/34] block: Relax *perms_for_storage for data children
Date: Wed, 13 May 2020 13:05:28 +0200 [thread overview]
Message-ID: <20200513110544.176672-19-mreitz@redhat.com> (raw)
In-Reply-To: <20200513110544.176672-1-mreitz@redhat.com>
We can be less restrictive about pure data children than those with
metadata on them, so let bdrv_default_perms_for_storage() handle
metadata children differently from pure data children.
As explained in the code, the restrictions on metadata children are
strictly stricter than those for pure data children, so in theory we
just have to distinguish between pure-data and all other storage
children (pure metadata or data+metadata). In practice, that is not
obvious, though, so we have two independent code paths for metadata and
for data children, and data+metadata children will go through both
(without the path for data children doing anything meaningful).
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 48 insertions(+), 10 deletions(-)
diff --git a/block.c b/block.c
index 5d17aa1cc3..5ff6cbd796 100644
--- a/block.c
+++ b/block.c
@@ -2528,19 +2528,57 @@ static void bdrv_default_perms_for_storage(BlockDriverState *bs, BdrvChild *c,
bdrv_filter_default_perms(bs, c, child_class, role, reopen_queue,
perm, shared, &perm, &shared);
- /* Format drivers may touch metadata even if the guest doesn't write */
- if (bdrv_is_writable_after_reopen(bs, reopen_queue)) {
- perm |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
+ if (role & BDRV_CHILD_METADATA) {
+ /* Format drivers may touch metadata even if the guest doesn't write */
+ if (bdrv_is_writable_after_reopen(bs, reopen_queue)) {
+ perm |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
+ }
+
+ /*
+ * bs->file always needs to be consistent because of the
+ * metadata. We can never allow other users to resize or write
+ * to it.
+ */
+ if (!(flags & BDRV_O_NO_IO)) {
+ perm |= BLK_PERM_CONSISTENT_READ;
+ }
+ shared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
}
- /*
- * bs->file always needs to be consistent because of the metadata. We
- * can never allow other users to resize or write to it.
- */
- if (!(flags & BDRV_O_NO_IO)) {
- perm |= BLK_PERM_CONSISTENT_READ;
+ if (role & BDRV_CHILD_DATA) {
+ /*
+ * Technically, everything in this block is a subset of the
+ * BDRV_CHILD_METADATA path taken above, and so this could
+ * be an "else if" branch. However, that is not obvious, and
+ * this function is not performance critical, therefore we let
+ * this be an independent "if".
+ */
+
+ /*
+ * We cannot allow other users to resize the file because the
+ * format driver might have some assumptions about the size
+ * (e.g. because it is stored in metadata, or because the file
+ * is split into fixed-size data files).
+ */
+ shared &= ~BLK_PERM_RESIZE;
+
+ /*
+ * WRITE_UNCHANGED often cannot be performed as such on the
+ * data file. For example, the qcow2 driver may still need to
+ * write copied clusters on copy-on-read.
+ */
+ if (perm & BLK_PERM_WRITE_UNCHANGED) {
+ perm |= BLK_PERM_WRITE;
+ }
+
+ /*
+ * If the data file is written to, the format driver may
+ * expect to be able to resize it by writing beyond the EOF.
+ */
+ if (perm & BLK_PERM_WRITE) {
+ perm |= BLK_PERM_RESIZE;
+ }
}
- shared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
if (bs->open_flags & BDRV_O_INACTIVE) {
shared |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
--
2.26.2
next prev parent reply other threads:[~2020-05-13 11:19 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-13 11:05 [PATCH v4 00/34] block: Introduce real BdrvChildRole Max Reitz
2020-05-13 11:05 ` [PATCH v4 01/34] block: Mark commit, mirror, blkreplay as filters Max Reitz
2020-05-13 11:05 ` [PATCH v4 02/34] block: Add BlockDriver.is_format Max Reitz
2020-05-13 11:05 ` [PATCH v4 03/34] block: Rename BdrvChildRole to BdrvChildClass Max Reitz
2020-05-13 11:05 ` [PATCH v4 04/34] block: Add BdrvChildRole and BdrvChildRoleBits Max Reitz
2020-05-13 17:36 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 05/34] block: Add BdrvChildRole to BdrvChild Max Reitz
2020-05-13 11:05 ` [PATCH v4 06/34] block: Pass BdrvChildRole to bdrv_child_perm() Max Reitz
2020-05-13 11:05 ` [PATCH v4 07/34] block: Pass BdrvChildRole to .inherit_options() Max Reitz
2020-05-13 11:05 ` [PATCH v4 08/34] block: Pass parent_is_format " Max Reitz
2020-05-13 11:05 ` [PATCH v4 09/34] block: Rename bdrv_inherited_options() Max Reitz
2020-05-13 11:05 ` [PATCH v4 10/34] block: Add generic bdrv_inherited_options() Max Reitz
2020-05-13 20:13 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 11/34] block: Use bdrv_inherited_options() Max Reitz
2020-05-13 20:18 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 12/34] block: Unify bdrv_child_cb_attach() Max Reitz
2020-05-13 20:26 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 13/34] block: Unify bdrv_child_cb_detach() Max Reitz
2020-05-13 20:27 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 14/34] block: Add child_of_bds Max Reitz
2020-05-13 20:29 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 15/34] block: Distinguish paths in *_format_default_perms Max Reitz
2020-05-13 20:30 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 16/34] block: Pull out bdrv_default_perms_for_cow() Max Reitz
2020-05-13 20:33 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 17/34] block: Pull out bdrv_default_perms_for_storage() Max Reitz
2020-05-13 11:05 ` Max Reitz [this message]
2020-05-13 20:38 ` [PATCH v4 18/34] block: Relax *perms_for_storage for data children Eric Blake
2020-05-13 11:05 ` [PATCH v4 19/34] block: Add bdrv_default_perms() Max Reitz
2020-05-13 20:43 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 20/34] raw-format: Split raw_read_options() Max Reitz
2020-05-13 11:05 ` [PATCH v4 21/34] block: Switch child_format users to child_of_bds Max Reitz
2020-05-13 11:05 ` [PATCH v4 22/34] block: Drop child_format Max Reitz
2020-05-13 11:05 ` [PATCH v4 23/34] block: Make backing files child_of_bds children Max Reitz
2020-05-13 20:46 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 24/34] block: Drop child_backing Max Reitz
2020-05-13 20:47 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 25/34] block: Make format drivers use child_of_bds Max Reitz
2020-05-13 11:05 ` [PATCH v4 26/34] block: Make filter " Max Reitz
2020-05-13 21:02 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 27/34] block: Use child_of_bds in remaining places Max Reitz
2020-05-13 21:08 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 28/34] tests: Use child_of_bds instead of child_file Max Reitz
2020-05-13 11:05 ` [PATCH v4 29/34] block: Use bdrv_default_perms() Max Reitz
2020-05-13 11:05 ` [PATCH v4 30/34] block: Make bdrv_filter_default_perms() static Max Reitz
2020-05-13 11:05 ` [PATCH v4 31/34] block: Drop bdrv_format_default_perms() Max Reitz
2020-05-13 11:05 ` [PATCH v4 32/34] block: Drop child_file Max Reitz
2020-05-13 21:11 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 33/34] block: Pass BdrvChildRole in remaining cases Max Reitz
2020-05-13 21:12 ` Eric Blake
2020-05-13 11:05 ` [PATCH v4 34/34] block: Drop @child_class from bdrv_child_perm() Max Reitz
2020-05-13 21:15 ` Eric Blake
2020-05-13 16:36 ` [PATCH v4 00/34] block: Introduce real BdrvChildRole Kevin Wolf
2020-05-14 13:44 ` 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=20200513110544.176672-19-mreitz@redhat.com \
--to=mreitz@redhat.com \
--cc=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 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).