btrfs_inc_block_group_ro wants to ensure that the current transaction is
not running dirty block groups, if it is it waits and loops again.
That logic is currently implemented using a goto label. Actually using
a proper do {} while() construct doesn't hurt readibility nor does it
introduce excessive nesting and makes the relevant code stand out by
being encompassed in the loop construct. No functional changes.

Signed-off-by: Nikolay Borisov <nbori...@suse.com>
---
 fs/btrfs/block-group.c | 42 +++++++++++++++++++++++-------------------
 1 file changed, 23 insertions(+), 19 deletions(-)

diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c
index 5064be59dac5..fabd25b76abb 100644
--- a/fs/btrfs/block-group.c
+++ b/fs/btrfs/block-group.c
@@ -2262,29 +2262,33 @@ int btrfs_inc_block_group_ro(struct btrfs_block_group 
*cache,
        struct btrfs_trans_handle *trans;
        u64 alloc_flags;
        int ret;
+       bool dirty_bg_running;
 
-again:
-       trans = btrfs_join_transaction(fs_info->extent_root);
-       if (IS_ERR(trans))
-               return PTR_ERR(trans);
+       do {
+               trans = btrfs_join_transaction(fs_info->extent_root);
+               if (IS_ERR(trans))
+                       return PTR_ERR(trans);
 
-       /*
-        * we're not allowed to set block groups readonly after the dirty
-        * block groups cache has started writing.  If it already started,
-        * back off and let this transaction commit
-        */
-       mutex_lock(&fs_info->ro_block_group_mutex);
-       if (test_bit(BTRFS_TRANS_DIRTY_BG_RUN, &trans->transaction->flags)) {
-               u64 transid = trans->transid;
+               dirty_bg_running = false;
 
-               mutex_unlock(&fs_info->ro_block_group_mutex);
-               btrfs_end_transaction(trans);
+               /*
+                * we're not allowed to set block groups readonly after the 
dirty
+                * block groups cache has started writing.  If it already 
started,
+                * back off and let this transaction commit
+                */
+               mutex_lock(&fs_info->ro_block_group_mutex);
+               if (test_bit(BTRFS_TRANS_DIRTY_BG_RUN, 
&trans->transaction->flags)) {
+                       u64 transid = trans->transid;
 
-               ret = btrfs_wait_for_commit(fs_info, transid);
-               if (ret)
-                       return ret;
-               goto again;
-       }
+                       mutex_unlock(&fs_info->ro_block_group_mutex);
+                       btrfs_end_transaction(trans);
+
+                       ret = btrfs_wait_for_commit(fs_info, transid);
+                       if (ret)
+                               return ret;
+                       dirty_bg_running = true;
+               }
+       } while (dirty_bg_running);
 
        if (do_chunk_alloc) {
                /*
-- 
2.25.1

Reply via email to