mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 22:50:41 +00:00
btrfs: avoid starting new transaction when flushing delayed items and refs
When flushing space we join a transaction to flush delayed items and delayed references, in order to try to release space. However using btrfs_join_transaction() not only joins an existing transaction as well as it starts a new transaction if there is none open. If there is no transaction open, we don't have neither delayed items nor delayed references, so creating a new transaction is a waste of time, IO and creates an unnecessary rotation of the backup roots without gaining any benefits (including releasing space). So use btrfs_join_transaction_nostart() when attempting to flush delayed items and references. Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
ed8947bc73
commit
2391245ac2
@ -725,9 +725,11 @@ static void flush_space(struct btrfs_fs_info *fs_info,
|
||||
else
|
||||
nr = -1;
|
||||
|
||||
trans = btrfs_join_transaction(root);
|
||||
trans = btrfs_join_transaction_nostart(root);
|
||||
if (IS_ERR(trans)) {
|
||||
ret = PTR_ERR(trans);
|
||||
if (ret == -ENOENT)
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
ret = btrfs_run_delayed_items_nr(trans, nr);
|
||||
@ -743,9 +745,11 @@ static void flush_space(struct btrfs_fs_info *fs_info,
|
||||
break;
|
||||
case FLUSH_DELAYED_REFS_NR:
|
||||
case FLUSH_DELAYED_REFS:
|
||||
trans = btrfs_join_transaction(root);
|
||||
trans = btrfs_join_transaction_nostart(root);
|
||||
if (IS_ERR(trans)) {
|
||||
ret = PTR_ERR(trans);
|
||||
if (ret == -ENOENT)
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
if (state == FLUSH_DELAYED_REFS_NR)
|
||||
|
Loading…
x
Reference in New Issue
Block a user