All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: anthony@codemonkey.ws
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 02/19] block: correctly set the keep_read_only flag
Date: Mon, 24 Sep 2012 16:26:31 +0200	[thread overview]
Message-ID: <1348496808-8159-3-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1348496808-8159-1-git-send-email-kwolf@redhat.com>

From: Jeff Cody <jcody@redhat.com>

I believe the bs->keep_read_only flag is supposed to reflect
the initial open state of the device. If the device is initially
opened R/O, then commit operations, or reopen operations changing
to R/W, are prohibited.

Currently, the keep_read_only flag is only accurate for the active
layer, and its backing file. Subsequent images end up always having
the keep_read_only flag set.

For instance, what happens now:

[  base  ]  kro = 1, ro = 1
    |
    v
[ snap-1 ]  kro = 1, ro = 1
    |
    v
[ snap-2 ]  kro = 0, ro = 1
    |
    v
[ active ]  kro = 0, ro = 0

What we want:

[  base  ]  kro = 0, ro = 1
    |
    v
[ snap-1 ]  kro = 0, ro = 1
    |
    v
[ snap-2 ]  kro = 0, ro = 1
    |
    v
[ active ]  kro = 0, ro = 0

Signed-off-by: Jeff Cody <jcody@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c |   14 +++++++-------
 block.h |    1 +
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/block.c b/block.c
index e78039b..4c0e7f5 100644
--- a/block.c
+++ b/block.c
@@ -668,7 +668,7 @@ 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);
+    bs->read_only = !(open_flags & BDRV_O_RDWR);
 
     /* Open the image, either directly or using a protocol */
     if (drv->bdrv_file_open) {
@@ -808,6 +808,12 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
         goto unlink_and_fail;
     }
 
+    if (flags & BDRV_O_RDWR) {
+        flags |= BDRV_O_ALLOW_RDWR;
+    }
+
+    bs->keep_read_only = !(flags & BDRV_O_ALLOW_RDWR);
+
     /* Open the image */
     ret = bdrv_open_common(bs, filename, flags, drv);
     if (ret < 0) {
@@ -837,12 +843,6 @@ int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
             bdrv_close(bs);
             return ret;
         }
-        if (bs->is_temporary) {
-            bs->backing_hd->keep_read_only = !(flags & BDRV_O_RDWR);
-        } else {
-            /* base image inherits from "parent" */
-            bs->backing_hd->keep_read_only = bs->keep_read_only;
-        }
     }
 
     if (!bdrv_key_required(bs)) {
diff --git a/block.h b/block.h
index 2e2be11..4d919c2 100644
--- a/block.h
+++ b/block.h
@@ -80,6 +80,7 @@ typedef struct BlockDevOps {
 #define BDRV_O_COPY_ON_READ 0x0400 /* copy read backing sectors into image */
 #define BDRV_O_INCOMING    0x0800  /* consistency hint for incoming migration */
 #define BDRV_O_CHECK       0x1000  /* open solely for consistency check */
+#define BDRV_O_ALLOW_RDWR  0x2000  /* allow reopen to change from r/o to r/w */
 
 #define BDRV_O_CACHE_MASK  (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH)
 
-- 
1.7.6.5

  parent reply	other threads:[~2012-09-24 14:27 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-24 14:26 [Qemu-devel] [PULL 00/19] Block patches Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 01/19] blockdev: preserve readonly and snapshot states across media changes Kevin Wolf
2012-09-24 14:26 ` Kevin Wolf [this message]
2012-09-24 14:26 ` [Qemu-devel] [PATCH 03/19] block: make bdrv_set_enable_write_cache() modify open_flags Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 04/19] block: Framework for reopening files safely Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 05/19] block: move aio initialization into a helper function Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 06/19] block: move open flag parsing in raw block drivers to helper functions Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 07/19] block: do not parse BDRV_O_CACHE_WB in block drivers Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 08/19] block: use BDRV_O_NOCACHE instead of s->aligned_buf in raw-posix.c Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 09/19] block: purge s->aligned_buf and s->aligned_buf_size from raw-posix.c Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 10/19] block: raw-posix image file reopen Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 11/19] block: raw " Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 12/19] block: qed " Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 13/19] block: qcow2 " Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 14/19] block: qcow " Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 15/19] block: vmdk " Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 16/19] block: vdi " Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 17/19] block: vpc " Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 18/19] block: convert bdrv_commit() to use bdrv_reopen() Kevin Wolf
2012-09-24 14:26 ` [Qemu-devel] [PATCH 19/19] block: remove keep_read_only flag from BlockDriverState struct Kevin Wolf
2012-09-25 23:26 ` [Qemu-devel] [PULL 00/19] Block patches Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1348496808-8159-3-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.