Make the static new overlap check function global and drop the old function.
Signed-off-by: Max Reitz <mre...@redhat.com> --- block/qcow2-overlap.c | 8 +--- block/qcow2-refcount.c | 120 ------------------------------------------------- 2 files changed, 2 insertions(+), 126 deletions(-) diff --git a/block/qcow2-overlap.c b/block/qcow2-overlap.c index 21d1d3c..cd401fe 100644 --- a/block/qcow2-overlap.c +++ b/block/qcow2-overlap.c @@ -321,12 +321,8 @@ static int single_check_metadata_overlap(Qcow2MetadataList *mdl, int ign, return window->bitmap[bitmap_i] & ~ign; } -/* This will replace qcow2_check_metadata_overlap() */ -static int check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset, - int64_t size) __attribute__((used)); - -static int check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset, - int64_t size) +int qcow2_check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset, + int64_t size) { BDRVQcowState *s = bs->opaque; uint64_t start_cluster = offset >> s->cluster_bits; diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index 0c203d3..edff9ee 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -2168,126 +2168,6 @@ fail: return ret; } -#define overlaps_with(ofs, sz) \ - ranges_overlap(offset, size, ofs, sz) - -/* - * Checks if the given offset into the image file is actually free to use by - * looking for overlaps with important metadata sections (L1/L2 tables etc.), - * i.e. a sanity check without relying on the refcount tables. - * - * The ign parameter specifies what checks not to perform (being a bitmask of - * QCow2MetadataOverlap values), i.e., what sections to ignore. - * - * Returns: - * - 0 if writing to this offset will not affect the mentioned metadata - * - a positive QCow2MetadataOverlap value indicating one overlapping section - * - a negative value (-errno) indicating an error while performing a check, - * e.g. when bdrv_read failed on QCOW2_OL_INACTIVE_L2 - */ -int qcow2_check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset, - int64_t size) -{ - BDRVQcowState *s = bs->opaque; - int chk = s->overlap_check & ~ign; - int i, j; - - if (!size) { - return 0; - } - - if (chk & QCOW2_OL_MAIN_HEADER) { - if (offset < s->cluster_size) { - return QCOW2_OL_MAIN_HEADER; - } - } - - /* align range to test to cluster boundaries */ - size = align_offset(offset_into_cluster(s, offset) + size, s->cluster_size); - offset = start_of_cluster(s, offset); - - if ((chk & QCOW2_OL_ACTIVE_L1) && s->l1_size) { - if (overlaps_with(s->l1_table_offset, s->l1_size * sizeof(uint64_t))) { - return QCOW2_OL_ACTIVE_L1; - } - } - - if ((chk & QCOW2_OL_REFCOUNT_TABLE) && s->refcount_table_size) { - if (overlaps_with(s->refcount_table_offset, - s->refcount_table_size * sizeof(uint64_t))) { - return QCOW2_OL_REFCOUNT_TABLE; - } - } - - if ((chk & QCOW2_OL_SNAPSHOT_TABLE) && s->snapshots_size) { - if (overlaps_with(s->snapshots_offset, s->snapshots_size)) { - return QCOW2_OL_SNAPSHOT_TABLE; - } - } - - if ((chk & QCOW2_OL_INACTIVE_L1) && s->snapshots) { - for (i = 0; i < s->nb_snapshots; i++) { - if (s->snapshots[i].l1_size && - overlaps_with(s->snapshots[i].l1_table_offset, - s->snapshots[i].l1_size * sizeof(uint64_t))) { - return QCOW2_OL_INACTIVE_L1; - } - } - } - - if ((chk & QCOW2_OL_ACTIVE_L2) && s->l1_table) { - for (i = 0; i < s->l1_size; i++) { - if ((s->l1_table[i] & L1E_OFFSET_MASK) && - overlaps_with(s->l1_table[i] & L1E_OFFSET_MASK, - s->cluster_size)) { - return QCOW2_OL_ACTIVE_L2; - } - } - } - - if ((chk & QCOW2_OL_REFCOUNT_BLOCK) && s->refcount_table) { - for (i = 0; i < s->refcount_table_size; i++) { - if ((s->refcount_table[i] & REFT_OFFSET_MASK) && - overlaps_with(s->refcount_table[i] & REFT_OFFSET_MASK, - s->cluster_size)) { - return QCOW2_OL_REFCOUNT_BLOCK; - } - } - } - - if ((chk & QCOW2_OL_INACTIVE_L2) && s->snapshots) { - for (i = 0; i < s->nb_snapshots; i++) { - uint64_t l1_ofs = s->snapshots[i].l1_table_offset; - uint32_t l1_sz = s->snapshots[i].l1_size; - uint64_t l1_sz2 = l1_sz * sizeof(uint64_t); - uint64_t *l1 = g_try_malloc(l1_sz2); - int ret; - - if (l1_sz2 && l1 == NULL) { - return -ENOMEM; - } - - ret = bdrv_pread(bs->file, l1_ofs, l1, l1_sz2); - if (ret < 0) { - g_free(l1); - return ret; - } - - for (j = 0; j < l1_sz; j++) { - uint64_t l2_ofs = be64_to_cpu(l1[j]) & L1E_OFFSET_MASK; - if (l2_ofs && overlaps_with(l2_ofs, s->cluster_size)) { - g_free(l1); - return QCOW2_OL_INACTIVE_L2; - } - } - - g_free(l1); - } - } - - return 0; -} - static const char *metadata_ol_names[] = { [QCOW2_OL_MAIN_HEADER_BITNR] = "qcow2_header", [QCOW2_OL_ACTIVE_L1_BITNR] = "active L1 table", -- 1.9.3