On Tue, Jul 16, 2019 at 05:00:32PM +0800, Qu Wenruo wrote:
> 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.
> 
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=203253
> Signed-off-by: Qu Wenruo <w...@suse.com>
> ---
>  fs/btrfs/delayed-inode.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
> index 43fdb2992956..c4946d58f49b 100644
> --- a/fs/btrfs/delayed-inode.c
> +++ b/fs/btrfs/delayed-inode.c
> @@ -474,6 +474,9 @@ static void __btrfs_remove_delayed_item(struct 
> btrfs_delayed_item *delayed_item)
>       struct rb_root_cached *root;
>       struct btrfs_delayed_root *delayed_root;
>  
> +     /* Not associated with any delayed_node */
> +     if (!delayed_item->delayed_node)
> +             return;
>       delayed_root = delayed_item->delayed_node->root->fs_info->delayed_root;
>  
>       BUG_ON(!delayed_root);
> @@ -1525,7 +1528,13 @@ int btrfs_delete_delayed_dir_index(struct 
> btrfs_trans_handle *trans,
>        * we have reserved enough space when we start a new transaction,
>        * so reserving metadata failure is impossible.
>        */
> -     BUG_ON(ret);
> +     if (ret < 0) {
> +             btrfs_err(trans->fs_info,
> +"metadata reserve fail at %s, should have already reserved space, ret=%d",

I'd rather avoid using the function name in non-debugging messages,
let's use eg "metadata reservation failed for delayed dir item deltion",
and printing ret here is not necessary as it will be printed in the
transaction abort message.

Reply via email to