• Timofey Titovets's avatar
    Btrfs: compress_file_range() change page dirty status once · e9679de3
    Timofey Titovets authored
    We need to call extent_range_clear_dirty_for_io()
    on compression range to prevent application from changing
    page content, while pages compressing.
    
    extent_range_clear_dirty_for_io() runs on each loop iteration,
    "(end - start)" can be much (up to 1024 times) bigger
    then compression range (BTRFS_MAX_UNCOMPRESSED).
    
    The start pointer is advanced each time we manage to compress part of
    the range. The end pointer does not change so we could redirty the
    remaining parts repeatedly.
    
    Fix that behaviour by call extent_range_clear_dirty_for_io()
    only once, the first time it happens.
    
    This is the safest but probably not the best behaviour. Previous
    iterations of the patch tried to redirty only the range that we were not
    able to compress. This has been refused by David for safety reasons, the
    writeout callchain is complex and there could be some path that relies
    on redirtying the entire unwritten range.
    Signed-off-by: default avatarTimofey Titovets <nefelim4ag@gmail.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    [ enhance changelog, the history and safety concerns, add comment ]
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    e9679de3
inode.c 291 KB