Commit da8848ac authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba

btrfs: simplify check for extent item overrun at lookup_inline_extent_backref()

At lookup_inline_extent_backref() we can simplify the check for an overrun
of the extent item by making the while loop's condition to be "ptr < end"
and then check after the loop if an overrun happened ("ptr > end"). This
reduces indentation and makes the loop condition more clear. So move the
check out of the loop and change the loop condition accordingly, while
also adding the 'unlikely' tag to the check since it's not supposed to be
triggered.
Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent eba444f1
...@@ -883,17 +883,7 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans, ...@@ -883,17 +883,7 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
needed = BTRFS_REF_TYPE_BLOCK; needed = BTRFS_REF_TYPE_BLOCK;
ret = -ENOENT; ret = -ENOENT;
while (1) { while (ptr < end) {
if (ptr >= end) {
if (ptr > end) {
ret = -EUCLEAN;
btrfs_print_leaf(path->nodes[0]);
btrfs_crit(fs_info,
"overrun extent record at slot %d while looking for inline extent for root %llu owner %llu offset %llu parent %llu",
path->slots[0], root_objectid, owner, offset, parent);
}
break;
}
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) {
...@@ -940,6 +930,16 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans, ...@@ -940,6 +930,16 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
} }
ptr += btrfs_extent_inline_ref_size(type); ptr += btrfs_extent_inline_ref_size(type);
} }
if (unlikely(ptr > end)) {
ret = -EUCLEAN;
btrfs_print_leaf(path->nodes[0]);
btrfs_crit(fs_info,
"overrun extent record at slot %d while looking for inline extent for root %llu owner %llu offset %llu parent %llu",
path->slots[0], root_objectid, owner, offset, parent);
goto out;
}
if (ret == -ENOENT && insert) { if (ret == -ENOENT && insert) {
if (item_size + extra_size >= if (item_size + extra_size >=
BTRFS_MAX_EXTENT_ITEM_SIZE(root)) { BTRFS_MAX_EXTENT_ITEM_SIZE(root)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment