• Filipe Manana's avatar
    Btrfs: fix metadata space leak on fixup worker failure to set range as delalloc · 53687007
    Filipe Manana authored
    In the fixup worker, if we fail to mark the range as delalloc in the io
    tree, we must release the previously reserved metadata, as well as update
    the outstanding extents counter for the inode, otherwise we leak metadata
    space.
    
    In pratice we can't return an error from btrfs_set_extent_delalloc(),
    which is just a wrapper around __set_extent_bit(), as for most errors
    __set_extent_bit() does a BUG_ON() (or panics which hits a BUG_ON() as
    well) and returning an -EEXIST error doesn't happen in this case since
    the exclusive bits parameter always has a value of 0 through this code
    path. Nevertheless, just fix the error handling in the fixup worker,
    in case one day __set_extent_bit() can return an error to this code
    path.
    
    Fixes: f3038ee3 ("btrfs: Handle btrfs_set_extent_delalloc failure in fixup worker")
    CC: stable@vger.kernel.org # 4.19+
    Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    53687007
inode.c 300 KB