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