On Thu, Apr 25, 2019 at 08:55:53AM +0800, Qu Wenruo wrote:
> 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.
>
> Reviewed-by: Filip Manana <fdmanana@xxxxxxxx>
> Signed-off-by: Qu Wenruo <wqu@xxxxxxxx>
> ---
> Changelog:
> v2:
> - Dump slot/old key/new key.
> v3:
> - Output message update, to avoid "on-disk" wording.
> - Use BUG() to replace BUG_ON(1) to make clang quite.
>
> 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 5116c2a1f0f9..5df76c17775a 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,
> + "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();
This is going to produce a lot of lines, with the stacktrace at the end.
We'll understand what's wrong just by seeing the stack, though the
contents of the leaf will be only in the logs and not on screen. This
hopefully will be available for analysis. I've seen this bug too and
will be able to provide the logs eventually.