aboutsummaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>2021-08-24 11:38:32 +0300
committerHanna Reitz <hreitz@redhat.com>2021-09-01 14:03:47 +0200
commit3860c0201924d9f7f9b125b8bdda8a8627de4a08 (patch)
tree87e548245ee4ccb1fbb2de505cbcec8b0092eb6d /block
parentb518e9e9ef7a28aa559a05d44dd734e83ae75f9d (diff)
downloadqemu-3860c0201924d9f7f9b125b8bdda8a8627de4a08.zip
qemu-3860c0201924d9f7f9b125b8bdda8a8627de4a08.tar.gz
qemu-3860c0201924d9f7f9b125b8bdda8a8627de4a08.tar.bz2
block/copy-before-write: relax permission requirements when no parents
We are going to publish copy-before-write filter. So, user should be able to create it with blockdev-add first, specifying both filtered and target children. And then do blockdev-reopen, to actually insert the filter where needed. Currently, filter unshares write permission unconditionally on source node. It's good, but it will not allow to do blockdev-add. So, let's relax restrictions when filter doesn't have any parent. Test output is modified, as now permission conflict happens only when job creates a blk parent for filter node. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-Id: <20210824083856.17408-11-vsementsov@virtuozzo.com> Signed-off-by: Hanna Reitz <hreitz@redhat.com>
Diffstat (limited to 'block')
-rw-r--r--block/copy-before-write.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
index a7996d5..2a51cc6 100644
--- a/block/copy-before-write.c
+++ b/block/copy-before-write.c
@@ -142,10 +142,12 @@ static void cbw_child_perm(BlockDriverState *bs, BdrvChild *c,
bdrv_default_perms(bs, c, role, reopen_queue,
perm, shared, nperm, nshared);
- if (perm & BLK_PERM_WRITE) {
- *nperm = *nperm | BLK_PERM_CONSISTENT_READ;
+ if (!QLIST_EMPTY(&bs->parents)) {
+ if (perm & BLK_PERM_WRITE) {
+ *nperm = *nperm | BLK_PERM_CONSISTENT_READ;
+ }
+ *nshared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
}
- *nshared &= ~(BLK_PERM_WRITE | BLK_PERM_RESIZE);
}
}