qemu-devel.nongnu.org archive mirror
 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] [PULL 19/26] qcow2: Add corrupt bit
Date: Fri, 30 Aug 2013 16:30:44 +0200	[thread overview]
Message-ID: <1377873051-18981-20-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1377873051-18981-1-git-send-email-kwolf@redhat.com>

From: Max Reitz <mreitz@redhat.com>

This adds an incompatible bit indicating corruption to qcow2. Any image
with this bit set may not be written to unless for repairing (and
subsequently clearing the bit if the repair has been successful).

Signed-off-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block/qcow2.c              | 47 ++++++++++++++++++++++++++++++++++++++++++++++
 block/qcow2.h              |  7 ++++++-
 docs/specs/qcow2.txt       |  7 ++++++-
 tests/qemu-iotests/031.out | 12 ++++++------
 tests/qemu-iotests/036.out |  2 +-
 5 files changed, 66 insertions(+), 9 deletions(-)

diff --git a/block/qcow2.c b/block/qcow2.c
index 5e5f413..fe91568 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -272,6 +272,37 @@ static int qcow2_mark_clean(BlockDriverState *bs)
     return 0;
 }
 
+/*
+ * Marks the image as corrupt.
+ */
+int qcow2_mark_corrupt(BlockDriverState *bs)
+{
+    BDRVQcowState *s = bs->opaque;
+
+    s->incompatible_features |= QCOW2_INCOMPAT_CORRUPT;
+    return qcow2_update_header(bs);
+}
+
+/*
+ * Marks the image as consistent, i.e., unsets the corrupt bit, and flushes
+ * before if necessary.
+ */
+int qcow2_mark_consistent(BlockDriverState *bs)
+{
+    BDRVQcowState *s = bs->opaque;
+
+    if (s->incompatible_features & QCOW2_INCOMPAT_CORRUPT) {
+        int ret = bdrv_flush(bs);
+        if (ret < 0) {
+            return ret;
+        }
+
+        s->incompatible_features &= ~QCOW2_INCOMPAT_CORRUPT;
+        return qcow2_update_header(bs);
+    }
+    return 0;
+}
+
 static int qcow2_check(BlockDriverState *bs, BdrvCheckResult *result,
                        BdrvCheckMode fix)
 {
@@ -402,6 +433,17 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags)
         goto fail;
     }
 
