Btrfs: compress_file_range() change page dirty status once
authorTimofey Titovets <nefelim4ag@gmail.com>
Mon, 23 Oct 2017 22:29:48 +0000 (01:29 +0300)
committerDavid Sterba <dsterba@suse.com>
Mon, 22 Jan 2018 15:08:15 +0000 (16:08 +0100)
commite9679de3fdcb11a13cfe3873c9923b761c8067ab
treec20a5add02adb2c9e5d6c1aac95f64c5e09e9d34
parent440c840cb49f7de91e68a4cc7bca79a75cd298ae
Btrfs: compress_file_range() change page dirty status once

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: Timofey Titovets <nefelim4ag@gmail.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ enhance changelog, the history and safety concerns, add comment ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c