|
|
9bac43 |
From 4233c105ab4dc42ea8252717a0b68ee387ef8ed8 Mon Sep 17 00:00:00 2001
|
|
|
9bac43 |
From: Kevin Wolf <kwolf@redhat.com>
|
|
|
9bac43 |
Date: Mon, 4 Dec 2017 12:10:01 +0100
|
|
|
9bac43 |
Subject: [PATCH 30/36] block: Add reopen_queue to bdrv_child_perm()
|
|
|
9bac43 |
|
|
|
9bac43 |
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
|
|
9bac43 |
Message-id: <20171204121007.12964-3-kwolf@redhat.com>
|
|
|
9bac43 |
Patchwork-id: 78105
|
|
|
9bac43 |
O-Subject: [RHV-7.5 qemu-kvm-rhev PATCH v2 2/8] block: Add reopen_queue to bdrv_child_perm()
|
|
|
9bac43 |
Bugzilla: 1492178
|
|
|
9bac43 |
RH-Acked-by: Fam Zheng <famz@redhat.com>
|
|
|
9bac43 |
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
|
9bac43 |
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
|
|
|
9bac43 |
|
|
|
9bac43 |
In the context of bdrv_reopen(), we'll have to look at the state of the
|
|
|
9bac43 |
graph as it will be after the reopen. This interface addition is in
|
|
|
9bac43 |
preparation for the change.
|
|
|
9bac43 |
|
|
|
9bac43 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
9bac43 |
Reviewed-by: Eric Blake <eblake@redhat.com>
|
|
|
9bac43 |
(cherry picked from commit e0995dc3da0894d0a8260bddaa200a4cd7809ba4)
|
|
|
9bac43 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9bac43 |
---
|
|
|
9bac43 |
block.c | 19 ++++++++++++-------
|
|
|
9bac43 |
block/commit.c | 1 +
|
|
|
9bac43 |
block/mirror.c | 1 +
|
|
|
9bac43 |
block/replication.c | 1 +
|
|
|
9bac43 |
block/vvfat.c | 1 +
|
|
|
9bac43 |
include/block/block_int.h | 7 +++++++
|
|
|
9bac43 |
6 files changed, 23 insertions(+), 7 deletions(-)
|
|
|
9bac43 |
|
|
|
9bac43 |
diff --git a/block.c b/block.c
|
|
|
9bac43 |
index 6fb4e98..ab67062 100644
|
|
|
9bac43 |
--- a/block.c
|
|
|
9bac43 |
+++ b/block.c
|
|
|
9bac43 |
@@ -1535,16 +1535,17 @@ static void bdrv_child_abort_perm_update(BdrvChild *c);
|
|
|
9bac43 |
static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared);
|
|
|
9bac43 |
|
|
|
9bac43 |
static void bdrv_child_perm(BlockDriverState *bs, BlockDriverState *child_bs,
|
|
|
9bac43 |
- BdrvChild *c,
|
|
|
9bac43 |
- const BdrvChildRole *role,
|
|
|
9bac43 |
+ BdrvChild *c, const BdrvChildRole *role,
|
|
|
9bac43 |
+ BlockReopenQueue *reopen_queue,
|
|
|
9bac43 |
uint64_t parent_perm, uint64_t parent_shared,
|
|
|
9bac43 |
uint64_t *nperm, uint64_t *nshared)
|
|
|
9bac43 |
{
|
|
|
9bac43 |
if (bs->drv && bs->drv->bdrv_child_perm) {
|
|
|
9bac43 |
- bs->drv->bdrv_child_perm(bs, c, role,
|
|
|
9bac43 |
+ bs->drv->bdrv_child_perm(bs, c, role, reopen_queue,
|
|
|
9bac43 |
parent_perm, parent_shared,
|
|
|
9bac43 |
nperm, nshared);
|
|
|
9bac43 |
}
|
|
|
9bac43 |
+ /* TODO Take force_share from reopen_queue */
|
|
|
9bac43 |
if (child_bs && child_bs->force_share) {
|
|
|
9bac43 |
*nshared = BLK_PERM_ALL;
|
|
|
9bac43 |
}
|
|
|
9bac43 |
@@ -1594,7 +1595,7 @@ static int bdrv_check_perm(BlockDriverState *bs, uint64_t cumulative_perms,
|
|
|
9bac43 |
/* Check all children */
|
|
|
9bac43 |
QLIST_FOREACH(c, &bs->children, next) {
|
|
|
9bac43 |
uint64_t cur_perm, cur_shared;
|
|
|
9bac43 |
- bdrv_child_perm(bs, c->bs, c, c->role,
|
|
|
9bac43 |
+ bdrv_child_perm(bs, c->bs, c, c->role, NULL,
|
|
|
9bac43 |
cumulative_perms, cumulative_shared_perms,
|
|
|
9bac43 |
&cur_perm, &cur_shared);
|
|
|
9bac43 |
ret = bdrv_child_check_perm(c, cur_perm, cur_shared, ignore_children,
|
|
|
9bac43 |
@@ -1656,7 +1657,7 @@ static void bdrv_set_perm(BlockDriverState *bs, uint64_t cumulative_perms,
|
|
|
9bac43 |
/* Update all children */
|
|
|
9bac43 |
QLIST_FOREACH(c, &bs->children, next) {
|
|
|
9bac43 |
uint64_t cur_perm, cur_shared;
|
|
|
9bac43 |
- bdrv_child_perm(bs, c->bs, c, c->role,
|
|
|
9bac43 |
+ bdrv_child_perm(bs, c->bs, c, c->role, NULL,
|
|
|
9bac43 |
cumulative_perms, cumulative_shared_perms,
|
|
|
9bac43 |
&cur_perm, &cur_shared);
|
|
|
9bac43 |
bdrv_child_set_perm(c, cur_perm, cur_shared);
|
|
|
9bac43 |
@@ -1825,6 +1826,7 @@ int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
|
|
|
9bac43 |
|
|
|
9bac43 |
void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
const BdrvChildRole *role,
|
|
|
9bac43 |
+ BlockReopenQueue *reopen_queue,
|
|
|
9bac43 |
uint64_t perm, uint64_t shared,
|
|
|
9bac43 |
uint64_t *nperm, uint64_t *nshared)
|
|
|
9bac43 |
{
|
|
|
9bac43 |
@@ -1842,6 +1844,7 @@ void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
|
|
|
9bac43 |
void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
const BdrvChildRole *role,
|
|
|
9bac43 |
+ BlockReopenQueue *reopen_queue,
|
|
|
9bac43 |
uint64_t perm, uint64_t shared,
|
|
|
9bac43 |
uint64_t *nperm, uint64_t *nshared)
|
|
|
9bac43 |
{
|
|
|
9bac43 |
@@ -1851,9 +1854,11 @@ void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
if (!backing) {
|
|
|
9bac43 |
/* Apart from the modifications below, the same permissions are
|
|
|
9bac43 |
* forwarded and left alone as for filters */
|
|
|
9bac43 |
- bdrv_filter_default_perms(bs, c, role, perm, shared, &perm, &shared);
|
|
|
9bac43 |
+ bdrv_filter_default_perms(bs, c, role, reopen_queue, perm, shared,
|
|
|
9bac43 |
+ &perm, &shared);
|
|
|
9bac43 |
|
|
|
9bac43 |
/* Format drivers may touch metadata even if the guest doesn't write */
|
|
|
9bac43 |
+ /* TODO Take flags from reopen_queue */
|
|
|
9bac43 |
if (bdrv_is_writable(bs)) {
|
|
|
9bac43 |
perm |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
|
|
|
9bac43 |
}
|
|
|
9bac43 |
@@ -1997,7 +2002,7 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
|
|
|
9bac43 |
|
|
|
9bac43 |
assert(parent_bs->drv);
|
|
|
9bac43 |
assert(bdrv_get_aio_context(parent_bs) == bdrv_get_aio_context(child_bs));
|
|
|
9bac43 |
- bdrv_child_perm(parent_bs, child_bs, NULL, child_role,
|
|
|
9bac43 |
+ bdrv_child_perm(parent_bs, child_bs, NULL, child_role, NULL,
|
|
|
9bac43 |
perm, shared_perm, &perm, &shared_perm);
|
|
|
9bac43 |
|
|
|
9bac43 |
child = bdrv_root_attach_child(child_bs, child_name, child_role,
|
|
|
9bac43 |
diff --git a/block/commit.c b/block/commit.c
|
|
|
9bac43 |
index c7857c3..834084b 100644
|
|
|
9bac43 |
--- a/block/commit.c
|
|
|
9bac43 |
+++ b/block/commit.c
|
|
|
9bac43 |
@@ -267,6 +267,7 @@ static void bdrv_commit_top_close(BlockDriverState *bs)
|
|
|
9bac43 |
|
|
|
9bac43 |
static void bdrv_commit_top_child_perm(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
const BdrvChildRole *role,
|
|
|
9bac43 |
+ BlockReopenQueue *reopen_queue,
|
|
|
9bac43 |
uint64_t perm, uint64_t shared,
|
|
|
9bac43 |
uint64_t *nperm, uint64_t *nshared)
|
|
|
9bac43 |
{
|
|
|
9bac43 |
diff --git a/block/mirror.c b/block/mirror.c
|
|
|
9bac43 |
index 429751b..17278db 100644
|
|
|
9bac43 |
--- a/block/mirror.c
|
|
|
9bac43 |
+++ b/block/mirror.c
|
|
|
9bac43 |
@@ -1094,6 +1094,7 @@ static void bdrv_mirror_top_close(BlockDriverState *bs)
|
|
|
9bac43 |
|
|
|
9bac43 |
static void bdrv_mirror_top_child_perm(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
const BdrvChildRole *role,
|
|
|
9bac43 |
+ BlockReopenQueue *reopen_queue,
|
|
|
9bac43 |
uint64_t perm, uint64_t shared,
|
|
|
9bac43 |
uint64_t *nperm, uint64_t *nshared)
|
|
|
9bac43 |
{
|
|
|
9bac43 |
diff --git a/block/replication.c b/block/replication.c
|
|
|
9bac43 |
index bf4462c..3a4e682 100644
|
|
|
9bac43 |
--- a/block/replication.c
|
|
|
9bac43 |
+++ b/block/replication.c
|
|
|
9bac43 |
@@ -157,6 +157,7 @@ static void replication_close(BlockDriverState *bs)
|
|
|
9bac43 |
|
|
|
9bac43 |
static void replication_child_perm(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
const BdrvChildRole *role,
|
|
|
9bac43 |
+ BlockReopenQueue *reopen_queue,
|
|
|
9bac43 |
uint64_t perm, uint64_t shared,
|
|
|
9bac43 |
uint64_t *nperm, uint64_t *nshared)
|
|
|
9bac43 |
{
|
|
|
9bac43 |
diff --git a/block/vvfat.c b/block/vvfat.c
|
|
|
9bac43 |
index a9e207f..e9110a9 100644
|
|
|
9bac43 |
--- a/block/vvfat.c
|
|
|
9bac43 |
+++ b/block/vvfat.c
|
|
|
9bac43 |
@@ -3210,6 +3210,7 @@ err:
|
|
|
9bac43 |
|
|
|
9bac43 |
static void vvfat_child_perm(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
const BdrvChildRole *role,
|
|
|
9bac43 |
+ BlockReopenQueue *reopen_queue,
|
|
|
9bac43 |
uint64_t perm, uint64_t shared,
|
|
|
9bac43 |
uint64_t *nperm, uint64_t *nshared)
|
|
|
9bac43 |
{
|
|
|
9bac43 |
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
|
|
9bac43 |
index 7571c0a..a6faf1b 100644
|
|
|
9bac43 |
--- a/include/block/block_int.h
|
|
|
9bac43 |
+++ b/include/block/block_int.h
|
|
|
9bac43 |
@@ -377,9 +377,14 @@ struct BlockDriver {
|
|
|
9bac43 |
*
|
|
|
9bac43 |
* If @c is NULL, return the permissions for attaching a new child for the
|
|
|
9bac43 |
* given @role.
|
|
|
9bac43 |
+ *
|
|
|
9bac43 |
+ * If @reopen_queue is non-NULL, don't return the currently needed
|
|
|
9bac43 |
+ * permissions, but those that will be needed after applying the
|
|
|
9bac43 |
+ * @reopen_queue.
|
|
|
9bac43 |
*/
|
|
|
9bac43 |
void (*bdrv_child_perm)(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
const BdrvChildRole *role,
|
|
|
9bac43 |
+ BlockReopenQueue *reopen_queue,
|
|
|
9bac43 |
uint64_t parent_perm, uint64_t parent_shared,
|
|
|
9bac43 |
uint64_t *nperm, uint64_t *nshared);
|
|
|
9bac43 |
|
|
|
9bac43 |
@@ -949,6 +954,7 @@ int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
|
|
|
9bac43 |
* all children */
|
|
|
9bac43 |
void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
const BdrvChildRole *role,
|
|
|
9bac43 |
+ BlockReopenQueue *reopen_queue,
|
|
|
9bac43 |
uint64_t perm, uint64_t shared,
|
|
|
9bac43 |
uint64_t *nperm, uint64_t *nshared);
|
|
|
9bac43 |
|
|
|
9bac43 |
@@ -958,6 +964,7 @@ void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
* CONSISTENT_READ and doesn't share WRITE. */
|
|
|
9bac43 |
void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
|
|
|
9bac43 |
const BdrvChildRole *role,
|
|
|
9bac43 |
+ BlockReopenQueue *reopen_queue,
|
|
|
9bac43 |
uint64_t perm, uint64_t shared,
|
|
|
9bac43 |
uint64_t *nperm, uint64_t *nshared);
|
|
|
9bac43 |
|
|
|
9bac43 |
--
|
|
|
9bac43 |
1.8.3.1
|
|
|
9bac43 |
|