From: Filipe Manana Date: Wed, 26 Jul 2023 15:57:10 +0000 (+0100) Subject: btrfs: avoid starting new transaction when flushing delayed items and refs X-Git-Tag: v6.6-rc1~207^2~40 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2391245ac2875f784335b9148079c6e73639a5f7;p=thirdparty%2Flinux.git 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 Signed-off-by: David Sterba --- diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c index be5ce209b918d..2db92a2016978 100644 --- a/fs/btrfs/space-info.c +++ b/fs/btrfs/space-info.c @@ -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)