block: Add bdrv_child_refresh_perms()
If a block node uses bdrv_child_try_set_perm() to change the permission it takes on its child, the result may be very short-lived. If anything makes the block layer recalculate the permissions internally, it will invoke the node driver's .bdrv_child_perm() implementation. The permission/shared permissions masks that returns will then override the values previously passed to bdrv_child_try_set_perm(). If drivers want a child edge to have specific values for the permissions/shared permissions mask, it must return them in .bdrv_child_perm(). Consequentially, there is no need for them to pass the same values to bdrv_child_try_set_perm() then: It is better to have a function that invokes .bdrv_child_perm() and calls bdrv_child_try_set_perm() with the result. This patch adds such a function under the name of bdrv_child_refresh_perms(). Signed-off-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
094e363944
commit
c1087f1206
12
block.c
12
block.c
@ -2083,6 +2083,18 @@ int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bdrv_child_refresh_perms(BlockDriverState *bs, BdrvChild *c, Error **errp)
|
||||||
|
{
|
||||||
|
uint64_t parent_perms, parent_shared;
|
||||||
|
uint64_t perms, shared;
|
||||||
|
|
||||||
|
bdrv_get_cumulative_perm(bs, &parent_perms, &parent_shared);
|
||||||
|
bdrv_child_perm(bs, c->bs, c, c->role, NULL, parent_perms, parent_shared,
|
||||||
|
&perms, &shared);
|
||||||
|
|
||||||
|
return bdrv_child_try_set_perm(c, perms, shared, errp);
|
||||||
|
}
|
||||||
|
|
||||||
void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c,
|
void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c,
|
||||||
const BdrvChildRole *role,
|
const BdrvChildRole *role,
|
||||||
BlockReopenQueue *reopen_queue,
|
BlockReopenQueue *reopen_queue,
|
||||||
|
@ -1165,9 +1165,24 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs,
|
|||||||
void *opaque, Error **errp);
|
void *opaque, Error **errp);
|
||||||
void bdrv_root_unref_child(BdrvChild *child);
|
void bdrv_root_unref_child(BdrvChild *child);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a BdrvChild's permissions. Avoid if the parent is a BDS; use
|
||||||
|
* bdrv_child_refresh_perms() instead and make the parent's
|
||||||
|
* .bdrv_child_perm() implementation return the correct values.
|
||||||
|
*/
|
||||||
int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
|
int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls bs->drv->bdrv_child_perm() and updates the child's permission
|
||||||
|
* masks with the result.
|
||||||
|
* Drivers should invoke this function whenever an event occurs that
|
||||||
|
* makes their .bdrv_child_perm() implementation return different
|
||||||
|
* values than before, but which will not result in the block layer
|
||||||
|
* automatically refreshing the permissions.
|
||||||
|
*/
|
||||||
|
int bdrv_child_refresh_perms(BlockDriverState *bs, BdrvChild *c, Error **errp);
|
||||||
|
|
||||||
/* Default implementation for BlockDriver.bdrv_child_perm() that can be used by
|
/* Default implementation for BlockDriver.bdrv_child_perm() that can be used by
|
||||||
* block filters: Forward CONSISTENT_READ, WRITE, WRITE_UNCHANGED and RESIZE to
|
* block filters: Forward CONSISTENT_READ, WRITE, WRITE_UNCHANGED and RESIZE to
|
||||||
* all children */
|
* all children */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user