OSDN Git Service

btrfs: replace open coded while loop with proper construct
authorNikolay Borisov <nborisov@suse.com>
Wed, 17 Feb 2021 13:12:50 +0000 (15:12 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Apr 2021 15:25:14 +0000 (17:25 +0200)
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 readability 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 <nborisov@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/block-group.c

index 744b99d..85077c9 100644 (file)
@@ -2267,29 +2267,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 group 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) {
                /*