btrfs: refactor variable scope in run_delalloc_nocow

Of the 22 (!!!) local variables declared in this function only 9 have
function-wide context. Of the remaining 13, 12 are needed in the main
while loop of the function and 1 is needed in a tiny if branch, only in
case we have prealloc extent. This commit reduces the lifespan of every
variable to its bare minimum. It also renames the 'nolock' boolean to
freespace_inode to clearly indicate its purpose.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Nikolay Borisov 2019-08-21 10:42:03 +03:00 committed by David Sterba
parent bcacf5f3f9
commit 3e024846d2

View File

@ -1301,30 +1301,18 @@ static noinline int csum_exist_in_range(struct btrfs_fs_info *fs_info,
*/ */
static noinline int run_delalloc_nocow(struct inode *inode, static noinline int run_delalloc_nocow(struct inode *inode,
struct page *locked_page, struct page *locked_page,
u64 start, u64 end, int *page_started, int force, const u64 start, const u64 end,
unsigned long *nr_written) int *page_started, int force,
unsigned long *nr_written)
{ {
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
struct btrfs_root *root = BTRFS_I(inode)->root; struct btrfs_root *root = BTRFS_I(inode)->root;
struct extent_buffer *leaf;
struct btrfs_path *path; struct btrfs_path *path;
struct btrfs_file_extent_item *fi; u64 cow_start = (u64)-1;
struct btrfs_key found_key; u64 cur_offset = start;
struct extent_map *em;
u64 cow_start;
u64 cur_offset;
u64 extent_end;
u64 extent_offset;
u64 disk_bytenr;
u64 num_bytes;
u64 disk_num_bytes;
u64 ram_bytes;
int extent_type;
int ret; int ret;
int type; bool check_prev = true;
int nocow; const bool freespace_inode = btrfs_is_free_space_inode(BTRFS_I(inode));
int check_prev = 1;
bool nolock;
u64 ino = btrfs_ino(BTRFS_I(inode)); u64 ino = btrfs_ino(BTRFS_I(inode));
path = btrfs_alloc_path(); path = btrfs_alloc_path();
@ -1339,11 +1327,20 @@ static noinline int run_delalloc_nocow(struct inode *inode,
return -ENOMEM; return -ENOMEM;
} }
nolock = btrfs_is_free_space_inode(BTRFS_I(inode));
cow_start = (u64)-1;
cur_offset = start;
while (1) { while (1) {
struct btrfs_key found_key;
struct btrfs_file_extent_item *fi;
struct extent_buffer *leaf;
u64 extent_end;
u64 extent_offset;
u64 disk_bytenr = 0;
u64 num_bytes = 0;
u64 disk_num_bytes;
int type;
u64 ram_bytes;
int extent_type;
bool nocow = false;
ret = btrfs_lookup_file_extent(NULL, root, path, ino, ret = btrfs_lookup_file_extent(NULL, root, path, ino,
cur_offset, 0); cur_offset, 0);
if (ret < 0) if (ret < 0)
@ -1356,7 +1353,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
found_key.type == BTRFS_EXTENT_DATA_KEY) found_key.type == BTRFS_EXTENT_DATA_KEY)
path->slots[0]--; path->slots[0]--;
} }
check_prev = 0; check_prev = false;
next_slot: next_slot:
leaf = path->nodes[0]; leaf = path->nodes[0];
if (path->slots[0] >= btrfs_header_nritems(leaf)) { if (path->slots[0] >= btrfs_header_nritems(leaf)) {
@ -1371,9 +1368,6 @@ static noinline int run_delalloc_nocow(struct inode *inode,
leaf = path->nodes[0]; leaf = path->nodes[0];
} }
nocow = 0;
disk_bytenr = 0;
num_bytes = 0;
btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
if (found_key.objectid > ino) if (found_key.objectid > ino)
@ -1420,7 +1414,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
* Do the same check as in btrfs_cross_ref_exist but * Do the same check as in btrfs_cross_ref_exist but
* without the unnecessary search. * without the unnecessary search.
*/ */
if (!nolock && if (!freespace_inode &&
btrfs_file_extent_generation(leaf, fi) <= btrfs_file_extent_generation(leaf, fi) <=
btrfs_root_last_snapshot(&root->root_item)) btrfs_root_last_snapshot(&root->root_item))
goto out_check; goto out_check;
@ -1442,7 +1436,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
goto error; goto error;
} }
WARN_ON_ONCE(nolock); WARN_ON_ONCE(freespace_inode);
goto out_check; goto out_check;
} }
disk_bytenr += extent_offset; disk_bytenr += extent_offset;
@ -1452,7 +1446,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
* if there are pending snapshots for this root, * if there are pending snapshots for this root,
* we fall into common COW way. * we fall into common COW way.
*/ */
if (!nolock && atomic_read(&root->snapshot_force_cow)) if (!freespace_inode && atomic_read(&root->snapshot_force_cow))
goto out_check; goto out_check;
/* /*
* force cow if csum exists in the range. * force cow if csum exists in the range.
@ -1471,12 +1465,12 @@ static noinline int run_delalloc_nocow(struct inode *inode,
cur_offset = cow_start; cur_offset = cow_start;
goto error; goto error;
} }
WARN_ON_ONCE(nolock); WARN_ON_ONCE(freespace_inode);
goto out_check; goto out_check;
} }
if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr)) if (!btrfs_inc_nocow_writers(fs_info, disk_bytenr))
goto out_check; goto out_check;
nocow = 1; nocow = true;
} else if (extent_type == BTRFS_FILE_EXTENT_INLINE) { } else if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
extent_end = found_key.offset + extent_end = found_key.offset +
btrfs_file_extent_ram_bytes(leaf, fi); btrfs_file_extent_ram_bytes(leaf, fi);
@ -1518,6 +1512,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
if (extent_type == BTRFS_FILE_EXTENT_PREALLOC) { if (extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
u64 orig_start = found_key.offset - extent_offset; u64 orig_start = found_key.offset - extent_offset;
struct extent_map *em;
em = create_io_em(inode, cur_offset, num_bytes, em = create_io_em(inode, cur_offset, num_bytes,
orig_start, orig_start,
@ -1543,7 +1538,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
} }
ret = btrfs_add_ordered_extent(inode, cur_offset, disk_bytenr, ret = btrfs_add_ordered_extent(inode, cur_offset, disk_bytenr,
num_bytes, num_bytes, type); num_bytes, num_bytes,type);
if (nocow) if (nocow)
btrfs_dec_nocow_writers(fs_info, disk_bytenr); btrfs_dec_nocow_writers(fs_info, disk_bytenr);
BUG_ON(ret); /* -ENOMEM */ BUG_ON(ret); /* -ENOMEM */