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