Skip to content

Commit 182741d

Browse files
adam900710kdave
authored andcommitted
btrfs: remove v0 extent handling
The v0 extent item has been deprecated for a long time, and we don't have any report from the community either. So it's time to remove the v0 extent specific error handling, and just treat them as regular extent tree corruption. This patch would remove the btrfs_print_v0_err() helper, and enhance the involved error handling to treat them just as any extent tree corruption. No reports regarding v0 extents have been seen since the graceful handling was added in 2018. This involves: - btrfs_backref_add_tree_node() This change is a little tricky, the new code is changed to only handle BTRFS_TREE_BLOCK_REF_KEY and BTRFS_SHARED_BLOCK_REF_KEY. But this is safe, as we have rejected any unknown inline refs through btrfs_get_extent_inline_ref_type(). For keyed backrefs, we're safe to skip anything we don't know (that's if it can pass tree-checker in the first place). - btrfs_lookup_extent_info() - lookup_inline_extent_backref() - run_delayed_extent_op() - __btrfs_free_extent() - add_tree_block() Regular error handling of unexpected extent tree item, and abort transaction (if we have a trans handle). - remove_extent_data_ref() It's pretty much the same as the regular rejection of unknown backref key. But for this particular case, we can also remove a BUG_ON(). - extent_data_ref_count() We can remove the BTRFS_EXTENT_REF_V0_KEY BUG_ON(), as it would be rejected by the only caller. - btrfs_print_leaf() Remove the handling for BTRFS_EXTENT_REF_V0_KEY. Signed-off-by: Qu Wenruo <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 7f72f50 commit 182741d

File tree

8 files changed

+48
-52
lines changed

8 files changed

+48
-52
lines changed

fs/btrfs/backref.c

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3373,7 +3373,6 @@ int btrfs_backref_add_tree_node(struct btrfs_backref_cache *cache,
33733373
struct btrfs_key *node_key,
33743374
struct btrfs_backref_node *cur)
33753375
{
3376-
struct btrfs_fs_info *fs_info = cache->fs_info;
33773376
struct btrfs_backref_edge *edge;
33783377
struct btrfs_backref_node *exist;
33793378
int ret;
@@ -3462,25 +3461,21 @@ int btrfs_backref_add_tree_node(struct btrfs_backref_cache *cache,
34623461
ret = handle_direct_tree_backref(cache, &key, cur);
34633462
if (ret < 0)
34643463
goto out;
3465-
continue;
3466-
} else if (unlikely(key.type == BTRFS_EXTENT_REF_V0_KEY)) {
3467-
ret = -EINVAL;
3468-
btrfs_print_v0_err(fs_info);
3469-
btrfs_handle_fs_error(fs_info, ret, NULL);
3470-
goto out;
3471-
} else if (key.type != BTRFS_TREE_BLOCK_REF_KEY) {
3472-
continue;
3464+
} else if (key.type == BTRFS_TREE_BLOCK_REF_KEY) {
3465+
/*
3466+
* key.type == BTRFS_TREE_BLOCK_REF_KEY, inline ref
3467+
* offset means the root objectid. We need to search
3468+
* the tree to get its parent bytenr.
3469+
*/
3470+
ret = handle_indirect_tree_backref(cache, path, &key, node_key,
3471+
cur);
3472+
if (ret < 0)
3473+
goto out;
34733474
}
3474-
34753475
/*
3476-
* key.type == BTRFS_TREE_BLOCK_REF_KEY, inline ref offset
3477-
* means the root objectid. We need to search the tree to get
3478-
* its parent bytenr.
3476+
* Unrecognized tree backref items (if it can pass tree-checker)
3477+
* would be ignored.
34793478
*/
3480-
ret = handle_indirect_tree_backref(cache, path, &key, node_key,
3481-
cur);
3482-
if (ret < 0)
3483-
goto out;
34843479
}
34853480
ret = 0;
34863481
cur->checked = 1;

fs/btrfs/extent-tree.c

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,10 @@ int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans,
166166
num_refs = btrfs_extent_refs(leaf, ei);
167167
extent_flags = btrfs_extent_flags(leaf, ei);
168168
} else {
169-
ret = -EINVAL;
170-
btrfs_print_v0_err(fs_info);
169+
ret = -EUCLEAN;
170+
btrfs_err(fs_info,
171+
"unexpected extent item size, has %u expect >= %zu",
172+
item_size, sizeof(*ei));
171173
if (trans)
172174
btrfs_abort_transaction(trans, ret);
173175
else
@@ -603,12 +605,12 @@ static noinline int remove_extent_data_ref(struct btrfs_trans_handle *trans,
603605
ref2 = btrfs_item_ptr(leaf, path->slots[0],
604606
struct btrfs_shared_data_ref);
605607
num_refs = btrfs_shared_data_ref_count(leaf, ref2);
606-
} else if (unlikely(key.type == BTRFS_EXTENT_REF_V0_KEY)) {
607-
btrfs_print_v0_err(trans->fs_info);
608-
btrfs_abort_transaction(trans, -EINVAL);
609-
return -EINVAL;
610608
} else {
611-
BUG();
609+
btrfs_err(trans->fs_info,
610+
"unrecognized backref key (%llu %u %llu)",
611+
key.objectid, key.type, key.offset);
612+
btrfs_abort_transaction(trans, -EUCLEAN);
613+
return -EUCLEAN;
612614
}
613615

614616
BUG_ON(num_refs < refs_to_drop);
@@ -639,7 +641,6 @@ static noinline u32 extent_data_ref_count(struct btrfs_path *path,
639641
leaf = path->nodes[0];
640642
btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
641643

642-
BUG_ON(key.type == BTRFS_EXTENT_REF_V0_KEY);
643644
if (iref) {
644645
/*
645646
* If type is invalid, we should have bailed out earlier than
@@ -860,8 +861,10 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
860861
leaf = path->nodes[0];
861862
item_size = btrfs_item_size(leaf, path->slots[0]);
862863
if (unlikely(item_size < sizeof(*ei))) {
863-
err = -EINVAL;
864-
btrfs_print_v0_err(fs_info);
864+
err = -EUCLEAN;
865+
btrfs_err(fs_info,
866+
"unexpected extent item size, has %llu expect >= %zu",
867+
item_size, sizeof(*ei));
865868
btrfs_abort_transaction(trans, err);
866869
goto out;
867870
}
@@ -1662,8 +1665,10 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans,
16621665
item_size = btrfs_item_size(leaf, path->slots[0]);
16631666

16641667
if (unlikely(item_size < sizeof(*ei))) {
1665-
err = -EINVAL;
1666-
btrfs_print_v0_err(fs_info);
1668+
err = -EUCLEAN;
1669+
btrfs_err(fs_info,
1670+
"unexpected extent item size, has %u expect >= %zu",
1671+
item_size, sizeof(*ei));
16671672
btrfs_abort_transaction(trans, err);
16681673
goto out;
16691674
}
@@ -3091,8 +3096,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
30913096
leaf = path->nodes[0];
30923097
item_size = btrfs_item_size(leaf, extent_slot);
30933098
if (unlikely(item_size < sizeof(*ei))) {
3094-
ret = -EINVAL;
3095-
btrfs_print_v0_err(info);
3099+
ret = -EUCLEAN;
3100+
btrfs_err(trans->fs_info,
3101+
"unexpected extent item size, has %u expect >= %zu",
3102+
item_size, sizeof(*ei));
30963103
btrfs_abort_transaction(trans, ret);
30973104
goto out;
30983105
}

fs/btrfs/messages.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,12 +256,6 @@ void __cold _btrfs_printk(const struct btrfs_fs_info *fs_info, const char *fmt,
256256
}
257257
#endif
258258

259-
void __cold btrfs_print_v0_err(struct btrfs_fs_info *fs_info)
260-
{
261-
btrfs_err(fs_info,
262-
"Unsupported V0 extent filesystem detected. Aborting. Please re-create your filesystem with a newer kernel");
263-
}
264-
265259
#if BITS_PER_LONG == 32
266260
void __cold btrfs_warn_32bit_limit(struct btrfs_fs_info *fs_info)
267261
{

fs/btrfs/messages.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,6 @@ do { \
181181
#define ASSERT(expr) (void)(expr)
182182
#endif
183183

184-
void __cold btrfs_print_v0_err(struct btrfs_fs_info *fs_info);
185-
186184
__printf(5, 6)
187185
__cold
188186
void __btrfs_handle_fs_error(struct btrfs_fs_info *fs_info, const char *function,

fs/btrfs/print-tree.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,10 @@ static void print_extent_item(const struct extent_buffer *eb, int slot, int type
9595
int ref_index = 0;
9696

9797
if (unlikely(item_size < sizeof(*ei))) {
98-
btrfs_print_v0_err(eb->fs_info);
99-
btrfs_handle_fs_error(eb->fs_info, -EINVAL, NULL);
98+
btrfs_err(eb->fs_info,
99+
"unexpected extent item size, has %u expect >= %zu",
100+
item_size, sizeof(*ei));
101+
btrfs_handle_fs_error(eb->fs_info, -EUCLEAN, NULL);
100102
}
101103

102104
ei = btrfs_item_ptr(eb, slot, struct btrfs_extent_item);
@@ -291,10 +293,6 @@ void btrfs_print_leaf(const struct extent_buffer *l)
291293
btrfs_file_extent_num_bytes(l, fi),
292294
btrfs_file_extent_ram_bytes(l, fi));
293295
break;
294-
case BTRFS_EXTENT_REF_V0_KEY:
295-
btrfs_print_v0_err(fs_info);
296-
btrfs_handle_fs_error(fs_info, -EINVAL, NULL);
297-
break;
298296
case BTRFS_BLOCK_GROUP_ITEM_KEY:
299297
bi = btrfs_item_ptr(l, i,
300298
struct btrfs_block_group_item);

fs/btrfs/relocation.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3256,12 +3256,13 @@ static int add_tree_block(struct reloc_control *rc,
32563256
if (type == BTRFS_TREE_BLOCK_REF_KEY)
32573257
owner = btrfs_extent_inline_ref_offset(eb, iref);
32583258
}
3259-
} else if (unlikely(item_size == sizeof(struct btrfs_extent_item_v0))) {
3260-
btrfs_print_v0_err(eb->fs_info);
3261-
btrfs_handle_fs_error(eb->fs_info, -EINVAL, NULL);
3262-
return -EINVAL;
32633259
} else {
3264-
BUG();
3260+
btrfs_print_leaf(eb);
3261+
btrfs_err(rc->block_group->fs_info,
3262+
"unrecognized tree backref at tree block %llu slot %u",
3263+
eb->start, path->slots[0]);
3264+
btrfs_release_path(path);
3265+
return -EUCLEAN;
32653266
}
32663267

32673268
btrfs_release_path(path);

include/trace/events/btrfs.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ struct find_free_extent_ctl;
3838
__print_symbolic(type, \
3939
{ BTRFS_TREE_BLOCK_REF_KEY, "TREE_BLOCK_REF" }, \
4040
{ BTRFS_EXTENT_DATA_REF_KEY, "EXTENT_DATA_REF" }, \
41-
{ BTRFS_EXTENT_REF_V0_KEY, "EXTENT_REF_V0" }, \
4241
{ BTRFS_SHARED_BLOCK_REF_KEY, "SHARED_BLOCK_REF" }, \
4342
{ BTRFS_SHARED_DATA_REF_KEY, "SHARED_DATA_REF" })
4443

include/uapi/linux/btrfs_tree.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,11 @@
220220

221221
#define BTRFS_EXTENT_DATA_REF_KEY 178
222222

223-
#define BTRFS_EXTENT_REF_V0_KEY 180
223+
/*
224+
* Obsolete key. Defintion removed in 6.6, value may be reused in the future.
225+
*
226+
* #define BTRFS_EXTENT_REF_V0_KEY 180
227+
*/
224228

225229
#define BTRFS_SHARED_BLOCK_REF_KEY 182
226230

0 commit comments

Comments
 (0)