mirror of
https://github.com/torvalds/linux.git
synced 2024-09-20 15:03:04 +00:00
btrfs: make the logic from btrfs_block_can_be_shared() easier to read
The logic in btrfs_block_can_be_shared() is hard to follow as we have a lot of conditions in a single if statement including a subexpression with a logical or and two nested if statements inside the main if statement. Make this easier to read by using separate if statements that return immediately when we find a condition that determines if a block can be or can not be shared. Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
6e5de50fc5
commit
80d197fe04
|
@ -374,27 +374,35 @@ bool btrfs_block_can_be_shared(struct btrfs_trans_handle *trans,
|
|||
struct btrfs_root *root,
|
||||
struct extent_buffer *buf)
|
||||
{
|
||||
const u64 buf_gen = btrfs_header_generation(buf);
|
||||
|
||||
/*
|
||||
* Tree blocks not in shareable trees and tree roots are never shared.
|
||||
* If a block was allocated after the last snapshot and the block was
|
||||
* not allocated by tree relocation, we know the block is not shared.
|
||||
*/
|
||||
if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state) &&
|
||||
buf != root->node &&
|
||||
(btrfs_header_generation(buf) <=
|
||||
btrfs_root_last_snapshot(&root->root_item) ||
|
||||
btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))) {
|
||||
if (buf != root->commit_root)
|
||||
return true;
|
||||
/*
|
||||
* An extent buffer that used to be the commit root may still be
|
||||
* shared because the tree height may have increased and it
|
||||
* became a child of a higher level root. This can happen when
|
||||
* snapshotting a subvolume created in the current transaction.
|
||||
*/
|
||||
if (btrfs_header_generation(buf) == trans->transid)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!test_bit(BTRFS_ROOT_SHAREABLE, &root->state))
|
||||
return false;
|
||||
|
||||
if (buf == root->node)
|
||||
return false;
|
||||
|
||||
if (buf_gen > btrfs_root_last_snapshot(&root->root_item) &&
|
||||
!btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC))
|
||||
return false;
|
||||
|
||||
if (buf != root->commit_root)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* An extent buffer that used to be the commit root may still be shared
|
||||
* because the tree height may have increased and it became a child of a
|
||||
* higher level root. This can happen when snapshotting a subvolume
|
||||
* created in the current transaction.
|
||||
*/
|
||||
if (buf_gen == trans->transid)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user