summaryrefslogtreecommitdiff
path: root/libre/linux-libre-grsec/btrfs-overflow.patch
blob: f879b184b541e68ee5e62cb98b48afafc4b2fcf7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
index 6a98bdd..fed3da6 100644
--- a/fs/btrfs/extent_map.c
+++ b/fs/btrfs/extent_map.c
@@ -235,7 +235,9 @@ static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em)
			em->start = merge->start;
			em->orig_start = merge->orig_start;
			em->len += merge->len;
-			em->block_len += merge->block_len;
+			if (em->block_start != EXTENT_MAP_HOLE &&
+			    em->block_start != EXTENT_MAP_INLINE)
+				em->block_len += merge->block_len;
			em->block_start = merge->block_start;
			em->mod_len = (em->mod_len + em->mod_start) - merge->mod_start;
			em->mod_start = merge->mod_start;
@@ -252,7 +254,9 @@ static void try_merge_map(struct extent_map_tree *tree, struct extent_map *em)
		merge = rb_entry(rb, struct extent_map, rb_node);
	if (rb && mergable_maps(em, merge)) {
		em->len += merge->len;
-		em->block_len += merge->block_len;
+		if (em->block_start != EXTENT_MAP_HOLE &&
+		    em->block_start != EXTENT_MAP_INLINE)
+			em->block_len += merge->block_len;
		rb_erase(&merge->rb_node, &tree->map);
		RB_CLEAR_NODE(&merge->rb_node);
		em->mod_len = (merge->mod_start + merge->mod_len) - em->mod_start;