mm: fix anon_vma degree counter in case of anon_vma export From: Konstantin Khlebnikov anon_vma_clone() is usually called for copy of source vma in dst argument. If source vma has anon_vma it should be already in dst->anon_vma. NULL pointer in dst->anon_vma means clone is called from anon_vma_fork and anon_vma_clone() should try to reuse some old anon_vma. vma_adjust() calls it differently and breaks anon_vma degree counter logic. This patch copies anon_vma pointer to satisfy anon_vma_clone() expectations. Signed-off-by: Konstantin Khlebnikov Fixes: 7a3ef208e662 ("mm: prevent endless growth of anon_vma hierarchy") --- mm/mmap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index 7b36aa7..12616c5 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -778,10 +778,12 @@ again: remove_next = 1 + (end > next->vm_end); if (exporter && exporter->anon_vma && !importer->anon_vma) { int error; + importer->anon_vma = exporter->anon_vma; error = anon_vma_clone(importer, exporter); - if (error) + if (error) { + importer->anon_vma = NULL; return error; - importer->anon_vma = exporter->anon_vma; + } } }