[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: |
Kevin Wolf |
Subject: |
Re: [Qemu-block] [RFC PATCH 09/41] block: Default .bdrv_child_perm() for format drivers |
Date: |
Tue, 14 Feb 2017 11:37:28 +0100 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
Am 14.02.2017 um 07:01 hat Fam Zheng geschrieben:
> On Mon, 02/13 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;
>
> Do you mean "perm &= ~BLK_PERM_CONSISTENT_READ"?
No. As the comment explains, we want to "forward" the CONSISTENT_READ
permission and clear everything else.
Kevin
[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