[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 09/46] block: Default .bdrv_child_perm() for format d
From: |
Kevin Wolf |
Subject: |
[Qemu-block] [PULL 09/46] block: Default .bdrv_child_perm() for format drivers |
Date: |
Tue, 28 Feb 2017 21:36:08 +0100 |
Almost all format drivers have the same characteristics as far as
permissions are concerned: They have one or more children for storing
their own data and, more importantly, metadata (can be written to and
grow even without external write requests, must be protected against
other writers and present consistent data) and optionally a backing file
(this is just data, so like for a filter, it only depends on what the
parent nodes need).
This provides a default implementation that can be shared by most of
our format drivers.
Signed-off-by: Kevin Wolf <address@hidden>
Acked-by: Fam Zheng <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
---
block.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
include/block/block_int.h | 8 ++++++++
2 files changed, 52 insertions(+)
diff --git a/block.c b/block.c
index 064e9d7..d67819f 100644
--- a/block.c
+++ b/block.c
@@ -1560,6 +1560,50 @@ void bdrv_filter_default_perms(BlockDriverState *bs,
BdrvChild *c,
(c->shared_perm & DEFAULT_PERM_UNCHANGED);
}
+void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
+ const BdrvChildRole *role,
+ uint64_t perm, uint64_t shared,
+ uint64_t *nperm, uint64_t *nshared)
+{
+ bool backing = (role == &child_backing);
+ assert(role == &child_backing || role == &child_file);
+
+ if (!backing) {
+ /* Apart from the modifications below, the same permissions are
+ * forwarded and left alone as for filters */
+ bdrv_filter_default_perms(bs, c, role, perm, shared, &perm, &shared);
+
+ /* Format drivers may touch metadata even if the guest doesn't write */
+ if (!bdrv_is_read_only(bs)) {
+ 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. */
+ perm |= BLK_PERM_CONSISTENT_READ;
+ shared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
+ } else {
+ /* We want consistent read from backing files if the parent needs it.
+ * No other operations are performed on backing files. */
+ perm &= BLK_PERM_CONSISTENT_READ;
+
+ /* If the parent can deal with changing data, we're okay with a
+ * writable and resizable backing file. */
+ /* TODO Require !(perm & BLK_PERM_CONSISTENT_READ), too? */
+ if (shared & BLK_PERM_WRITE) {
+ shared = BLK_PERM_WRITE | BLK_PERM_RESIZE;
+ } else {
+ shared = 0;
+ }
+
+ shared |= BLK_PERM_CONSISTENT_READ | BLK_PERM_GRAPH_MOD |
+ BLK_PERM_WRITE_UNCHANGED;
+ }
+
+ *nperm = perm;
+ *nshared = shared;
+}
+
static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs,
bool check_new_perm)
{
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 17f4c2d..eb0598e 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -880,6 +880,14 @@ void bdrv_filter_default_perms(BlockDriverState *bs,
BdrvChild *c,
uint64_t perm, uint64_t shared,
uint64_t *nperm, uint64_t *nshared);
+/* Default implementation for BlockDriver.bdrv_child_perm() that can be used by
+ * (non-raw) image formats: Like above for bs->backing, but for bs->file it
+ * requires WRITE | RESIZE for read-write images, always requires
+ * CONSISTENT_READ and doesn't share WRITE. */
+void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
+ const BdrvChildRole *role,
+ uint64_t perm, uint64_t shared,
+ uint64_t *nperm, uint64_t *nshared);
const char *bdrv_get_parent_name(const BlockDriverState *bs);
void blk_dev_change_media_cb(BlockBackend *blk, bool load);
--
1.8.3.1
- [Qemu-block] [PULL 02/46] option: Tweak invalid size error message and unbreak iotest 049, (continued)
- [Qemu-block] [PULL 02/46] option: Tweak invalid size error message and unbreak iotest 049, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 03/46] block: Add op blocker permission constants, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 01/46] qemu-img: make convert async, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 04/46] block: Add Error argument to bdrv_attach_child(), Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 05/46] block: Let callers request permissions when attaching a child node, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 07/46] block: Default .bdrv_child_perm() for filter drivers, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 06/46] block: Involve block drivers in permission granting, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 08/46] block: Request child permissions in filter drivers, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 11/46] vvfat: Implement .bdrv_child_perm(), Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 10/46] block: Request child permissions in format drivers, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 09/46] block: Default .bdrv_child_perm() for format drivers,
Kevin Wolf <=
- [Qemu-block] [PULL 12/46] block: Require .bdrv_child_perm() with child nodes, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 13/46] block: Request real permissions in bdrv_attach_child(), Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 14/46] block: Add permissions to BlockBackend, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 15/46] block: Add permissions to blk_new(), Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 16/46] block: Add error parameter to blk_insert_bs(), Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 17/46] block: Add BDRV_O_RESIZE for blk_new_open(), Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 18/46] block: Request real permissions in blk_new_open(), Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 19/46] block: Allow error return in BlockDevOps.change_media_cb(), Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 20/46] hw/block: Request permissions, Kevin Wolf, 2017/02/28
- [Qemu-block] [PULL 21/46] hw/block: Introduce share-rw qdev property, Kevin Wolf, 2017/02/28