[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 23/33] qcow2: Support external data file in qemu-img
From: |
Kevin Wolf |
Subject: |
[Qemu-block] [PULL 23/33] qcow2: Support external data file in qemu-img check |
Date: |
Fri, 8 Mar 2019 13:58:13 +0100 |
For external data files, data clusters must be excluded from the
refcount calculations. Instead, an implicit refcount of 1 is assumed for
the COPIED flag.
Compressed clusters and internal snapshots are incompatible with
external data files, so print an error if they are in use for images
with an external data file.
Signed-off-by: Kevin Wolf <address@hidden>
---
block/qcow2-refcount.c | 41 ++++++++++++++++++++++++++++++-----------
1 file changed, 30 insertions(+), 11 deletions(-)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index df73580e5d..e0fe322500 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -1605,6 +1605,13 @@ static int check_refcounts_l2(BlockDriverState *bs,
BdrvCheckResult *res,
res->corruptions++;
}
+ if (has_data_file(bs)) {
+ fprintf(stderr, "ERROR compressed cluster %d with data file, "
+ "entry=0x%" PRIx64 "\n", i, l2_entry);
+ res->corruptions++;
+ break;
+ }
+
/* Mark cluster as used */
nb_csectors = ((l2_entry >> s->csize_shift) &
s->csize_mask) + 1;
@@ -1695,11 +1702,13 @@ static int check_refcounts_l2(BlockDriverState *bs,
BdrvCheckResult *res,
}
/* Mark cluster as used */
- ret = qcow2_inc_refcounts_imrt(bs, res,
- refcount_table, refcount_table_size,
- offset, s->cluster_size);
- if (ret < 0) {
- goto fail;
+ if (!has_data_file(bs)) {
+ ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table,
+ refcount_table_size,
+ offset, s->cluster_size);
+ if (ret < 0) {
+ goto fail;
+ }
}
break;
}
@@ -1884,12 +1893,16 @@ static int check_oflag_copied(BlockDriverState *bs,
BdrvCheckResult *res,
if (cluster_type == QCOW2_CLUSTER_NORMAL ||
cluster_type == QCOW2_CLUSTER_ZERO_ALLOC) {
- ret = qcow2_get_refcount(bs,
- data_offset >> s->cluster_bits,
- &refcount);
- if (ret < 0) {
- /* don't print message nor increment check_errors */
- continue;
+ if (has_data_file(bs)) {
+ refcount = 1;
+ } else {
+ ret = qcow2_get_refcount(bs,
+ data_offset >> s->cluster_bits,
+ &refcount);
+ if (ret < 0) {
+ /* don't print message nor increment check_errors */
+ continue;
+ }
}
if ((refcount == 1) != ((l2_entry & QCOW_OFLAG_COPIED) != 0)) {
fprintf(stderr, "%s OFLAG_COPIED data cluster: "
@@ -2083,6 +2096,12 @@ static int calculate_refcounts(BlockDriverState *bs,
BdrvCheckResult *res,
}
/* snapshots */
+ if (has_data_file(bs) && s->nb_snapshots) {
+ fprintf(stderr, "ERROR %d snapshots in image with data file\n",
+ s->nb_snapshots);
+ res->corruptions++;
+ }
+
for (i = 0; i < s->nb_snapshots; i++) {
sn = s->snapshots + i;
if (offset_into_cluster(s, sn->l1_table_offset)) {
--
2.20.1
- [Qemu-block] [PULL 14/33] qcow2: Basic definitions for external data files, (continued)
- [Qemu-block] [PULL 14/33] qcow2: Basic definitions for external data files, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 18/33] qcow2: Don't assume 0 is an invalid cluster offset, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 17/33] qcow2: Prepare count_contiguous_clusters() for external data file, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 19/33] qcow2: Return 0/-errno in qcow2_alloc_compressed_cluster_offset(), Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 20/33] qcow2: Prepare qcow2_co_block_status() for data file, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 21/33] qcow2: External file I/O, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 15/33] qcow2: Pass bs to qcow2_get_cluster_type(), Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 16/33] qcow2: Prepare qcow2_get_cluster_type() for external data file, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 24/33] qcow2: Add basic data-file infrastructure, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 22/33] qcow2: Return error for snapshot operation with data file, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 23/33] qcow2: Support external data file in qemu-img check,
Kevin Wolf <=
- [Qemu-block] [PULL 25/33] qcow2: Creating images with external data file, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 28/33] qemu-iotests: Preallocation with external data file, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 26/33] qcow2: Store data file name in the image, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 30/33] qemu-iotests: amend with external data file, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 32/33] qemu-iotests: Add dependency to qemu-nbd tool, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 33/33] qcow2 spec: Describe string header extensions, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 27/33] qcow2: Implement data-file-raw create option, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 29/33] qemu-iotests: General tests for qcow2 with external data file, Kevin Wolf, 2019/03/08
- [Qemu-block] [PULL 31/33] ahci-test: Add dependency to qemu-img tool, Kevin Wolf, 2019/03/08
- Re: [Qemu-block] [PULL 00/33] Block layer patches, Peter Maydell, 2019/03/09