btrfs: Avoid truncate tailing page if fallocate range doesn't exceed inode size
authorQu Wenruo <quwenruo@cn.fujitsu.com>
Wed, 14 Oct 2015 07:26:13 +0000 (15:26 +0800)
committerChris Mason <clm@fb.com>
Wed, 21 Oct 2015 02:07:29 +0000 (19:07 -0700)
commit0f6925fa2907df58496cabc33fa4677c635e2223
tree85b4f57ea06fb3f0b0cbb50412742d64719defbb
parentdc6c5fb3b514221f2e9d21ee626a9d95d3418dff
btrfs: Avoid truncate tailing page if fallocate range doesn't exceed inode size

Current code will always truncate tailing page if its alloc_start is
smaller than inode size.

For example, the file extent layout is like:
0 4K 8K 16K 32K
|<-----Extent A---------------->|
|<--Inode size: 18K---------->|

But if calling fallocate even for range [0,4K), it will cause btrfs to
re-truncate the range [16,32K), causing COW and a new extent.

0 4K 8K 16K 32K
|///////| <- Fallocate call range
|<-----Extent A-------->|<--B-->|

The cause is quite easy, just a careless btrfs_truncate_inode() in a
else branch without extra judgment.
Fix it by add judgment on whether the fallocate range is beyond isize.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/file.c