summaryrefslogtreecommitdiff
path: root/check/mode-lowmem.c
diff options
context:
space:
mode:
authorNikolay Borisov <nborisov@suse.com>2018-09-13 15:05:05 +0300
committerDavid Sterba <dsterba@suse.com>2018-10-31 18:24:13 +0100
commit2daecf07f3f0459d62f513d4fc1f130e0f4578da (patch)
tree1fe2e06edfa5fae56e50f0033c0d03ee9fba1b91 /check/mode-lowmem.c
parent22e47679504de19b3d3256f1d741d5465112fe0a (diff)
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>
Diffstat (limited to 'check/mode-lowmem.c')
-rw-r--r--check/mode-lowmem.c136
1 files changed, 77 insertions, 59 deletions
diff --git a/check/mode-lowmem.c b/check/mode-lowmem.c
index 1bce44f5..0677332d 100644
--- a/check/mode-lowmem.c
+++ b/check/mode-lowmem.c
@@ -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 &&