0ae7840 btrfs-progs: fix wrong chunk profile for do_chunk_alloc()

1 file Authored by Qu Wenruo 4 years ago, Committed by David Sterba 4 years ago,
1 file changed. 10 lines added. 4 lines removed.
    btrfs-progs: fix wrong chunk profile for do_chunk_alloc()
    
    [BUG]
    There is a bug report that using DUP data profile, with a 400MiB source
    dir, on a 7G disk leads to mkfs failure caused by ENOSPC.
    
    [CAUSE]
    After some debugging, it turns out that do_chunk_alloc() is always
    passing SINGLE profile for new chunks.
    
    The offending code looks like: extent-tree.c:: do_chunk_alloc()
    
    	ret = btrfs_alloc_chunk(trans, fs_info, &start, &num_bytes,
    	                        space_info->flags);
    
    However since commit bce7dbba2859 ("Btrfs-progs: only build space info's
    for the main flags"), we no longer store the profile bits in space_info
    anymore.
    
    This makes space_info never get updated properly, and causing us to
    creating more and more chunks to eat up most of the disk with unused
    SINGLE chunks, and finally leads to ENOSPC.
    
    [FIX]
    Fix the bug by passing the proper flags to btrfs_alloc_chunk().
    Also, to address the original problem commit 2689259501c1 ("btrfs progs:
    fix extra metadata chunk allocation in --mixed case") tries to fix, here
    we do extra bit OR to ensure we get the proper flags.
    
    Issue: #258
    Reviewed-by: Anand Jain <anand.jain@oracle.com>
    Signed-off-by: Qu Wenruo <wqu@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    
        
file modified
+10 -4