+    if (s->incompatible_features & QCOW2_INCOMPAT_CORRUPT) {
+        /* Corrupt images may not be written to unless they are being repaired
+         */
+        if ((flags & BDRV_O_RDWR) && !(flags & BDRV_O_CHECK)) {
+            error_report("qcow2: Image is corrupt; cannot be opened "
+                    "read/write.");
+            ret = -EACCES;
+            goto fail;
+        }
+    }
+
     /* Check support for various header values */
     if (header.refcount_order != 4) {
         report_unsupported(bs, "%d bit reference counts",
@@ -1130,6 +1172,11 @@ int qcow2_update_header(BlockDriverState *bs)
             .name = "dirty bit",
         },
         {
+            .type = QCOW2_FEAT_TYPE_INCOMPATIBLE,
+            .bit  = QCOW2_INCOMPAT_CORRUPT_BITNR,
+            .name = "corrupt bit",
+        },
+        {
             .type = QCOW2_FEAT_TYPE_COMPATIBLE,
             .bit  = QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR,
             .name = "lazy refcounts",
diff --git a/block/qcow2.h b/block/qcow2.h
index 365a17e..32ecb33 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -119,9 +119,12 @@ enum {
 /* Incompatible feature bits */
 enum {
     QCOW2_INCOMPAT_DIRTY_BITNR   = 0,
+    QCOW2_INCOMPAT_CORRUPT_BITNR = 1,
     QCOW2_INCOMPAT_DIRTY         = 1 << QCOW2_INCOMPAT_DIRTY_BITNR,
+    QCOW2_INCOMPAT_CORRUPT       = 1 << QCOW2_INCOMPAT_CORRUPT_BITNR,
 
-    QCOW2_INCOMPAT_MASK          = QCOW2_INCOMPAT_DIRTY,
+    QCOW2_INCOMPAT_MASK          = QCOW2_INCOMPAT_DIRTY
+                                 | QCOW2_INCOMPAT_CORRUPT,
 };
 
 /* Compatible feature bits */
@@ -361,6 +364,8 @@ int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov,
                   int64_t sector_num, int nb_sectors);
 
 int qcow2_mark_dirty(BlockDriverState *bs);
+int qcow2_mark_corrupt(BlockDriverState *bs);
+int qcow2_mark_consistent(BlockDriverState *bs);
 int qcow2_update_header(BlockDriverState *bs);
 
 /* qcow2-refcount.c functions */
diff --git a/docs/specs/qcow2.txt b/docs/specs/qcow2.txt
index 36a559d..33eca36 100644
--- a/docs/specs/qcow2.txt
+++ b/docs/specs/qcow2.txt
@@ -80,7 +80,12 @@ in the description of a field.
                                 tables to repair refcounts before accessing the
                                 image.
 
-                    Bits 1-63:  Reserved (set to 0)
+                    Bit 1:      Corrupt bit.  If this bit is set then any data
+                                structure may be corrupt and the image must not
+                                be written to (unless for regaining
+                                consistency).
+
+                    Bits 2-63:  Reserved (set to 0)
 
          80 -  87:  compatible_features
                     Bitmask of compatible features. An implementation can
diff --git a/tests/qemu-iotests/031.out b/tests/qemu-iotests/031.out
index 796c993..a943344 100644
--- a/tests/qemu-iotests/031.out
+++ b/tests/qemu-iotests/031.out
@@ -54,7 +54,7 @@ header_length             72
 
 Header extension:
 magic                     0x6803f857
-length                    96
+length                    144
 data                      <binary>
 
 Header extension:
@@ -68,7 +68,7 @@ No errors were found on the image.
 
 magic                     0x514649fb
 version                   2
-backing_file_offset       0xf8
+backing_file_offset       0x128
 backing_file_size         0x17
 cluster_bits              16
 size                      67108864
@@ -92,7 +92,7 @@ data                      'host_device'
 
 Header extension:
 magic                     0x6803f857
-length                    96
+length                    144
 data                      <binary>
 
 Header extension:
@@ -155,7 +155,7 @@ header_length             104
 
 Header extension:
 magic                     0x6803f857
-length                    96
+length                    144
 data                      <binary>
 
 Header extension:
@@ -169,7 +169,7 @@ No errors were found on the image.
 
 magic                     0x514649fb
 version                   3
-backing_file_offset       0x118
+backing_file_offset       0x148
 backing_file_size         0x17
 cluster_bits              16
 size                      67108864
@@ -193,7 +193,7 @@ data                      'host_device'
 
 Header extension:
 magic                     0x6803f857
-length                    96
+length                    144
 data                      <binary>
 
 Header extension:
diff --git a/tests/qemu-iotests/036.out b/tests/qemu-iotests/036.out
index 063ca22..55a3e6e 100644
--- a/tests/qemu-iotests/036.out
+++ b/tests/qemu-iotests/036.out
@@ -46,7 +46,7 @@ header_length             104
 
 Header extension:
 magic                     0x6803f857
-length                    96
+length                    144
 data                      <binary>
 
 *** done
-- 
1.8.1.4

  parent reply	other threads:[~2013-08-30 14:31 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-30 14:30 [Qemu-devel] [PULL 00/26] Block patches Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 01/26] qcow2: Change default for new images to compat=1.1 Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 02/26] block: Remove redundant assertion Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 03/26] qapi-types.py: Split off generate_struct_fields() Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 04/26] Revert "block: Disable driver-specific options for 1.6" Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 05/26] qemu-iotests: Update reference output for 051 Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 06/26] block/qcow2.h: Avoid "1LL << 63" (shifts into sign bit) Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 07/26] add skeleton for BSD licensed "raw" BlockDriver Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 08/26] raw_bsd: emit debug events in bdrv_co_readv() and bdrv_co_writev() Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 09/26] raw_bsd: add raw_create() Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 10/26] raw_bsd: introduce "special members" Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 11/26] raw_bsd: add raw_create_options Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 12/26] raw_bsd: register bdrv_raw Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 13/26] switch raw block driver from "raw.o" to "raw_bsd.o" Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 14/26] block: Remove old raw driver Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 15/26] gluster: Abort on AIO completion failure Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 16/26] option: Add assigned flag to QEMUOptionParameter Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 17/26] qcow2-refcount: Snapshot update for zero clusters Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 18/26] qemu-iotests: Snapshotting " Kevin Wolf
2013-08-30 14:30 ` Kevin Wolf [this message]
2013-08-30 14:30 ` [Qemu-devel] [PULL 20/26] qcow2: Metadata overlap checks Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 21/26] qcow2: Employ metadata " Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 22/26] qcow2-refcount: Move OFLAG_COPIED checks Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 23/26] qcow2-refcount: Repair OFLAG_COPIED errors Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 24/26] qcow2-refcount: Repair shared refcount blocks Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 25/26] qcow2_check: Mark image consistent Kevin Wolf
2013-08-30 14:30 ` [Qemu-devel] [PULL 26/26] qemu-iotests: Overlapping cluster allocations Kevin Wolf
2013-08-30 17:14 ` [Qemu-devel] [PULL 00/26] Block patches Anthony Liguori
2013-09-02  8:24   ` Kevin Wolf

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=1377873051-18981-20-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).