提交 af431dcb 编写于 作者: S Su Yue 提交者: David Sterba

btrfs: return EUCLEAN if extent_inline_ref type is invalid

If type of extent_inline_ref found is not expected, filesystem may have
been corrupted, should return EUCLEAN instead of EINVAL.
Signed-off-by: NSu Yue <suy.fnst@cn.fujitsu.com>
Reviewed-by: NDavid Sterba <dsterba@suse.com>
Signed-off-by: NDavid Sterba <dsterba@suse.com>
上级 e4af400a
...@@ -925,7 +925,7 @@ static int add_inline_refs(const struct btrfs_fs_info *fs_info, ...@@ -925,7 +925,7 @@ static int add_inline_refs(const struct btrfs_fs_info *fs_info,
type = btrfs_get_extent_inline_ref_type(leaf, iref, type = btrfs_get_extent_inline_ref_type(leaf, iref,
BTRFS_REF_TYPE_ANY); BTRFS_REF_TYPE_ANY);
if (type == BTRFS_REF_TYPE_INVALID) if (type == BTRFS_REF_TYPE_INVALID)
return -EINVAL; return -EUCLEAN;
offset = btrfs_extent_inline_ref_offset(leaf, iref); offset = btrfs_extent_inline_ref_offset(leaf, iref);
...@@ -1793,7 +1793,7 @@ static int get_extent_inline_ref(unsigned long *ptr, ...@@ -1793,7 +1793,7 @@ static int get_extent_inline_ref(unsigned long *ptr,
*out_type = btrfs_get_extent_inline_ref_type(eb, *out_eiref, *out_type = btrfs_get_extent_inline_ref_type(eb, *out_eiref,
BTRFS_REF_TYPE_ANY); BTRFS_REF_TYPE_ANY);
if (*out_type == BTRFS_REF_TYPE_INVALID) if (*out_type == BTRFS_REF_TYPE_INVALID)
return -EINVAL; return -EUCLEAN;
*ptr += btrfs_extent_inline_ref_size(*out_type); *ptr += btrfs_extent_inline_ref_size(*out_type);
WARN_ON(*ptr > end); WARN_ON(*ptr > end);
......
...@@ -1719,7 +1719,7 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans, ...@@ -1719,7 +1719,7 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
iref = (struct btrfs_extent_inline_ref *)ptr; iref = (struct btrfs_extent_inline_ref *)ptr;
type = btrfs_get_extent_inline_ref_type(leaf, iref, needed); type = btrfs_get_extent_inline_ref_type(leaf, iref, needed);
if (type == BTRFS_REF_TYPE_INVALID) { if (type == BTRFS_REF_TYPE_INVALID) {
err = -EINVAL; err = -EUCLEAN;
goto out; goto out;
} }
......
...@@ -792,7 +792,7 @@ struct backref_node *build_backref_tree(struct reloc_control *rc, ...@@ -792,7 +792,7 @@ struct backref_node *build_backref_tree(struct reloc_control *rc,
type = btrfs_get_extent_inline_ref_type(eb, iref, type = btrfs_get_extent_inline_ref_type(eb, iref,
BTRFS_REF_TYPE_BLOCK); BTRFS_REF_TYPE_BLOCK);
if (type == BTRFS_REF_TYPE_INVALID) { if (type == BTRFS_REF_TYPE_INVALID) {
err = -EINVAL; err = -EUCLEAN;
goto out; goto out;
} }
key.type = type; key.type = type;
...@@ -3801,7 +3801,7 @@ int add_data_references(struct reloc_control *rc, ...@@ -3801,7 +3801,7 @@ int add_data_references(struct reloc_control *rc,
ret = find_data_references(rc, extent_key, ret = find_data_references(rc, extent_key,
eb, dref, blocks); eb, dref, blocks);
} else { } else {
ret = -EINVAL; ret = -EUCLEAN;
btrfs_err(rc->extent_root->fs_info, btrfs_err(rc->extent_root->fs_info,
"extent %llu slot %d has an invalid inline ref type", "extent %llu slot %d has an invalid inline ref type",
eb->start, path->slots[0]); eb->start, path->slots[0]);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册