mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
btrfs: avoid starting and committing empty transaction when flushing space
When flushing space and we are in the COMMIT_TRANS state, we join a transaction with btrfs_join_transaction() and then commit the returned transaction. However btrfs_join_transaction() starts a new transaction if there is none currently open, which is pointless since comitting a new, empty transaction, doesn't achieve anything, it only wastes time, IO and creates an unnecessary rotation of the backup roots. So use btrfs_attach_transaction_barrier() to avoid starting a new transaction. This also waits for any ongoing transaction that is committing (state >= TRANS_STATE_COMMIT_DOING) to fully complete, and therefore wait for all the extents that were pinned during the transaction's lifetime to be unpinned. Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
2391245ac2
commit
2ee70ed19c
@ -814,9 +814,18 @@ static void flush_space(struct btrfs_fs_info *fs_info,
|
||||
break;
|
||||
case COMMIT_TRANS:
|
||||
ASSERT(current->journal_info == NULL);
|
||||
trans = btrfs_join_transaction(root);
|
||||
/*
|
||||
* We don't want to start a new transaction, just attach to the
|
||||
* current one or wait it fully commits in case its commit is
|
||||
* happening at the moment. Note: we don't use a nostart join
|
||||
* because that does not wait for a transaction to fully commit
|
||||
* (only for it to be unblocked, state TRANS_STATE_UNBLOCKED).
|
||||
*/
|
||||
trans = btrfs_attach_transaction_barrier(root);
|
||||
if (IS_ERR(trans)) {
|
||||
ret = PTR_ERR(trans);
|
||||
if (ret == -ENOENT)
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
ret = btrfs_commit_transaction(trans);
|
||||
|
Loading…
Reference in New Issue
Block a user