aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fb.com>2015-03-13 15:12:08 -0400
committerChris Mason <clm@fb.com>2015-03-13 16:46:59 -0400
commit8461a3de770477a9a7b8eeaebcc4804dbc26ca38 (patch)
treeecc53b9674656520190d46a3e93f5a5cabfe67a2 /fs
parent48da5f0a4cb2b6b44579f5737e8be888c0d02526 (diff)
Btrfs: fix merge delalloc logic
My patch to properly count outstanding extents wrt MAX_EXTENT_SIZE introduced a regression when re-dirtying already dirty areas. We have logic in split to make sure we are taking the largest space into account but didn't have it for merge, so it was sometimes making us think we were turning a tiny extent into a huge extent, when in reality we already had a huge extent and needed to use the other side in our logic. This fixes the regression that was reported by a user on list. Thanks, Reported-by: Markus Trippelsdorf <markus@trippelsdorf.de> Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/inode.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 91a87f53be3c..97b601bec326 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -1592,7 +1592,12 @@ static void btrfs_merge_extent_hook(struct inode *inode,
1592 return; 1592 return;
1593 1593
1594 old_size = other->end - other->start + 1; 1594 old_size = other->end - other->start + 1;
1595 new_size = old_size + (new->end - new->start + 1); 1595 if (old_size < (new->end - new->start + 1))
1596 old_size = (new->end - new->start + 1);
1597 if (new->start > other->start)
1598 new_size = new->end - other->start + 1;
1599 else
1600 new_size = other->end - new->start + 1;
1596 1601
1597 /* we're not bigger than the max, unreserve the space and go */ 1602 /* we're not bigger than the max, unreserve the space and go */
1598 if (new_size <= BTRFS_MAX_EXTENT_SIZE) { 1603 if (new_size <= BTRFS_MAX_EXTENT_SIZE) {