[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [RFC PATCH 09/41] block: Default .bdrv_child_perm() for
From: |
Max Reitz |
Subject: |
Re: [Qemu-block] [RFC PATCH 09/41] block: Default .bdrv_child_perm() for format drivers |
Date: |
Wed, 15 Feb 2017 18:11:41 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 |
On 13.02.2017 18:22, Kevin Wolf wrote:
> 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>
> ---
> block.c | 37 +++++++++++++++++++++++++++++++++++++
> include/block/block_int.h | 8 ++++++++
> 2 files changed, 45 insertions(+)
>
> diff --git a/block.c b/block.c
> index 290768d..8e99bb5 100644
> --- a/block.c
> +++ b/block.c
> @@ -1459,6 +1459,43 @@ 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 backing file. */
Are we OK with a resizable backing file, too? I'm not sure, actually.
Maybe we should just forbid it and hope nobody asks for it.
Max
> + shared &= BLK_PERM_WRITE;
> + 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)
> {
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index 2d74f92..46f51a6 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -885,6 +885,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);
>
signature.asc
Description: OpenPGP digital signature
- Re: [Qemu-block] [RFC PATCH 06/41] block: Involve block drivers in permission granting, (continued)
[Qemu-block] [RFC PATCH 07/41] block: Default .bdrv_child_perm() for filter drivers, Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 08/41] block: Request child permissions in filter drivers, Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 09/41] block: Default .bdrv_child_perm() for format drivers, Kevin Wolf, 2017/02/13
Re: [Qemu-block] [RFC PATCH 09/41] block: Default .bdrv_child_perm() for format drivers,
Max Reitz <=
[Qemu-block] [RFC PATCH 10/41] block: Request child permissions in format drivers, Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 11/41] vvfat: Implement .bdrv_child_perm(), Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 12/41] block: Require .bdrv_child_perm() with child nodes, Kevin Wolf, 2017/02/13
[Qemu-block] [RFC PATCH 13/41] block: Request real permissions in bdrv_attach_child(), Kevin Wolf, 2017/02/13