53 lines
1.8 KiB
Diff
53 lines
1.8 KiB
Diff
|
From b461a24186f05d7adec265bd34f348f7b8f9569b Mon Sep 17 00:00:00 2001
|
||
|
From: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
|
||
|
Date: Thu, 27 Oct 2011 10:54:27 +0100
|
||
|
Subject: [PATCH] block: set bs->read_only before .bdrv_open()
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
Several block drivers set bs->read_only in .bdrv_open() but
|
||
|
block.c:bdrv_open_common() clobbers its value. Additionally, QED uses
|
||
|
bdrv_is_read_only() in .bdrv_open() to decide whether to perform
|
||
|
consistency checks.
|
||
|
|
||
|
The correct ordering is to initialize bs->read_only from the open flags
|
||
|
before calling .bdrv_open(). This way block drivers can override it if
|
||
|
necessary and can use bdrv_is_read_only() in .bdrv_open().
|
||
|
|
||
|
Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
|
||
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||
|
(cherry picked from commit e7c637967e6aad195b5f30cfd995913c9e0b4666)
|
||
|
|
||
|
Signed-off-by: Bruce Rogers <brogers@suse.com>
|
||
|
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
||
|
---
|
||
|
block.c | 4 ++--
|
||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/block.c b/block.c
|
||
|
index 4ebb18b..8d77746 100644
|
||
|
--- a/block.c
|
||
|
+++ b/block.c
|
||
|
@@ -455,6 +455,8 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename,
|
||
|
open_flags |= BDRV_O_RDWR;
|
||
|
}
|
||
|
|
||
|
+ bs->keep_read_only = bs->read_only = !(open_flags & BDRV_O_RDWR);
|
||
|
+
|
||
|
/* Open the image, either directly or using a protocol */
|
||
|
if (drv->bdrv_file_open) {
|
||
|
ret = drv->bdrv_file_open(bs, filename, open_flags);
|
||
|
@@ -469,8 +471,6 @@ static int bdrv_open_common(BlockDriverState *bs, const char *filename,
|
||
|
goto free_and_fail;
|
||
|
}
|
||
|
|
||
|
- bs->keep_read_only = bs->read_only = !(open_flags & BDRV_O_RDWR);
|
||
|
-
|
||
|
ret = refresh_total_sectors(bs, bs->total_sectors);
|
||
|
if (ret < 0) {
|
||
|
goto free_and_fail;
|
||
|
--
|
||
|
1.7.11.2
|
||
|
|