btrfs: rework error detection in init_tree_roots
authorNikolay Borisov <nborisov@suse.com>
Wed, 12 Aug 2020 13:16:35 +0000 (16:16 +0300)
committerDavid Sterba <dsterba@suse.com>
Wed, 7 Oct 2020 10:12:14 +0000 (12:12 +0200)
To avoid duplicating 3 lines of code the error detection logic in
init_tree_roots is somewhat quirky. It first checks for the presence of
any error condition, then checks for the specific condition to perform
any specific actions. That's spurious because directly checking for
each respective error condition and doing the necessary steps is more
obvious. While at it change the -EUCLEAN to -EIO in case the extent
buffer is not read correctly, this is in line with other sites which
return -EIO when the eb couldn't be read.

Additionally it results in smaller code and the code reads
more linearly:

add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-95 (-95)
Function                                     old     new   delta
open_ctree                                 17243   17148     -95
Total: Before=113104, After=113009, chg -0.08%

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/disk-io.c

index 84799ef767583e4aa3d0ee32f8a88a85f9aeefb8..4eb56f00ee81675183206035d74a6a3c33e11cd7 100644 (file)
@@ -2623,18 +2623,17 @@ static int __cold init_tree_roots(struct btrfs_fs_info *fs_info)
                level = btrfs_super_root_level(sb);
                tree_root->node = read_tree_block(fs_info, btrfs_super_root(sb),
                                                  generation, level, NULL);
-               if (IS_ERR(tree_root->node) ||
-                   !extent_buffer_uptodate(tree_root->node)) {
+               if (IS_ERR(tree_root->node)) {
                        handle_error = true;
+                       ret = PTR_ERR(tree_root->node);
+                       tree_root->node = NULL;
+                       btrfs_warn(fs_info, "couldn't read tree root");
+                       continue;
 
-                       if (IS_ERR(tree_root->node)) {
-                               ret = PTR_ERR(tree_root->node);
-                               tree_root->node = NULL;
-                       } else if (!extent_buffer_uptodate(tree_root->node)) {
-                               ret = -EUCLEAN;
-                       }
-
-                       btrfs_warn(fs_info, "failed to read tree root");
+               } else if (!extent_buffer_uptodate(tree_root->node)) {
+                       handle_error = true;
+                       ret = -EIO;
+                       btrfs_warn(fs_info, "error while reading tree root");
                        continue;
                }