Re: [Qemu-devel] [PATCH 1/4] block: Improve "Block node is read-only" message

2019-05-16 Thread Alberto Garcia
On Wed 15 May 2019 10:15:00 PM CEST, Max Reitz wrote:
> This message does not make any sense when it appears as the response to
> making an R/W node read-only.  We should detect that case and emit a
> different message, then.
>
> Signed-off-by: Max Reitz 

Reviewed-by: Alberto Garcia 

Berto



[Qemu-devel] [PATCH 1/4] block: Improve "Block node is read-only" message

2019-05-15 Thread Max Reitz
This message does not make any sense when it appears as the response to
making an R/W node read-only.  We should detect that case and emit a
different message, then.

Signed-off-by: Max Reitz 
---
 block.c | 17 -
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/block.c b/block.c
index 16ef5edfd8..af662d5f17 100644
--- a/block.c
+++ b/block.c
@@ -1689,6 +1689,8 @@ static int bdrv_child_check_perm(BdrvChild *c, 
BlockReopenQueue *q,
  GSList *ignore_children, Error **errp);
 static void bdrv_child_abort_perm_update(BdrvChild *c);
 static void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared);
+static void bdrv_get_cumulative_perm(BlockDriverState *bs, uint64_t *perm,
+ uint64_t *shared_perm);
 
 typedef struct BlockReopenQueueEntry {
  bool prepared;
@@ -1775,7 +1777,20 @@ static int bdrv_check_perm(BlockDriverState *bs, 
BlockReopenQueue *q,
 if ((cumulative_perms & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED)) &&
 !bdrv_is_writable_after_reopen(bs, q))
 {
-error_setg(errp, "Block node is read-only");
+if (!bdrv_is_writable_after_reopen(bs, NULL)) {
+error_setg(errp, "Block node is read-only");
+} else {
+uint64_t current_perms, current_shared;
+bdrv_get_cumulative_perm(bs, _perms, _shared);
+if (current_perms & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED)) {
+error_setg(errp, "Cannot make block node read-only, there is "
+   "a writer on it");
+} else {
+error_setg(errp, "Cannot make block node read-only and create "
+   "a writer on it");
+}
+}
+
 return -EPERM;
 }
 
-- 
2.21.0