btrfs: delayed-inode: Kill the BUG_ON() in btrfs_delete_delayed_dir_index()
authorQu Wenruo <wqu@suse.com>
Tue, 16 Jul 2019 09:00:32 +0000 (17:00 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 9 Sep 2019 12:59:01 +0000 (14:59 +0200)
commit933c22a7512c5c09b1fdc46b557384efe8d03233
treecf109c43a22ced9f7254dc77cbe8b169cf09a6c7
parent112974d4067ba29ae59f94e0bc79f19bf9db1a53
btrfs: delayed-inode: Kill the BUG_ON() in btrfs_delete_delayed_dir_index()

There is one report of fuzzed image which leads to BUG_ON() in
btrfs_delete_delayed_dir_index().

Although that fuzzed image can already be addressed by enhanced
extent-tree error handler, it's still better to hunt down more BUG_ON().

This patch will hunt down two BUG_ON()s in
btrfs_delete_delayed_dir_index():
- One for error from btrfs_delayed_item_reserve_metadata()
  Instead of BUG_ON(), we output an error message and free the item.
  And return the error.
  All callers of this function handles the error by aborting current
  trasaction.

- One for possible EEXIST from __btrfs_add_delayed_deletion_item()
  That function can return -EEXIST.
  We already have a good enough error message for that, only need to
  clean up the reserved metadata space and allocated item.

To help above cleanup, also modifiy __btrfs_remove_delayed_item() called
in btrfs_release_delayed_item(), to skip unassociated item.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=203253
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/delayed-inode.c