Commit af431dcb authored by Su Yue's avatar Su Yue Committed by David Sterba
Browse files

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: default avatarSu Yue <suy.fnst@cn.fujitsu.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent e4af400a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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,
							BTRFS_REF_TYPE_ANY);
		if (type == BTRFS_REF_TYPE_INVALID)
			return -EINVAL;
			return -EUCLEAN;

		offset = btrfs_extent_inline_ref_offset(leaf, iref);

@@ -1793,7 +1793,7 @@ static int get_extent_inline_ref(unsigned long *ptr,
	*out_type = btrfs_get_extent_inline_ref_type(eb, *out_eiref,
						     BTRFS_REF_TYPE_ANY);
	if (*out_type == BTRFS_REF_TYPE_INVALID)
		return -EINVAL;
		return -EUCLEAN;

	*ptr += btrfs_extent_inline_ref_size(*out_type);
	WARN_ON(*ptr > end);
+1 −1
Original line number Diff line number Diff line
@@ -1719,7 +1719,7 @@ again:
		iref = (struct btrfs_extent_inline_ref *)ptr;
		type = btrfs_get_extent_inline_ref_type(leaf, iref, needed);
		if (type == BTRFS_REF_TYPE_INVALID) {
			err = -EINVAL;
			err = -EUCLEAN;
			goto out;
		}

+2 −2
Original line number Diff line number Diff line
@@ -792,7 +792,7 @@ again:
			type = btrfs_get_extent_inline_ref_type(eb, iref,
							BTRFS_REF_TYPE_BLOCK);
			if (type == BTRFS_REF_TYPE_INVALID) {
				err = -EINVAL;
				err = -EUCLEAN;
				goto out;
			}
			key.type = type;
@@ -3801,7 +3801,7 @@ int add_data_references(struct reloc_control *rc,
			ret = find_data_references(rc, extent_key,
						   eb, dref, blocks);
		} else {
			ret = -EINVAL;
			ret = -EUCLEAN;
			btrfs_err(rc->extent_root->fs_info,
		     "extent %llu slot %d has an invalid inline ref type",
			     eb->start, path->slots[0]);