• Lukas Czerner's avatar
    ext4: update reserved space after the 'correction' · 232ec872
    Lukas Czerner authored
    Currently in ext4_ext_map_blocks() in delayed allocation writeback
    we would update the reservation and after that check whether we claimed
    cluster outside of the range of the allocation and if so, we'll give the
    block back to the reservation pool.
    
    However this also means that if the number of reserved data block
    dropped to zero before the correction, we would release all the metadata
    reservation as well, however we might still need it because the we're
    not done with the delayed allocation and there might be more blocks to
    come. This will result in error messages such as:
    
    EXT4-fs warning (device sdb): ext4_da_update_reserve_space:361: ino 12,
    allocated 1 with only 0 reserved metadata blocks (releasing 1 blocks
    with reserved 1 data blocks)
    
    This will only happen on bigalloc file system and it can be easily
    reproduced using fiemap-tester from xfstests like this:
    
    ./src/fiemap-tester -m DHDHDHDHD -S -p0 /mnt/test/file
    
    Or using xfstests such as 225.
    
    Fix this by doing the correction first and updating the reservation
    after that so that we do not accidentally decrease
    i_reserved_data_blocks to zero.
    Signed-off-by: default avatarLukas Czerner <lczerner@redhat.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    232ec872
extents.c 132 KB