btrfs-progs: check: lowmem: Factor out inline extent checking code in its own function

Since the inline extent code can be largely self-sufficient, factor
it out from check_file_extent. No functional changes.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com>
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Nikolay Borisov 2018-09-13 15:05:05 +03:00 committed by David Sterba
parent 22e4767950
commit 2daecf07f3

View file

@ -1800,6 +1800,81 @@ recover:
return ret;
}
static int check_file_extent_inline(struct btrfs_root *root,
struct btrfs_path *path, u64 *size,
u64 *end)
{
u32 max_inline_extent_size = min_t(u32, root->fs_info->sectorsize - 1,
BTRFS_MAX_INLINE_DATA_SIZE(root->fs_info));
struct extent_buffer *node = path->nodes[0];
struct btrfs_item *e = btrfs_item_nr(path->slots[0]);
struct btrfs_file_extent_item *fi;
struct btrfs_key fkey;
u64 extent_num_bytes;
u32 item_inline_len;
int ret;
int compressed = 0;
int err = 0;
fi = btrfs_item_ptr(node, path->slots[0], struct btrfs_file_extent_item);
item_inline_len = btrfs_file_extent_inline_item_len(node, e);
extent_num_bytes = btrfs_file_extent_ram_bytes(node, fi);
compressed = btrfs_file_extent_compression(node, fi);
btrfs_item_key_to_cpu(node, &fkey, path->slots[0]);
if (extent_num_bytes == 0) {
error(
"root %llu EXTENT_DATA[%llu %llu] has empty inline extent",
root->objectid, fkey.objectid, fkey.offset);
err |= FILE_EXTENT_ERROR;
}
if (compressed) {
if (extent_num_bytes > root->fs_info->sectorsize) {
error(
"root %llu EXTENT_DATA[%llu %llu] too large inline extent ram size, have %llu, max: %u",
root->objectid, fkey.objectid, fkey.offset,
extent_num_bytes, root->fs_info->sectorsize - 1);
err |= FILE_EXTENT_ERROR;
}
if (item_inline_len > max_inline_extent_size) {
error(
"root %llu EXTENT_DATA[%llu %llu] too large inline extent on-disk size, have %u, max: %u",
root->objectid, fkey.objectid, fkey.offset,
item_inline_len, max_inline_extent_size);
err |= FILE_EXTENT_ERROR;
}
} else {
if (extent_num_bytes > max_inline_extent_size) {
error(
"root %llu EXTENT_DATA[%llu %llu] too large inline extent size, have %llu, max: %u",
root->objectid, fkey.objectid, fkey.offset,
extent_num_bytes, max_inline_extent_size);
err |= FILE_EXTENT_ERROR;
}
}
if (!compressed && extent_num_bytes != item_inline_len) {
error(
"root %llu EXTENT_DATA[%llu %llu] wrong inline size, have: %llu, expected: %u",
root->objectid, fkey.objectid, fkey.offset,
extent_num_bytes, item_inline_len);
if (repair) {
ret = repair_inline_ram_bytes(root, path,
&extent_num_bytes);
if (ret)
err |= FILE_EXTENT_ERROR;
} else {
err |= FILE_EXTENT_ERROR;
}
}
*end += extent_num_bytes;
*size += extent_num_bytes;
return err;
}
/*
* Check file extent datasum/hole, update the size of the file extents,
* check and update the last offset of the file extent.
@ -1824,8 +1899,6 @@ static int check_file_extent(struct btrfs_root *root, struct btrfs_path *path,
u64 csum_found; /* In byte size, sectorsize aligned */
u64 search_start; /* Logical range start we search for csum */
u64 search_len; /* Logical range len we search for csum */
u32 max_inline_extent_size = min_t(u32, root->fs_info->sectorsize - 1,
BTRFS_MAX_INLINE_DATA_SIZE(root->fs_info));
unsigned int extent_type;
unsigned int is_hole;
int slot = path->slots[0];
@ -1838,63 +1911,8 @@ static int check_file_extent(struct btrfs_root *root, struct btrfs_path *path,
/* Check inline extent */
extent_type = btrfs_file_extent_type(node, fi);
if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
struct btrfs_item *e = btrfs_item_nr(slot);
u32 item_inline_len;
item_inline_len = btrfs_file_extent_inline_item_len(node, e);
extent_num_bytes = btrfs_file_extent_ram_bytes(node, fi);
compressed = btrfs_file_extent_compression(node, fi);
if (extent_num_bytes == 0) {
error(
"root %llu EXTENT_DATA[%llu %llu] has empty inline extent",
root->objectid, fkey.objectid, fkey.offset);
err |= FILE_EXTENT_ERROR;
}
if (compressed) {
if (extent_num_bytes > root->fs_info->sectorsize) {
error(
"root %llu EXTENT_DATA[%llu %llu] too large inline extent ram size, have %llu, max: %u",
root->objectid, fkey.objectid,
fkey.offset, extent_num_bytes,
root->fs_info->sectorsize - 1);
err |= FILE_EXTENT_ERROR;
}
if (item_inline_len > max_inline_extent_size) {
error(
"root %llu EXTENT_DATA[%llu %llu] too large inline extent on-disk size, have %u, max: %u",
root->objectid, fkey.objectid,
fkey.offset, item_inline_len,
max_inline_extent_size);
err |= FILE_EXTENT_ERROR;
}
} else {
if (extent_num_bytes > max_inline_extent_size) {
error(
"root %llu EXTENT_DATA[%llu %llu] too large inline extent size, have %llu, max: %u",
root->objectid, fkey.objectid, fkey.offset,
extent_num_bytes, max_inline_extent_size);
err |= FILE_EXTENT_ERROR;
}
}
if (!compressed && extent_num_bytes != item_inline_len) {
error(
"root %llu EXTENT_DATA[%llu %llu] wrong inline size, have: %llu, expected: %u",
root->objectid, fkey.objectid, fkey.offset,
extent_num_bytes, item_inline_len);
if (repair) {
ret = repair_inline_ram_bytes(root, path,
&extent_num_bytes);
if (ret)
err |= FILE_EXTENT_ERROR;
} else {
err |= FILE_EXTENT_ERROR;
}
}
*end += extent_num_bytes;
*size += extent_num_bytes;
return err;
}
if (extent_type == BTRFS_FILE_EXTENT_INLINE)
return check_file_extent_inline(root, path, size, end);
/* Check extent type */
if (extent_type != BTRFS_FILE_EXTENT_REG &&