diff --git a/src/blockstore_disk.cpp b/src/blockstore_disk.cpp index a5f088c3..415b167a 100644 --- a/src/blockstore_disk.cpp +++ b/src/blockstore_disk.cpp @@ -44,6 +44,7 @@ void blockstore_disk_t::parse_config(std::map & config journal_block_size = parse_size(config["journal_block_size"]); meta_block_size = parse_size(config["meta_block_size"]); bitmap_granularity = parse_size(config["bitmap_granularity"]); + meta_format = stoull_full(config["meta_format"]); if (config["data_csum_type"] == "crc32c") { data_csum_type = BLOCKSTORE_CSUM_CRC32C; @@ -191,26 +192,28 @@ void blockstore_disk_t::calc_lengths(bool skip_meta_check) // required metadata size block_count = data_len / data_block_size; meta_len = (1 + (block_count - 1 + meta_block_size / clean_entry_size) / (meta_block_size / clean_entry_size)) * meta_block_size; + if (meta_format == BLOCKSTORE_META_FORMAT_V1 || + !meta_format && !skip_meta_check && meta_area_size < meta_len && !data_csum_type) + { + uint64_t clean_entry_v0_size = sizeof(clean_disk_entry) + 2*clean_entry_bitmap_size; + uint64_t meta_v0_len = (1 + (block_count - 1 + meta_block_size / clean_entry_v0_size) + / (meta_block_size / clean_entry_v0_size)) * meta_block_size; + if (meta_format == BLOCKSTORE_META_FORMAT_V1 || meta_area_size >= meta_v0_len) + { + // Old metadata fits. + printf("Warning: Using old metadata format without checksums because the new format doesn't fit into provided area\n"); + clean_entry_size = clean_entry_v0_size; + meta_len = meta_v0_len; + meta_format = BLOCKSTORE_META_FORMAT_V1; + } + else + meta_format = BLOCKSTORE_META_FORMAT_V2; + } + else + meta_format = BLOCKSTORE_META_FORMAT_V2; if (!skip_meta_check && meta_area_size < meta_len) { - if (!data_csum_type && !meta_format) - { - uint64_t clean_entry_v0_size = sizeof(clean_disk_entry) + 2*clean_entry_bitmap_size; - uint64_t meta_v0_len = (1 + (block_count - 1 + meta_block_size / clean_entry_v0_size) - / (meta_block_size / clean_entry_v0_size)) * meta_block_size; - if (meta_area_size >= meta_v0_len) - { - // Old metadata fits. - printf("Warning: Forcing metadata format without checksums because the new format doesn't fit into provided area\n"); - clean_entry_size = clean_entry_v0_size; - meta_len = meta_v0_len; - meta_format = BLOCKSTORE_META_FORMAT_V1; - } - } - if (meta_area_size < meta_len) - { - throw std::runtime_error("Metadata area is too small, need at least "+std::to_string(meta_len)+" bytes"); - } + throw std::runtime_error("Metadata area is too small, need at least "+std::to_string(meta_len)+" bytes"); } // requested journal size if (!skip_meta_check && cfg_journal_size > journal_len) diff --git a/src/blockstore_init.cpp b/src/blockstore_init.cpp index a33ff295..e9a872f6 100644 --- a/src/blockstore_init.cpp +++ b/src/blockstore_init.cpp @@ -80,14 +80,17 @@ resume_1: blockstore_meta_header_v2_t *hdr = (blockstore_meta_header_v2_t *)metadata_buffer; hdr->zero = 0; hdr->magic = BLOCKSTORE_META_MAGIC_V1; - hdr->version = BLOCKSTORE_META_FORMAT_V2; + hdr->version = bs->dsk.meta_format; hdr->meta_block_size = bs->dsk.meta_block_size; hdr->data_block_size = bs->dsk.data_block_size; hdr->bitmap_granularity = bs->dsk.bitmap_granularity; - hdr->data_csum_type = bs->dsk.data_csum_type; - hdr->csum_block_size = bs->dsk.csum_block_size; - hdr->header_csum = 0; - hdr->header_csum = crc32c(0, hdr, sizeof(*hdr)); + if (bs->dsk.meta_format >= BLOCKSTORE_META_FORMAT_V2) + { + hdr->data_csum_type = bs->dsk.data_csum_type; + hdr->csum_block_size = bs->dsk.csum_block_size; + hdr->header_csum = 0; + hdr->header_csum = crc32c(0, hdr, sizeof(*hdr)); + } } if (bs->readonly) { @@ -123,14 +126,6 @@ resume_1: ); exit(1); } - if (bs->dsk.meta_format && bs->dsk.meta_format != hdr->version) - { - printf( - "Metadata format version is %lu on disk, but %lu is currently selected in OSD configuration.\n" - " Please upgrade using vitastor-disk.\n", hdr->version, bs->dsk.meta_format - ); - exit(1); - } if (hdr->version == BLOCKSTORE_META_FORMAT_V2) { uint32_t csum = hdr->header_csum;