From f1f1cd73bfa5ca4bc9321c02c680d04d1cf97c73 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 6 Jun 2012 14:37:31 +0900 Subject: [PATCH] 3.4-stable patches added patches: radix-tree-fix-contiguous-iterator.patch --- .../radix-tree-fix-contiguous-iterator.patch | 58 +++++++++++++++++++ queue-3.4/series | 1 + 2 files changed, 59 insertions(+) create mode 100644 queue-3.4/radix-tree-fix-contiguous-iterator.patch diff --git a/queue-3.4/radix-tree-fix-contiguous-iterator.patch b/queue-3.4/radix-tree-fix-contiguous-iterator.patch new file mode 100644 index 00000000000..7421be64b66 --- /dev/null +++ b/queue-3.4/radix-tree-fix-contiguous-iterator.patch @@ -0,0 +1,58 @@ +From fffaee365fded09f9ebf2db19066065fa54323c3 Mon Sep 17 00:00:00 2001 +From: Konstantin Khlebnikov +Date: Tue, 5 Jun 2012 21:36:33 +0400 +Subject: radix-tree: fix contiguous iterator +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Konstantin Khlebnikov + +commit fffaee365fded09f9ebf2db19066065fa54323c3 upstream. + +This patch fixes bug in macro radix_tree_for_each_contig(). + +If radix_tree_next_slot() sees NULL in next slot it returns NULL, but following +radix_tree_next_chunk() switches iterating into next chunk. As result iterating +becomes non-contiguous and breaks vfs "splice" and all its users. + +Signed-off-by: Konstantin Khlebnikov +Reported-and-bisected-by: Hans de Bruin +Reported-and-bisected-by: Ondrej Zary +Reported-bisected-and-tested-by: Toralf Förster +Link: https://lkml.org/lkml/2012/6/5/64 +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + include/linux/radix-tree.h | 5 ++++- + lib/radix-tree.c | 3 +++ + 2 files changed, 7 insertions(+), 1 deletion(-) + +--- a/include/linux/radix-tree.h ++++ b/include/linux/radix-tree.h +@@ -368,8 +368,11 @@ radix_tree_next_slot(void **slot, struct + iter->index++; + if (likely(*slot)) + return slot; +- if (flags & RADIX_TREE_ITER_CONTIG) ++ if (flags & RADIX_TREE_ITER_CONTIG) { ++ /* forbid switching to the next chunk */ ++ iter->next_index = 0; + break; ++ } + } + } + return NULL; +--- a/lib/radix-tree.c ++++ b/lib/radix-tree.c +@@ -673,6 +673,9 @@ void **radix_tree_next_chunk(struct radi + * during iterating; it can be zero only at the beginning. + * And we cannot overflow iter->next_index in a single step, + * because RADIX_TREE_MAP_SHIFT < BITS_PER_LONG. ++ * ++ * This condition also used by radix_tree_next_slot() to stop ++ * contiguous iterating, and forbid swithing to the next chunk. + */ + index = iter->next_index; + if (!index && iter->index) diff --git a/queue-3.4/series b/queue-3.4/series index 83cf8f1081d..58371c00020 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -64,3 +64,4 @@ ext4-add-missing-save_error_info-to-ext4_error.patch ext4-don-t-trash-state-flags-in-ext4_ioc_setflags.patch ext4-add-ext4_mb_unload_buddy-in-the-error-path.patch ext4-remove-mb_groups-before-tearing-down-the-buddy_cache.patch +radix-tree-fix-contiguous-iterator.patch -- 2.47.3