This was added a very long time ago to work around issues with delayed
refs and with qgroups.  Both of these issues have since been properly
fixed, so all this does is cause a lot of lock contention with anybody
else who is running delayed refs.

Signed-off-by: Josef Bacik <[email protected]>
---
 fs/btrfs/transaction.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index 51c5c2f6e064..70cbc15fc58a 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -1228,10 +1228,6 @@ static noinline int commit_cowonly_roots(struct 
btrfs_trans_handle *trans)
        btrfs_tree_unlock(eb);
        free_extent_buffer(eb);
 
-       if (ret)
-               return ret;
-
-       ret = btrfs_run_delayed_refs(trans, (unsigned long)-1);
        if (ret)
                return ret;
 
@@ -1249,10 +1245,6 @@ static noinline int commit_cowonly_roots(struct 
btrfs_trans_handle *trans)
        if (ret)
                return ret;
 
-       /* run_qgroups might have added some more refs */
-       ret = btrfs_run_delayed_refs(trans, (unsigned long)-1);
-       if (ret)
-               return ret;
 again:
        while (!list_empty(&fs_info->dirty_cowonly_roots)) {
                struct btrfs_root *root;
@@ -1267,15 +1259,24 @@ static noinline int commit_cowonly_roots(struct 
btrfs_trans_handle *trans)
                ret = update_cowonly_root(trans, root);
                if (ret)
                        return ret;
-               ret = btrfs_run_delayed_refs(trans, (unsigned long)-1);
-               if (ret)
-                       return ret;
        }
 
+       /* Now flush any delayed refs generated by updating all of the roots. */
+       ret = btrfs_run_delayed_refs(trans, (unsigned long)-1);
+       if (ret)
+               return ret;
+
        while (!list_empty(dirty_bgs) || !list_empty(io_bgs)) {
                ret = btrfs_write_dirty_block_groups(trans);
                if (ret)
                        return ret;
+
+               /*
+                * We're writing the dirty block groups, which could generate
+                * delayed refs, which could generate more dirty block groups,
+                * so we want to keep this flushing in this loop to make sure
+                * everything gets run.
+                */
                ret = btrfs_run_delayed_refs(trans, (unsigned long)-1);
                if (ret)
                        return ret;
-- 
2.26.2

Reply via email to