mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 22:54:05 +08:00
btrfs: simplify error handling of clean_pinned_extents()
At clean_pinned_extents(), whether we end up returning success or failure, we pretty much have to do the same things: 1) unlock unused_bg_unpin_mutex 2) decrement reference count on the previous transaction We also call btrfs_dec_block_group_ro() in case of failure, but that is better done in its caller, btrfs_delete_unused_bgs(), since its the caller that calls inc_block_group_ro(), so it should be responsible for the decrement operation, as it is in case any of the other functions it calls fail. So move the call to btrfs_dec_block_group_ro() from clean_pinned_extents() into btrfs_delete_unused_bgs() and unify the error and success return paths for clean_pinned_extents(), reducing duplicated code and making it simpler. Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
e3b8336117
commit
534cf531cc
@ -1284,25 +1284,17 @@ static bool clean_pinned_extents(struct btrfs_trans_handle *trans,
|
||||
ret = clear_extent_bits(&prev_trans->pinned_extents, start, end,
|
||||
EXTENT_DIRTY);
|
||||
if (ret)
|
||||
goto err;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = clear_extent_bits(&trans->transaction->pinned_extents, start, end,
|
||||
EXTENT_DIRTY);
|
||||
if (ret)
|
||||
goto err;
|
||||
out:
|
||||
mutex_unlock(&fs_info->unused_bg_unpin_mutex);
|
||||
if (prev_trans)
|
||||
btrfs_put_transaction(prev_trans);
|
||||
|
||||
return true;
|
||||
|
||||
err:
|
||||
mutex_unlock(&fs_info->unused_bg_unpin_mutex);
|
||||
if (prev_trans)
|
||||
btrfs_put_transaction(prev_trans);
|
||||
btrfs_dec_block_group_ro(bg);
|
||||
return false;
|
||||
return ret == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1400,8 +1392,10 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info)
|
||||
* We could have pending pinned extents for this block group,
|
||||
* just delete them, we don't care about them anymore.
|
||||
*/
|
||||
if (!clean_pinned_extents(trans, block_group))
|
||||
if (!clean_pinned_extents(trans, block_group)) {
|
||||
btrfs_dec_block_group_ro(block_group);
|
||||
goto end_trans;
|
||||
}
|
||||
|
||||
/*
|
||||
* At this point, the block_group is read only and should fail
|
||||
|
Loading…
Reference in New Issue
Block a user