OSDN Git Service

btrfs: refactor unlock_up
authorNikolay Borisov <nborisov@suse.com>
Tue, 14 Dec 2021 13:39:39 +0000 (15:39 +0200)
committerDavid Sterba <dsterba@suse.com>
Fri, 7 Jan 2022 13:18:26 +0000 (14:18 +0100)
The purpose of this function is to unlock all nodes in a btrfs path
which are above 'lowest_unlock' and whose slot used is different than 0.
As such it used slightly awkward structure of 'if' as well as somewhat
cryptic "no_skip" control variable which denotes whether we should
check the current level of skipability or no.

This patch does the following (cosmetic) refactorings:

* Renames 'no_skip' to 'check_skip' and makes it a boolean. This
  variable controls whether we are below the lowest_unlock/skip_level
  levels.

* Consolidates the 2 conditions which warrant checking whether the
  current level should be skipped under 1 common if (check_skip) branch,
  this increase indentation level but is not critical.

* Consolidates the 'skip_level < i && i >= lowest_unlock' and
  'i >= lowest_unlock && i > skip_level' condition into a common branch
  since those are identical.

* Eliminates the local extent_buffer variable as in this case it doesn't
  bring anything to function readability.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
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/ctree.c

index defc494..a7db3f6 100644 (file)
@@ -1349,33 +1349,34 @@ static noinline void unlock_up(struct btrfs_path *path, int level,
 {
        int i;
        int skip_level = level;
-       int no_skips = 0;
-       struct extent_buffer *t;
+       bool check_skip = true;
 
        for (i = level; i < BTRFS_MAX_LEVEL; i++) {
                if (!path->nodes[i])
                        break;
                if (!path->locks[i])
                        break;
-               if (!no_skips && path->slots[i] == 0) {
-                       skip_level = i + 1;
-                       continue;
-               }
-               if (!no_skips && path->keep_locks) {
-                       u32 nritems;
-                       t = path->nodes[i];
-                       nritems = btrfs_header_nritems(t);
-                       if (nritems < 1 || path->slots[i] >= nritems - 1) {
+
+               if (check_skip) {
+                       if (path->slots[i] == 0) {
                                skip_level = i + 1;
                                continue;
                        }
+
+                       if (path->keep_locks) {
+                               u32 nritems;
+
+                               nritems = btrfs_header_nritems(path->nodes[i]);
+                               if (nritems < 1 || path->slots[i] >= nritems - 1) {
+                                       skip_level = i + 1;
+                                       continue;
+                               }
+                       }
                }
-               if (skip_level < i && i >= lowest_unlock)
-                       no_skips = 1;
 
-               t = path->nodes[i];
                if (i >= lowest_unlock && i > skip_level) {
-                       btrfs_tree_unlock_rw(t, path->locks[i]);
+                       check_skip = false;
+                       btrfs_tree_unlock_rw(path->nodes[i], path->locks[i]);
                        path->locks[i] = 0;
                        if (write_lock_level &&
                            i > min_write_lock_level &&