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 for-5.0 22/31] block: Make format drivers use child_of_bds
Date: Wed, 27 Nov 2019 14:16:15 +0100 [thread overview]
Message-ID: <20191127131624.1062403-23-mreitz@redhat.com> (raw)
In-Reply-To: <20191127131624.1062403-1-mreitz@redhat.com>
Commonly, they need to pass the BDRV_CHILD_IMAGE set as the
BdrvChildRole; but there are exceptions for drivers with external data
files (qcow2 and vmdk).
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block/bochs.c | 4 ++--
block/cloop.c | 4 ++--
block/crypto.c | 4 ++--
block/dmg.c | 4 ++--
block/parallels.c | 4 ++--
block/qcow.c | 4 ++--
block/qcow2.c | 20 +++++++++++++++-----
block/qed.c | 4 ++--
block/vdi.c | 4 ++--
block/vhdx.c | 4 ++--
block/vmdk.c | 20 +++++++++++++++++---
block/vpc.c | 4 ++--
12 files changed, 52 insertions(+), 28 deletions(-)
diff --git a/block/bochs.c b/block/bochs.c
index cd399a4ad3..15f9807954 100644
--- a/block/bochs.c
+++ b/block/bochs.c
@@ -110,8 +110,8 @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags,
return ret;
}
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
diff --git a/block/cloop.c b/block/cloop.c
index 42a8b0f107..6662af7470 100644
--- a/block/cloop.c
+++ b/block/cloop.c
@@ -71,8 +71,8 @@ static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
return ret;
}
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
diff --git a/block/crypto.c b/block/crypto.c
index 737042010a..b5e31aee6f 100644
--- a/block/crypto.c
+++ b/block/crypto.c
@@ -200,8 +200,8 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
unsigned int cflags = 0;
QDict *cryptoopts = NULL;
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
diff --git a/block/dmg.c b/block/dmg.c
index 9fcd59af8d..479d764d82 100644
--- a/block/dmg.c
+++ b/block/dmg.c
@@ -439,8 +439,8 @@ static int dmg_open(BlockDriverState *bs, QDict *options, int flags,
return ret;
}
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
diff --git a/block/parallels.c b/block/parallels.c
index 769e4d0e29..8ff7bfcc40 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -728,8 +728,8 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
Error *local_err = NULL;
char *buf;
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
diff --git a/block/qcow.c b/block/qcow.c
index 3138894eab..c81a687195 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -130,8 +130,8 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
qdict_extract_subqdict(options, &encryptopts, "encrypt.");
encryptfmt = qdict_get_try_str(encryptopts, "format");
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
ret = -EINVAL;
goto fail;
diff --git a/block/qcow2.c b/block/qcow2.c
index 89a4e5a4e4..22d70ce62f 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1535,8 +1535,10 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
}
/* Open external data file */
- s->data_file = bdrv_open_child(NULL, options, "data-file", bs, &child_file,
- 0, true, &local_err);
+ s->data_file = bdrv_open_child(NULL, options, "data-file", bs,
+ &child_of_bds,
+ BDRV_CHILD_DATA | BDRV_CHILD_PROTOCOL,
+ true, &local_err);
if (local_err) {
error_propagate(errp, local_err);
ret = -EINVAL;
@@ -1546,7 +1548,9 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
if (s->incompatible_features & QCOW2_INCOMPAT_DATA_FILE) {
if (!s->data_file && s->image_data_file) {
s->data_file = bdrv_open_child(s->image_data_file, options,
- "data-file", bs, &child_file, 0,
+ "data-file", bs, &child_of_bds,
+ BDRV_CHILD_DATA |
+ BDRV_CHILD_PROTOCOL,
false, errp);
if (!s->data_file) {
ret = -EINVAL;
@@ -1558,6 +1562,12 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
ret = -EINVAL;
goto fail;
}
+
+ /* No data here */
+ bs->file->role &= ~BDRV_CHILD_DATA;
+
+ /* Must succeed because we have given up permissions if anything */
+ bdrv_child_refresh_perms(bs, bs->file, &error_abort);
} else {
if (s->data_file) {
error_setg(errp, "'data-file' can only be set for images with an "
@@ -1805,8 +1815,8 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
.ret = -EINPROGRESS
};
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
diff --git a/block/qed.c b/block/qed.c
index 2c30287b3c..eaa042c426 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -547,8 +547,8 @@ static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags,
.ret = -EINPROGRESS
};
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
diff --git a/block/vdi.c b/block/vdi.c
index 67eb41e45b..0046f7f332 100644
--- a/block/vdi.c
+++ b/block/vdi.c
@@ -378,8 +378,8 @@ static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
Error *local_err = NULL;
QemuUUID uuid_link, uuid_parent;
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
diff --git a/block/vhdx.c b/block/vhdx.c
index 0ac1b45994..4c7bbd3d51 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -997,8 +997,8 @@ static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
uint64_t signature;
Error *local_err = NULL;
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
diff --git a/block/vmdk.c b/block/vmdk.c
index 468401ce0c..41e7cc0c8d 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -1089,6 +1089,7 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
char *desc_file_dir = NULL;
char *extent_path;
BdrvChild *extent_file;
+ BdrvChildRole extent_role;
BDRVVmdkState *s = bs->opaque;
VmdkExtent *extent;
char extent_opt_prefix[32];
@@ -1151,8 +1152,15 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
ret = snprintf(extent_opt_prefix, 32, "extents.%d", s->num_extents);
assert(ret < 32);
+ extent_role = BDRV_CHILD_DATA | BDRV_CHILD_PROTOCOL;
+ if (strcmp(type, "FLAT") != 0 && strcmp(type, "VMFS") != 0) {
+ /* non-flat extents have metadata */
+ extent_role |= BDRV_CHILD_METADATA;
+ }
+
extent_file = bdrv_open_child(extent_path, options, extent_opt_prefix,
- bs, &child_file, 0, false, &local_err);
+ bs, &child_of_bds, extent_role, false,
+ &local_err);
g_free(extent_path);
if (local_err) {
error_propagate(errp, local_err);
@@ -1257,8 +1265,8 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
uint32_t magic;
Error *local_err = NULL;
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
@@ -1277,6 +1285,12 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
s->desc_offset = 0x200;
break;
default:
+ /* No data in the descriptor file */
+ bs->file->role &= ~BDRV_CHILD_DATA;
+
+ /* Must succeed because we have given up permissions if anything */
+ bdrv_child_refresh_perms(bs, bs->file, &error_abort);
+
ret = vmdk_open_desc_file(bs, flags, buf, options, errp);
break;
}
diff --git a/block/vpc.c b/block/vpc.c
index 6748dc369b..8cb64beef7 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -228,8 +228,8 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
int ret;
int64_t bs_size;
- bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file, 0,
- false, errp);
+ bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
+ BDRV_CHILD_IMAGE, false, errp);
if (!bs->file) {
return -EINVAL;
}
--
2.23.0
next prev parent reply other threads:[~2019-11-27 13:41 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-27 13:15 [PATCH for-5.0 00/31] block: Introduce real BdrvChildRole Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 01/31] block: Rename BdrvChildRole to BdrvChildClass Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 02/31] block: Add BdrvChildRole Max Reitz
2019-11-28 9:31 ` Vladimir Sementsov-Ogievskiy
2019-11-28 10:52 ` Max Reitz
2019-11-28 11:24 ` Vladimir Sementsov-Ogievskiy
2019-11-28 14:00 ` Max Reitz
2019-11-28 14:12 ` Kevin Wolf
2019-11-28 16:36 ` Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 03/31] block: Add BdrvChildRole to BdrvChild Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 04/31] block: Pass BdrvChildRole to bdrv_child_perm() Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 05/31] block: Drop BdrvChildClass.stay_at_node Max Reitz
2019-11-27 13:15 ` [PATCH for-5.0 06/31] block: Keep BDRV_O_NO_IO in *inherited_fmt_options Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 07/31] block: Pass BdrvChildRole to .inherit_options() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 08/31] block: Unify bdrv_*inherited_options() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 09/31] block: Unify bdrv_child_cb_attach() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 10/31] block: Unify bdrv_child_cb_detach() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 11/31] block: Add child_of_bds Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 12/31] block: Distinguish paths in *_format_default_perms Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 13/31] block: Pull out bdrv_default_perms_for_backing() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 14/31] block: Pull out bdrv_default_perms_for_storage() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 15/31] block: Split bdrv_default_perms_for_storage() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 16/31] block: Add bdrv_default_perms() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 17/31] raw-format: Split raw_read_options() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 18/31] block: Switch child_format users to child_of_bds Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 19/31] block: Drop child_format Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 20/31] block: Make backing files child_of_bds children Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 21/31] block: Drop child_backing Max Reitz
2019-11-27 13:16 ` Max Reitz [this message]
2019-11-27 13:16 ` [PATCH for-5.0 23/31] block: Make filter drivers use child_of_bds Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 24/31] block: Use child_of_bds in remaining places Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 25/31] tests: Use child_of_bds instead of child_file Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 26/31] block: Use bdrv_default_perms() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 27/31] block: Make bdrv_filter_default_perms() static Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 28/31] block: Drop bdrv_format_default_perms() Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 29/31] block: Drop child_file Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 30/31] block: Pass BdrvChildRole in remaining cases Max Reitz
2019-11-27 13:16 ` [PATCH for-5.0 31/31] block: Drop @child_class from bdrv_child_perm() 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=20191127131624.1062403-23-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).