-From 8ed10e3be3d7f6905f1a98b67b823e83668664e3 Mon Sep 17 00:00:00 2001
+From 0d68eefaee4ab5908c73b86de4a9ec369ea322d4 Mon Sep 17 00:00:00 2001
From: Sasha Levin <sashal@kernel.org>
Date: Thu, 8 Jun 2023 11:27:41 +0100
Subject: btrfs: do not BUG_ON() on tree mod log failure at balance_level()
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
- fs/btrfs/ctree.c | 16 ++++++++++++++--
- 1 file changed, 14 insertions(+), 2 deletions(-)
+ fs/btrfs/ctree.c | 17 ++++++++++++++---
+ 1 file changed, 14 insertions(+), 3 deletions(-)
-diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
-index ab9f8d6c4f1b9..1cd6ce6aafb00 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
-@@ -935,7 +935,12 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
+@@ -935,7 +935,12 @@ static noinline int balance_level(struct
}
ret = btrfs_tree_mod_log_insert_root(root->node, child, true);
rcu_assign_pointer(root->node, child);
add_root_to_dirty_list(root);
-@@ -1017,7 +1022,10 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
+@@ -1017,7 +1022,10 @@ static noinline int balance_level(struct
btrfs_node_key(right, &right_key, 0);
ret = btrfs_tree_mod_log_insert_key(parent, pslot + 1,
BTRFS_MOD_LOG_KEY_REPLACE, GFP_NOFS);
btrfs_set_node_key(parent, &right_key, pslot + 1);
btrfs_mark_buffer_dirty(parent);
}
-@@ -1064,6 +1072,10 @@ static noinline int balance_level(struct btrfs_trans_handle *trans,
+@@ -1063,7 +1071,10 @@ static noinline int balance_level(struct
+ btrfs_node_key(mid, &mid_key, 0);
ret = btrfs_tree_mod_log_insert_key(parent, pslot,
BTRFS_MOD_LOG_KEY_REPLACE, GFP_NOFS);
- BUG_ON(ret < 0);
+- BUG_ON(ret < 0);
+ if (ret < 0) {
+ btrfs_abort_transaction(trans, ret);
+ goto enospc;
btrfs_set_node_key(parent, &mid_key, pslot);
btrfs_mark_buffer_dirty(parent);
}
---
-2.39.2
-