block: Default .bdrv_child_perm() for filter drivers
Most filters need permissions related to read and write for their children, but only if the node has a parent that wants to use the same operation on the filter. The same is true for resize. This adds a default implementation that simply forwards all necessary permissions to all children of the node and leaves the other permissions unchanged. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Acked-by: Fam Zheng <famz@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
33a610c398
commit
6a1b9ee152
23
block.c
23
block.c
@ -1537,6 +1537,29 @@ int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DEFAULT_PERM_PASSTHROUGH (BLK_PERM_CONSISTENT_READ \
|
||||||
|
| BLK_PERM_WRITE \
|
||||||
|
| BLK_PERM_WRITE_UNCHANGED \
|
||||||
|
| BLK_PERM_RESIZE)
|
||||||
|
#define DEFAULT_PERM_UNCHANGED (BLK_PERM_ALL & ~DEFAULT_PERM_PASSTHROUGH)
|
||||||
|
|
||||||
|
void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c,
|
||||||
|
const BdrvChildRole *role,
|
||||||
|
uint64_t perm, uint64_t shared,
|
||||||
|
uint64_t *nperm, uint64_t *nshared)
|
||||||
|
{
|
||||||
|
if (c == NULL) {
|
||||||
|
*nperm = perm & DEFAULT_PERM_PASSTHROUGH;
|
||||||
|
*nshared = (shared & DEFAULT_PERM_PASSTHROUGH) | DEFAULT_PERM_UNCHANGED;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*nperm = (perm & DEFAULT_PERM_PASSTHROUGH) |
|
||||||
|
(c->perm & DEFAULT_PERM_UNCHANGED);
|
||||||
|
*nshared = (shared & DEFAULT_PERM_PASSTHROUGH) |
|
||||||
|
(c->shared_perm & DEFAULT_PERM_UNCHANGED);
|
||||||
|
}
|
||||||
|
|
||||||
static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs,
|
static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs,
|
||||||
bool check_new_perm)
|
bool check_new_perm)
|
||||||
{
|
{
|
||||||
|
@ -872,6 +872,14 @@ void bdrv_child_abort_perm_update(BdrvChild *c);
|
|||||||
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);
|
||||||
|
|
||||||
|
/* Default implementation for BlockDriver.bdrv_child_perm() that can be used by
|
||||||
|
* block filters: Forward CONSISTENT_READ, WRITE, WRITE_UNCHANGED and RESIZE to
|
||||||
|
* all children */
|
||||||
|
void bdrv_filter_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);
|
const char *bdrv_get_parent_name(const BlockDriverState *bs);
|
||||||
void blk_dev_change_media_cb(BlockBackend *blk, bool load);
|
void blk_dev_change_media_cb(BlockBackend *blk, bool load);
|
||||||
|
Loading…
Reference in New Issue
Block a user