26ba25
From 2bcabbe52038d80315596e3606bf3afb80e1ce80 Mon Sep 17 00:00:00 2001
26ba25
From: Max Reitz <mreitz@redhat.com>
26ba25
Date: Mon, 18 Jun 2018 18:00:53 +0200
26ba25
Subject: [PATCH 056/268] block: Make bdrv_is_writable() public
26ba25
26ba25
RH-Author: Max Reitz <mreitz@redhat.com>
26ba25
Message-id: <20180618180055.22739-2-mreitz@redhat.com>
26ba25
Patchwork-id: 80792
26ba25
O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH 1/3] block: Make bdrv_is_writable() public
26ba25
Bugzilla: 1588039
26ba25
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
26ba25
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
26ba25
RH-Acked-by: John Snow <jsnow@redhat.com>
26ba25
26ba25
This is a useful function for the whole block layer, so make it public.
26ba25
At the same time, users outside of block.c probably do not need to make
26ba25
use of the reopen functionality, so rename the current function to
26ba25
bdrv_is_writable_after_reopen() create a new bdrv_is_writable() function
26ba25
that just passes NULL to it for the reopen queue.
26ba25
26ba25
Cc: qemu-stable@nongnu.org
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
Message-id: 20180606193702.7113-2-mreitz@redhat.com
26ba25
Reviewed-by: John Snow <jsnow@redhat.com>
26ba25
Reviewed-by: Jeff Cody <jcody@redhat.com>
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
(cherry picked from commit cc022140972f8b6ac3973c12ccf9dd6b1d2fd200)
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
26ba25
---
26ba25
 block.c               | 17 ++++++++++++++---
26ba25
 include/block/block.h |  1 +
26ba25
 2 files changed, 15 insertions(+), 3 deletions(-)
26ba25
26ba25
diff --git a/block.c b/block.c
26ba25
index 3c3e8fd..982d54e 100644
26ba25
--- a/block.c
26ba25
+++ b/block.c
26ba25
@@ -1621,13 +1621,24 @@ static int bdrv_reopen_get_flags(BlockReopenQueue *q, BlockDriverState *bs)
26ba25
 
26ba25
 /* Returns whether the image file can be written to after the reopen queue @q
26ba25
  * has been successfully applied, or right now if @q is NULL. */
26ba25
-static bool bdrv_is_writable(BlockDriverState *bs, BlockReopenQueue *q)
26ba25
+static bool bdrv_is_writable_after_reopen(BlockDriverState *bs,
26ba25
+                                          BlockReopenQueue *q)
26ba25
 {
26ba25
     int flags = bdrv_reopen_get_flags(q, bs);
26ba25
 
26ba25
     return (flags & (BDRV_O_RDWR | BDRV_O_INACTIVE)) == BDRV_O_RDWR;
26ba25
 }
26ba25
 
26ba25
+/*
26ba25
+ * Return whether the BDS can be written to.  This is not necessarily
26ba25
+ * the same as !bdrv_is_read_only(bs), as inactivated images may not
26ba25
+ * be written to but do not count as read-only images.
26ba25
+ */
26ba25
+bool bdrv_is_writable(BlockDriverState *bs)
26ba25
+{
26ba25
+    return bdrv_is_writable_after_reopen(bs, NULL);
26ba25
+}
26ba25
+
26ba25
 static void bdrv_child_perm(BlockDriverState *bs, BlockDriverState *child_bs,
26ba25
                             BdrvChild *c, const BdrvChildRole *role,
26ba25
                             BlockReopenQueue *reopen_queue,
26ba25
@@ -1665,7 +1676,7 @@ static int bdrv_check_perm(BlockDriverState *bs, BlockReopenQueue *q,
26ba25
 
26ba25
     /* Write permissions never work with read-only images */
26ba25
     if ((cumulative_perms & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED)) &&
26ba25
-        !bdrv_is_writable(bs, q))
26ba25
+        !bdrv_is_writable_after_reopen(bs, q))
26ba25
     {
26ba25
         error_setg(errp, "Block node is read-only");
26ba25
         return -EPERM;
26ba25
@@ -1957,7 +1968,7 @@ void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
26ba25
                                   &perm, &shared);
26ba25
 
26ba25
         /* Format drivers may touch metadata even if the guest doesn't write */
26ba25
-        if (bdrv_is_writable(bs, reopen_queue)) {
26ba25
+        if (bdrv_is_writable_after_reopen(bs, reopen_queue)) {
26ba25
             perm |= BLK_PERM_WRITE | BLK_PERM_RESIZE;
26ba25
         }
26ba25
 
26ba25
diff --git a/include/block/block.h b/include/block/block.h
26ba25
index 3894edd..06cd772 100644
26ba25
--- a/include/block/block.h
26ba25
+++ b/include/block/block.h
26ba25
@@ -407,6 +407,7 @@ bool bdrv_is_read_only(BlockDriverState *bs);
26ba25
 int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
26ba25
                            bool ignore_allow_rdw, Error **errp);
26ba25
 int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp);
26ba25
+bool bdrv_is_writable(BlockDriverState *bs);
26ba25
 bool bdrv_is_sg(BlockDriverState *bs);
26ba25
 bool bdrv_is_inserted(BlockDriverState *bs);
26ba25
 void bdrv_lock_medium(BlockDriverState *bs, bool locked);
26ba25
-- 
26ba25
1.8.3.1
26ba25