On 29.05.19 г. 10:27 ч., Qu Wenruo wrote:
> BTRFS_COMPAT_EXTENT_TREE_V0 is introduced for a short time in kernel,
> and it's over 10 years ago.
>
> Nowadays there should be no user for that feature, and kernel has remove
> this support in Jun, 2018. There is no need for btrfs-progs to support
> it.
>
> This patch will remove EXTENT_TREE_V0 related code and replace those
> BUG_ON() to a more graceful error message.
>
> Signed-off-by: Qu Wenruo <wqu@xxxxxxxx>
Kernel support for v0 was dropped so it was high time v0 support in
progs is also removed. So:
Reviewed-by: Nikolay Borisov <nborisov@xxxxxxxx>
> ---
> check/main.c | 59 ++-------------
> ctree.c | 5 --
> ctree.h | 2 -
> extent-tree.c | 202 +++-----------------------------------------------
> image/main.c | 59 +--------------
> print-tree.c | 33 +--------
> 6 files changed, 20 insertions(+), 340 deletions(-)
>
> diff --git a/check/main.c b/check/main.c
> index f6d908e99b51..731c21d364d7 100644
> --- a/check/main.c
> +++ b/check/main.c
> @@ -5048,27 +5048,6 @@ void free_device_extent_tree(struct device_extent_tree *tree)
> cache_tree_free_extents(&tree->tree, free_device_extent_record);
> }
>
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> -static int process_extent_ref_v0(struct cache_tree *extent_cache,
> - struct extent_buffer *leaf, int slot)
> -{
> - struct btrfs_extent_ref_v0 *ref0;
> - struct btrfs_key key;
> - int ret;
> -
> - btrfs_item_key_to_cpu(leaf, &key, slot);
> - ref0 = btrfs_item_ptr(leaf, slot, struct btrfs_extent_ref_v0);
> - if (btrfs_ref_objectid_v0(leaf, ref0) < BTRFS_FIRST_FREE_OBJECTID) {
> - ret = add_tree_backref(extent_cache, key.objectid, key.offset,
> - 0, 0);
> - } else {
> - ret = add_data_backref(extent_cache, key.objectid, key.offset,
> - 0, 0, 0, btrfs_ref_count_v0(leaf, ref0), 0, 0);
> - }
> - return ret;
> -}
> -#endif
> -
> struct chunk_record *btrfs_new_chunk_record(struct extent_buffer *leaf,
> struct btrfs_key *key,
> int slot)
> @@ -5331,30 +5310,10 @@ static int process_extent_item(struct btrfs_root *root,
> return -EIO;
> }
> if (item_size < sizeof(*ei)) {
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - struct btrfs_extent_item_v0 *ei0;
> -
> - if (item_size != sizeof(*ei0)) {
> - error(
> - "invalid extent item format: ITEM[%llu %u %llu] leaf: %llu slot: %d",
> - key.objectid, key.type, key.offset,
> - btrfs_header_bytenr(eb), slot);
> - BUG();
> - }
> - ei0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_item_v0);
> - refs = btrfs_extent_refs_v0(eb, ei0);
> -#else
> - BUG();
> -#endif
> - memset(&tmpl, 0, sizeof(tmpl));
> - tmpl.start = key.objectid;
> - tmpl.nr = num_bytes;
> - tmpl.extent_item_refs = refs;
> - tmpl.metadata = metadata;
> - tmpl.found_rec = 1;
> - tmpl.max_size = num_bytes;
> -
> - return add_extent_rec(extent_cache, &tmpl);
> + error(
> +"corrupted or unsupported extent item found, item size=%u expect minimal size=%lu",
> + item_size, sizeof(*ei));
> + return -EIO;
> }
>
> ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item);
> @@ -6334,14 +6293,10 @@ static int run_next_block(struct btrfs_root *root,
> continue;
>
> }
> - if (key.type == BTRFS_EXTENT_REF_V0_KEY) {
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - process_extent_ref_v0(extent_cache, buf, i);
> -#else
> - BUG();
> -#endif
> +
> + /* Skip deprecated extent ref */
> + if (key.type == BTRFS_EXTENT_REF_V0_KEY)
> continue;
> - }
>
> if (key.type == BTRFS_TREE_BLOCK_REF_KEY) {
> ret = add_tree_backref(extent_cache,
> diff --git a/ctree.c b/ctree.c
> index f93a60e42b65..1b101c21c52d 100644
> --- a/ctree.c
> +++ b/ctree.c
> @@ -168,11 +168,6 @@ static int btrfs_block_can_be_shared(struct btrfs_root *root,
> btrfs_root_last_snapshot(&root->root_item) ||
> btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC)))
> return 1;
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - if (root->ref_cows &&
> - btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
> - return 1;
> -#endif
> return 0;
> }
>
> diff --git a/ctree.h b/ctree.h
> index 76f52b1c9b08..9156ca4de6fd 100644
> --- a/ctree.h
> +++ b/ctree.h
> @@ -56,8 +56,6 @@ struct btrfs_free_space_ctl;
>
> #define BTRFS_MAX_LEVEL 8
>
> -#define BTRFS_COMPAT_EXTENT_TREE_V0
> -
> /* holds pointers to all of the tree roots */
> #define BTRFS_ROOT_TREE_OBJECTID 1ULL
>
> diff --git a/extent-tree.c b/extent-tree.c
> index e62ee8c2ba13..526108cdb9f0 100644
> --- a/extent-tree.c
> +++ b/extent-tree.c
> @@ -505,88 +505,6 @@ found:
> * tree block info structure.
> */
>
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> -static int convert_extent_item_v0(struct btrfs_trans_handle *trans,
> - struct btrfs_root *root,
> - struct btrfs_path *path,
> - u64 owner, u32 extra_size)
> -{
> - struct btrfs_extent_item *item;
> - struct btrfs_extent_item_v0 *ei0;
> - struct btrfs_extent_ref_v0 *ref0;
> - struct btrfs_tree_block_info *bi;
> - struct extent_buffer *leaf;
> - struct btrfs_key key;
> - struct btrfs_key found_key;
> - u32 new_size = sizeof(*item);
> - u64 refs;
> - int ret;
> -
> - leaf = path->nodes[0];
> - BUG_ON(btrfs_item_size_nr(leaf, path->slots[0]) != sizeof(*ei0));
> -
> - btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
> - ei0 = btrfs_item_ptr(leaf, path->slots[0],
> - struct btrfs_extent_item_v0);
> - refs = btrfs_extent_refs_v0(leaf, ei0);
> -
> - if (owner == (u64)-1) {
> - while (1) {
> - if (path->slots[0] >= btrfs_header_nritems(leaf)) {
> - ret = btrfs_next_leaf(root, path);
> - if (ret < 0)
> - return ret;
> - BUG_ON(ret > 0);
> - leaf = path->nodes[0];
> - }
> - btrfs_item_key_to_cpu(leaf, &found_key,
> - path->slots[0]);
> - BUG_ON(key.objectid != found_key.objectid);
> - if (found_key.type != BTRFS_EXTENT_REF_V0_KEY) {
> - path->slots[0]++;
> - continue;
> - }
> - ref0 = btrfs_item_ptr(leaf, path->slots[0],
> - struct btrfs_extent_ref_v0);
> - owner = btrfs_ref_objectid_v0(leaf, ref0);
> - break;
> - }
> - }
> - btrfs_release_path(path);
> -
> - if (owner < BTRFS_FIRST_FREE_OBJECTID)
> - new_size += sizeof(*bi);
> -
> - new_size -= sizeof(*ei0);
> - ret = btrfs_search_slot(trans, root, &key, path, new_size, 1);
> - if (ret < 0)
> - return ret;
> - BUG_ON(ret);
> -
> - ret = btrfs_extend_item(root, path, new_size);
> - BUG_ON(ret);
> -
> - leaf = path->nodes[0];
> - item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_extent_item);
> - btrfs_set_extent_refs(leaf, item, refs);
> - /* FIXME: get real generation */
> - btrfs_set_extent_generation(leaf, item, 0);
> - if (owner < BTRFS_FIRST_FREE_OBJECTID) {
> - btrfs_set_extent_flags(leaf, item,
> - BTRFS_EXTENT_FLAG_TREE_BLOCK |
> - BTRFS_BLOCK_FLAG_FULL_BACKREF);
> - bi = (struct btrfs_tree_block_info *)(item + 1);
> - /* FIXME: get first key of the block */
> - memset_extent_buffer(leaf, 0, (unsigned long)bi, sizeof(*bi));
> - btrfs_set_tree_block_level(leaf, bi, (int)owner);
> - } else {
> - btrfs_set_extent_flags(leaf, item, BTRFS_EXTENT_FLAG_DATA);
> - }
> - btrfs_mark_buffer_dirty(leaf);
> - return 0;
> -}
> -#endif
> -
> u64 hash_extent_data_ref(u64 root_objectid, u64 owner, u64 offset)
> {
> u32 high_crc = ~(u32)0;
> @@ -657,17 +575,6 @@ again:
> if (parent) {
> if (!ret)
> return 0;
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - key.type = BTRFS_EXTENT_REF_V0_KEY;
> - btrfs_release_path(path);
> - ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
> - if (ret < 0) {
> - err = ret;
> - goto fail;
> - }
> - if (!ret)
> - return 0;
> -#endif
> goto fail;
> }
>
> @@ -812,13 +719,6 @@ static noinline int remove_extent_data_ref(struct btrfs_trans_handle *trans,
> ref2 = btrfs_item_ptr(leaf, path->slots[0],
> struct btrfs_shared_data_ref);
> num_refs = btrfs_shared_data_ref_count(leaf, ref2);
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - } else if (key.type == BTRFS_EXTENT_REF_V0_KEY) {
> - struct btrfs_extent_ref_v0 *ref0;
> - ref0 = btrfs_item_ptr(leaf, path->slots[0],
> - struct btrfs_extent_ref_v0);
> - num_refs = btrfs_ref_count_v0(leaf, ref0);
> -#endif
> } else {
> BUG();
> }
> @@ -833,14 +733,6 @@ static noinline int remove_extent_data_ref(struct btrfs_trans_handle *trans,
> btrfs_set_extent_data_ref_count(leaf, ref1, num_refs);
> else if (key.type == BTRFS_SHARED_DATA_REF_KEY)
> btrfs_set_shared_data_ref_count(leaf, ref2, num_refs);
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - else {
> - struct btrfs_extent_ref_v0 *ref0;
> - ref0 = btrfs_item_ptr(leaf, path->slots[0],
> - struct btrfs_extent_ref_v0);
> - btrfs_set_ref_count_v0(leaf, ref0, num_refs);
> - }
> -#endif
> btrfs_mark_buffer_dirty(leaf);
> }
> return ret;
> @@ -874,13 +766,6 @@ static noinline u32 extent_data_ref_count(struct btrfs_path *path,
> ref2 = btrfs_item_ptr(leaf, path->slots[0],
> struct btrfs_shared_data_ref);
> num_refs = btrfs_shared_data_ref_count(leaf, ref2);
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - } else if (key.type == BTRFS_EXTENT_REF_V0_KEY) {
> - struct btrfs_extent_ref_v0 *ref0;
> - ref0 = btrfs_item_ptr(leaf, path->slots[0],
> - struct btrfs_extent_ref_v0);
> - num_refs = btrfs_ref_count_v0(leaf, ref0);
> -#endif
> } else {
> BUG();
> }
> @@ -908,15 +793,6 @@ static noinline int lookup_tree_block_ref(struct btrfs_trans_handle *trans,
> ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
> if (ret > 0)
> ret = -ENOENT;
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - if (ret == -ENOENT && parent) {
> - btrfs_release_path(path);
> - key.type = BTRFS_EXTENT_REF_V0_KEY;
> - ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
> - if (ret > 0)
> - ret = -ENOENT;
> - }
> -#endif
> return ret;
> }
>
> @@ -1041,22 +917,6 @@ again:
>
> leaf = path->nodes[0];
> item_size = btrfs_item_size_nr(leaf, path->slots[0]);
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - if (item_size < sizeof(*ei)) {
> - if (!insert) {
> - err = -ENOENT;
> - goto out;
> - }
> - ret = convert_extent_item_v0(trans, root, path, owner,
> - extra_size);
> - if (ret < 0) {
> - err = ret;
> - goto out;
> - }
> - leaf = path->nodes[0];
> - item_size = btrfs_item_size_nr(leaf, path->slots[0]);
> - }
> -#endif
> if (item_size < sizeof(*ei)) {
> printf("Size is %u, needs to be %u, slot %d\n",
> (unsigned)item_size,
> @@ -1064,7 +924,6 @@ again:
> btrfs_print_leaf(leaf);
> return -EINVAL;
> }
> - BUG_ON(item_size < sizeof(*ei));
>
> ei = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_extent_item);
> flags = btrfs_extent_flags(leaf, ei);
> @@ -1491,17 +1350,7 @@ again:
> num_refs = btrfs_extent_refs(l, item);
> extent_flags = btrfs_extent_flags(l, item);
> } else {
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - struct btrfs_extent_item_v0 *ei0;
> - BUG_ON(item_size != sizeof(*ei0));
> - ei0 = btrfs_item_ptr(l, path->slots[0],
> - struct btrfs_extent_item_v0);
> - num_refs = btrfs_extent_refs_v0(l, ei0);
> - /* FIXME: this isn't correct for data */
> - extent_flags = BTRFS_BLOCK_FLAG_FULL_BACKREF;
> -#else
> BUG();
> -#endif
> }
> item = btrfs_item_ptr(l, path->slots[0], struct btrfs_extent_item);
> if (refs)
> @@ -1571,18 +1420,13 @@ again:
> }
> l = path->nodes[0];
> item_size = btrfs_item_size_nr(l, path->slots[0]);
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> if (item_size < sizeof(*item)) {
> - ret = convert_extent_item_v0(trans, fs_info->extent_root, path,
> - (u64)-1, 0);
> - if (ret < 0)
> - goto out;
> -
> - l = path->nodes[0];
> - item_size = btrfs_item_size_nr(l, path->slots[0]);
> + error(
> +"unsupported or corrupted extent item, item size=%u expect minimal size=%lu",
> + item_size, sizeof(*item));
> + ret = -EUCLEAN;
> + goto out;
> }
> -#endif
> - BUG_ON(item_size < sizeof(*item));
> item = btrfs_item_ptr(l, path->slots[0], struct btrfs_extent_item);
> flags |= btrfs_extent_flags(l, item);
> btrfs_set_extent_flags(l, item, flags);
> @@ -2114,11 +1958,6 @@ static int __free_extent(struct btrfs_trans_handle *trans,
> break;
> extent_slot--;
> }
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - item_size = btrfs_item_size_nr(path->nodes[0], extent_slot);
> - if (found_extent && item_size < sizeof(*ei))
> - found_extent = 0;
> -#endif
> if (!found_extent) {
> BUG_ON(iref);
> ret = remove_extent_backref(trans, extent_root, path,
> @@ -2182,34 +2021,13 @@ static int __free_extent(struct btrfs_trans_handle *trans,
>
> leaf = path->nodes[0];
> item_size = btrfs_item_size_nr(leaf, extent_slot);
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> if (item_size < sizeof(*ei)) {
> - BUG_ON(found_extent || extent_slot != path->slots[0]);
> - ret = convert_extent_item_v0(trans, extent_root, path,
> - owner_objectid, 0);
> - BUG_ON(ret < 0);
> -
> - btrfs_release_path(path);
> -
> - key.objectid = bytenr;
> - key.type = BTRFS_EXTENT_ITEM_KEY;
> - key.offset = num_bytes;
> -
> - ret = btrfs_search_slot(trans, extent_root, &key, path,
> - -1, 1);
> - if (ret) {
> - printk(KERN_ERR "umm, got %d back from search"
> - ", was looking for %llu\n", ret,
> - (unsigned long long)bytenr);
> - btrfs_print_leaf(path->nodes[0]);
> - }
> - BUG_ON(ret);
> - extent_slot = path->slots[0];
> - leaf = path->nodes[0];
> - item_size = btrfs_item_size_nr(leaf, extent_slot);
> + error(
> +"unsupported or corrupted extent item, item size=%u expect minimal size=%lu",
> + item_size, sizeof(*ei));
> + ret = -EUCLEAN;
> + goto fail;
> }
> -#endif
> - BUG_ON(item_size < sizeof(*ei));
> ei = btrfs_item_ptr(leaf, extent_slot,
> struct btrfs_extent_item);
> if (owner_objectid < BTRFS_FIRST_FREE_OBJECTID &&
> diff --git a/image/main.c b/image/main.c
> index 4fba8283cec7..86845dadc958 100644
> --- a/image/main.c
> +++ b/image/main.c
> @@ -720,43 +720,6 @@ static int add_extent(u64 start, u64 size, struct metadump_struct *md,
> return 0;
> }
>
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> -static int is_tree_block(struct btrfs_root *extent_root,
> - struct btrfs_path *path, u64 bytenr)
> -{
> - struct extent_buffer *leaf;
> - struct btrfs_key key;
> - u64 ref_objectid;
> - int ret;
> -
> - leaf = path->nodes[0];
> - while (1) {
> - struct btrfs_extent_ref_v0 *ref_item;
> - path->slots[0]++;
> - if (path->slots[0] >= btrfs_header_nritems(leaf)) {
> - ret = btrfs_next_leaf(extent_root, path);
> - if (ret < 0)
> - return ret;
> - if (ret > 0)
> - break;
> - leaf = path->nodes[0];
> - }
> - btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
> - if (key.objectid != bytenr)
> - break;
> - if (key.type != BTRFS_EXTENT_REF_V0_KEY)
> - continue;
> - ref_item = btrfs_item_ptr(leaf, path->slots[0],
> - struct btrfs_extent_ref_v0);
> - ref_objectid = btrfs_ref_objectid_v0(leaf, ref_item);
> - if (ref_objectid < BTRFS_FIRST_FREE_OBJECTID)
> - return 1;
> - break;
> - }
> - return 0;
> -}
> -#endif
> -
> static int copy_tree_blocks(struct btrfs_root *root, struct extent_buffer *eb,
> struct metadump_struct *metadump, int root_tree)
> {
> @@ -974,30 +937,10 @@ static int copy_from_extent_tree(struct metadump_struct *metadump,
> }
> }
> } else {
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - ret = is_tree_block(extent_root, path, bytenr);
> - if (ret < 0) {
> - error("failed to check tree block %llu: %d",
> - (unsigned long long)bytenr, ret);
> - break;
> - }
> -
> - if (ret) {
> - ret = add_extent(bytenr, num_bytes, metadump,
> - 0);
> - if (ret) {
> - error("unable to add block %llu: %d",
> - (unsigned long long)bytenr, ret);
> - break;
> - }
> - }
> - ret = 0;
> -#else
> error(
> - "either extent tree is corrupted or you haven't built with V0 support");
> + "either extent tree is corrupted or deprecated extent ref format");
> ret = -EIO;
> break;
> -#endif
> }
> bytenr += num_bytes;
> }
> diff --git a/print-tree.c b/print-tree.c
> index ab77463706c1..0d0bb5109207 100644
> --- a/print-tree.c
> +++ b/print-tree.c
> @@ -422,18 +422,8 @@ void print_extent_item(struct extent_buffer *eb, int slot, int metadata)
> u64 offset;
> char flags_str[32] = {0};
>
> - if (item_size < sizeof(*ei)) {
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - struct btrfs_extent_item_v0 *ei0;
> - BUG_ON(item_size != sizeof(*ei0));
> - ei0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_item_v0);
> - printf("\t\trefs %u\n",
> - btrfs_extent_refs_v0(eb, ei0));
> + if (item_size < sizeof(*ei))
> return;
> -#else
> - BUG();
> -#endif
> - }
>
> ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item);
> flags = btrfs_extent_flags(eb, ei);
> @@ -502,21 +492,6 @@ void print_extent_item(struct extent_buffer *eb, int slot, int metadata)
> WARN_ON(ptr > end);
> }
>
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> -static void print_extent_ref_v0(struct extent_buffer *eb, int slot)
> -{
> - struct btrfs_extent_ref_v0 *ref0;
> -
> - ref0 = btrfs_item_ptr(eb, slot, struct btrfs_extent_ref_v0);
> - printf("\t\textent back ref root %llu gen %llu "
> - "owner %llu num_refs %lu\n",
> - (unsigned long long)btrfs_ref_root_v0(eb, ref0),
> - (unsigned long long)btrfs_ref_generation_v0(eb, ref0),
> - (unsigned long long)btrfs_ref_objectid_v0(eb, ref0),
> - (unsigned long)btrfs_ref_count_v0(eb, ref0));
> -}
> -#endif
> -
> static void print_root_ref(struct extent_buffer *leaf, int slot, const char *tag)
> {
> struct btrfs_root_ref *ref;
> @@ -1310,11 +1285,7 @@ void btrfs_print_leaf(struct extent_buffer *eb)
> print_shared_data_ref(eb, i);
> break;
> case BTRFS_EXTENT_REF_V0_KEY:
> -#ifdef BTRFS_COMPAT_EXTENT_TREE_V0
> - print_extent_ref_v0(eb, i);
> -#else
> - BUG();
> -#endif
> + printf("\t\textent ref v0 (deprecated)\n");
> break;
> case BTRFS_CSUM_ITEM_KEY:
> printf("\t\tcsum item\n");
>