If we fail due to some errorous situation, it is better to quit
without doing heavy work. So changing order of execution.

Signed-off-by: Joonsoo Kim <iamjoonsoo....@lge.com>

diff --git a/mm/rmap.c b/mm/rmap.c
index a149e3a..c2f51cb 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -278,19 +278,19 @@ int anon_vma_fork(struct vm_area_struct *vma, struct 
vm_area_struct *pvma)
        if (!pvma->anon_vma)
                return 0;
 
+       /* First, allocate required objects */
+       avc = anon_vma_chain_alloc(GFP_KERNEL);
+       if (!avc)
+               goto out_error;
+       anon_vma = anon_vma_alloc();
+       if (!anon_vma)
+               goto out_error_free_avc;
+
        /*
-        * First, attach the new VMA to the parent VMA's anon_vmas,
+        * Then attach the new VMA to the parent VMA's anon_vmas,
         * so rmap can find non-COWed pages in child processes.
         */
        if (anon_vma_clone(vma, pvma))
-               return -ENOMEM;
-
-       /* Then add our own anon_vma. */
-       anon_vma = anon_vma_alloc();
-       if (!anon_vma)
-               goto out_error;
-       avc = anon_vma_chain_alloc(GFP_KERNEL);
-       if (!avc)
                goto out_error_free_anon_vma;
 
        /*
@@ -312,10 +312,11 @@ int anon_vma_fork(struct vm_area_struct *vma, struct 
vm_area_struct *pvma)
 
        return 0;
 
- out_error_free_anon_vma:
+out_error_free_anon_vma:
        put_anon_vma(anon_vma);
- out_error:
-       unlink_anon_vmas(vma);
+out_error_free_avc:
+       anon_vma_chain_free(avc);
+out_error:
        return -ENOMEM;
 }
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to