u64 ref_root;
                u8 ref_level;
 
-               do {
+               while (true) {
                        ret = tree_backref_for_extent(&ptr, eb, &found_key, ei,
                                                      item_size, &ref_root,
                                                      &ref_level);
+                       if (ret < 0) {
+                               btrfs_warn_rl(fs_info,
+                               "failed to resolve tree backref for logical %llu: %d",
+                                             logical, ret);
+                               break;
+                       }
+                       if (ret > 0)
+                               break;
+
                        btrfs_warn_rl(fs_info,
 "csum error at logical %llu mirror %u: metadata %s (level %d) in tree %llu",
                                logical, mirror_num,
                                (ref_level ? "node" : "leaf"),
-                               (ret < 0 ? -1 : ref_level),
-                               (ret < 0 ? -1 : ref_root));
-               } while (ret != 1);
+                               ref_level, ref_root);
+               }
                btrfs_release_path(&path);
        } else {
                struct btrfs_backref_walk_ctx ctx = { 0 };
 
        struct extent_buffer *eb;
        struct btrfs_extent_item *ei;
        struct scrub_warning swarn;
-       unsigned long ptr = 0;
        u64 flags = 0;
-       u64 ref_root;
        u32 item_size;
-       u8 ref_level = 0;
        int ret;
 
        /* Super block error, no need to search extent tree. */
        item_size = btrfs_item_size(eb, path->slots[0]);
 
        if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) {
-               do {
+               unsigned long ptr = 0;
+               u8 ref_level;
+               u64 ref_root;
+
+               while (true) {
                        ret = tree_backref_for_extent(&ptr, eb, &found_key, ei,
                                                      item_size, &ref_root,
                                                      &ref_level);
+                       if (ret < 0) {
+                               btrfs_warn(fs_info,
+                               "failed to resolve tree backref for logical %llu: %d",
+                                                 swarn.logical, ret);
+                               break;
+                       }
+                       if (ret > 0)
+                               break;
                        btrfs_warn_in_rcu(fs_info,
 "%s at logical %llu on dev %s, physical %llu: metadata %s (level %d) in tree %llu",
-                               errstr, swarn.logical,
-                               btrfs_dev_name(dev),
-                               swarn.physical,
-                               ref_level ? "node" : "leaf",
-                               ret < 0 ? -1 : ref_level,
-                               ret < 0 ? -1 : ref_root);
-               } while (ret != 1);
+                               errstr, swarn.logical, btrfs_dev_name(dev),
+                               swarn.physical, (ref_level ? "node" : "leaf"),
+                               ref_level, ref_root);
+               }
                btrfs_release_path(path);
        } else {
                struct btrfs_backref_walk_ctx ctx = { 0 };