We have a user reporting BUG_ON() triggered in
btrfs_set_item_key_safe().

Let's dump the leaf content before triggering BUG_ON() so that we can
have some clue on what's going wrong.
The output of tree locks should help us to debug such problem.

Signed-off-by: Qu Wenruo <w...@suse.com>
---
changelog:
v2:
- Also dump the slot/disk_key/new_key.
---
 fs/btrfs/ctree.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index f52eb952597b..61e6e2a23a8a 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -3185,11 +3185,31 @@ void btrfs_set_item_key_safe(struct btrfs_fs_info 
*fs_info,
        slot = path->slots[0];
        if (slot > 0) {
                btrfs_item_key(eb, &disk_key, slot - 1);
-               BUG_ON(comp_keys(&disk_key, new_key) >= 0);
+               if (unlikely(comp_keys(&disk_key, new_key) >= 0)) {
+                       btrfs_crit(fs_info,
+               "on-disk slot %u key (%llu, %u, %llu) new key (%llu %u %llu)",
+                                  slot, btrfs_disk_key_objectid(&disk_key),
+                                  btrfs_disk_key_type(&disk_key),
+                                  btrfs_disk_key_offset(&disk_key),
+                                  new_key->objectid, new_key->type,
+                                  new_key->offset);
+                       btrfs_print_leaf(eb);
+                       BUG_ON(1);
+               }
        }
        if (slot < btrfs_header_nritems(eb) - 1) {
                btrfs_item_key(eb, &disk_key, slot + 1);
-               BUG_ON(comp_keys(&disk_key, new_key) <= 0);
+               if (unlikely(comp_keys(&disk_key, new_key) <= 0)) {
+                       btrfs_crit(fs_info,
+               "on-disk slot %u key (%llu, %u, %llu) new key (%llu %u %llu)",
+                                  slot, btrfs_disk_key_objectid(&disk_key),
+                                  btrfs_disk_key_type(&disk_key),
+                                  btrfs_disk_key_offset(&disk_key),
+                                  new_key->objectid, new_key->type,
+                                  new_key->offset);
+                       btrfs_print_leaf(eb);
+                       BUG_ON(1);
+               }
        }
 
        btrfs_cpu_key_to_disk(&disk_key, new_key);
-- 
2.21.0

Reply via email to