summaryrefslogtreecommitdiff
path: root/kernels/linux-libre-grsec-knock/btrfs-overflow.patch
diff options
context:
space:
mode:
Diffstat (limited to 'kernels/linux-libre-grsec-knock/btrfs-overflow.patch')
-rw-r--r--kernels/linux-libre-grsec-knock/btrfs-overflow.patch26
1 files changed, 26 insertions, 0 deletions
diff --git a/kernels/linux-libre-grsec-knock/btrfs-overflow.patch b/kernels/linux-libre-grsec-knock/btrfs-overflow.patch
new file mode 100644
index 000000000..f879b184b
--- /dev/null
+++ b/kernels/linux-libre-grsec-knock/btrfs-overflow.patch
@@ -0,0 +1,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;