• A
    ext4: attempt to fix race in bigalloc code path · 5356f261
    Aditya Kali 提交于
    Currently, there exists a race between delayed allocated writes and
    the writeback when bigalloc feature is in use. The race was because we
    wanted to determine what blocks in a cluster are under delayed
    allocation and we were using buffer_delayed(bh) check for it. But, the
    writeback codepath clears this bit without any synchronization which
    resulted in a race and an ext4 warning similar to:
    
    EXT4-fs (ram1): ext4_da_update_reserve_space: ino 13, used 1 with only 0
    		reserved data blocks
    
    The race existed in two places.
    (1) between ext4_find_delalloc_range() and ext4_map_blocks() when called from
        writeback code path.
    (2) between ext4_find_delalloc_range() and ext4_da_get_block_prep() (where
        buffer_delayed(bh) is set.
    
    To fix (1), this patch introduces a new buffer_head state bit -
    BH_Da_Mapped.  This bit is set under the protection of
    EXT4_I(inode)->i_data_sem when we have actually mapped the delayed
    allocated blocks during the writeout time. We can now reliably check
    for this bit inside ext4_find_delalloc_range() to determine whether
    the reservation for the blocks have already been claimed or not.
    
    To fix (2), it was necessary to set buffer_delay(bh) under the
    protection of i_data_sem.  So, I extracted the very beginning of
    ext4_map_blocks into a new function - ext4_da_map_blocks() - and
    performed the required setting of bh_delay bit and the quota
    reservation under the protection of i_data_sem.  These two fixes makes
    the checking of buffer_delay(bh) and buffer_da_mapped(bh) consistent,
    thus removing the race.
    
    Tested: I was able to reproduce the problem by running 'dd' and
    'fsync' in parallel. Also, xfstests sometimes used to reproduce this
    race. After the fix both my test and xfstests were successful and no
    race (warning message) was observed.
    
    Google-Bug-Id: 4997027
    Signed-off-by: NAditya Kali <adityakali@google.com>
    Signed-off-by: N"Theodore Ts'o" <tytso@mit.edu>
    5356f261
ext4.h 82.3 KB