Re: [PATCH for-5.0 v2 05/23] quorum: Fix child permissions

2019-11-29 Thread Vladimir Sementsov-Ogievskiy
11.11.2019 19:01, Max Reitz wrote:
> Quorum cannot share WRITE or RESIZE on its children.  Presumably, it
> only does so because as a filter, it seemed intuitively correct to point
> its .bdrv_child_perm to bdrv_filter_default_perm().
> 
> However, it is not really a filter, and bdrv_filter_default_perm() does
> not work for it, so we have to provide a custom .bdrv_child_perm
> implementation.
> 
> Signed-off-by: Max Reitz

Reviewed-by: Vladimir Sementsov-Ogievskiy 

-- 
Best regards,
Vladimir



[PATCH for-5.0 v2 05/23] quorum: Fix child permissions

2019-11-11 Thread Max Reitz
Quorum cannot share WRITE or RESIZE on its children.  Presumably, it
only does so because as a filter, it seemed intuitively correct to point
its .bdrv_child_perm to bdrv_filter_default_perm().

However, it is not really a filter, and bdrv_filter_default_perm() does
not work for it, so we have to provide a custom .bdrv_child_perm
implementation.

Signed-off-by: Max Reitz 
---
 block/quorum.c | 19 ++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/block/quorum.c b/block/quorum.c
index df68adcfaa..17b439056f 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -1114,6 +1114,23 @@ static char *quorum_dirname(BlockDriverState *bs, Error 
**errp)
 return NULL;
 }
 
+static void quorum_child_perm(BlockDriverState *bs, BdrvChild *c,
+  const BdrvChildRole *role,
+  BlockReopenQueue *reopen_queue,
+  uint64_t perm, uint64_t shared,
+  uint64_t *nperm, uint64_t *nshared)
+{
+*nperm = perm & DEFAULT_PERM_PASSTHROUGH;
+
+/*
+ * We cannot share RESIZE or WRITE, as this would make the
+ * children differ from each other.
+ */
+*nshared = (shared & (BLK_PERM_CONSISTENT_READ |
+  BLK_PERM_WRITE_UNCHANGED))
+ | DEFAULT_PERM_UNCHANGED;
+}
+
 static const char *const quorum_strong_runtime_opts[] = {
 QUORUM_OPT_VOTE_THRESHOLD,
 QUORUM_OPT_BLKVERIFY,
@@ -1143,7 +1160,7 @@ static BlockDriver bdrv_quorum = {
 .bdrv_add_child = quorum_add_child,
 .bdrv_del_child = quorum_del_child,
 
-.bdrv_child_perm= bdrv_filter_default_perms,
+.bdrv_child_perm= quorum_child_perm,
 
 .is_filter  = true,
 .bdrv_recurse_is_first_non_filter   = quorum_recurse_is_first_non_filter,
-- 
2.23.0