On Sat, May 25, 2019 at 07:32:43AM +0800, Qu Wenruo wrote: > [BUG] > There is a bug report of unexpected ENOSPC from btrfs-convert. > https://github.com/kdave/btrfs-progs/issues/123# > > After some debug, even when we have enough unallocated space, we still > hit ENOSPC at btrfs_reserve_extent(). > > [CAUSE] > Btrfs-progs relies on chunk preallocator to make enough space for > data/metadata. > > However after the introduction of delayed-ref, it's no longer reliable > to relie on btrfs_space_info::bytes_used and > btrfs_space_info::bytes_pinned to calculate used metadata space. > > For a running transaction with a lot of allocated tree blocks, > btrfs_space_info::bytes_used stays its original value, and will only be > updated when running delayed ref. > > This makes btrfs-progs chunk preallocator completely useless. And for > btrfs-convert/mkfs.btrfs --rootdir, if we're going to have enough > metadata to fill a metadata block group in one transaction, we will hit > ENOSPC no matter whether we have enough unallocated space. > > [FIX] > This patch will introduce btrfs_space_info::bytes_reserved to trace how > many space we have reserved but not yet committed to extent tree. > > To support this change, this commit also introduces the following > modification: > - More comment on btrfs_space_info::bytes_* > To make code a little easier to read > > - Export update_space_info() to preallocate empty data/metadata space > info for mkfs. > For mkfs, we only have a temporary fs image with SYSTEM chunk only. > Export update_space_info() so that we can preallocate empty > data/metadata space info before we start a transaction. > > - Proper btrfs_space_info::bytes_reserved update > The timing is the as kernel (except we don't need to update > bytes_reserved for data extents) > * Increase bytes_reserved when call alloc_reserved_tree_block() > * Decrease bytes_reserved when running delayed refs > With the help of head->must_insert_reserved to determine whether we > need to decrease. > > Issue: #123 > Signed-off-by: Qu Wenruo <w...@suse.com>
Added to devel, thanks.