]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: handle errors from ref mods during UPDATE_BACKREF in walk_down_proc()
authorJosef Bacik <josef@toxicpanda.com>
Tue, 7 May 2024 18:12:11 +0000 (14:12 -0400)
committerDavid Sterba <dsterba@suse.com>
Thu, 11 Jul 2024 13:33:25 +0000 (15:33 +0200)
We have blanket BUG_ON(ret) after every one of these reference mod
attempts, which is just incorrect.  If we encounter any errors during
walk_down_tree() we will abort, so abort on any one of these failures.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent-tree.c

index 915ae708ebc760e4dfe74d39e8f62b8b13f29a21..53f12a12ee77e60fe4a64689a383f73cff3a9e6b 100644 (file)
@@ -5417,11 +5417,20 @@ static noinline int walk_down_proc(struct btrfs_trans_handle *trans,
        if (!(wc->flags[level] & flag)) {
                BUG_ON(!path->locks[level]);
                ret = btrfs_inc_ref(trans, root, eb, 1);
-               BUG_ON(ret); /* -ENOMEM */
+               if (ret) {
+                       btrfs_abort_transaction(trans, ret);
+                       return ret;
+               }
                ret = btrfs_dec_ref(trans, root, eb, 0);
-               BUG_ON(ret); /* -ENOMEM */
+               if (ret) {
+                       btrfs_abort_transaction(trans, ret);
+                       return ret;
+               }
                ret = btrfs_set_disk_extent_flags(trans, eb, flag);
-               BUG_ON(ret); /* -ENOMEM */
+               if (ret) {
+                       btrfs_abort_transaction(trans, ret);
+                       return ret;
+               }
                wc->flags[level] |= flag;
        }