]> git.baikalelectronics.ru Git - kernel.git/commit
Btrfs: fix defrag to merge tail file extent
authorLiu Bo <bo.li.liu@oracle.com>
Fri, 7 Aug 2015 08:48:41 +0000 (16:48 +0800)
committerChris Mason <clm@fb.com>
Sun, 9 Aug 2015 14:33:50 +0000 (07:33 -0700)
commitffc12e0dd727af6256ba0b1e91dcb8d0ec8486c1
tree42c267c9b447ded5d96adbfb03efd87fa7195ed0
parent443cb58c6061a1109e3ea2b557923e3ea6f7e642
Btrfs: fix defrag to merge tail file extent

The file layout is

[extent 1]...[extent n][4k extent][HOLE][extent x]

extent 1~n and 4k extent can be merged during defrag, and the whole
defrag bytes is larger than our defrag thresh(256k), 4k extent as a
tail is left unmerged since we check if its next extent can be merged
(the next one is a hole, so the check will fail), the layout thus can
be

[new extent][4k extent][HOLE][extent x]
 (1~n)

To fix it, beside looking at the next one, this also looks at the
previous one by checking @defrag_end, which is set to 0 when we
decide to stop merging contiguous extents, otherwise, we can merge
the previous one with our extent.

Also, this makes btrfs behave consistent with how xfs and ext4 do.

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/ioctl.c