coredump: Snapshot the vmas in do_coredump
[linux-2.6-microblaze.git] / fs / binfmt_elf_fdpic.c
index 7fa6e66..08d0c87 100644 (file)
@@ -1465,7 +1465,7 @@ static bool elf_fdpic_dump_segments(struct coredump_params *cprm,
 static int elf_fdpic_core_dump(struct coredump_params *cprm)
 {
        int has_dumped = 0;
-       int vma_count, segs;
+       int segs;
        int i;
        struct elfhdr *elf = NULL;
        loff_t offset = 0, dataoff;
@@ -1480,8 +1480,6 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
        elf_addr_t e_shoff;
        struct core_thread *ct;
        struct elf_thread_status *tmp;
-       struct core_vma_metadata *vma_meta = NULL;
-       size_t vma_data_size;
 
        /* alloc memory for large data structures: too large to be on stack */
        elf = kmalloc(sizeof(*elf), GFP_KERNEL);
@@ -1491,9 +1489,6 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
        if (!psinfo)
                goto end_coredump;
 
-       if (dump_vma_snapshot(cprm, &vma_count, &vma_meta, &vma_data_size))
-               goto end_coredump;
-
        for (ct = current->signal->core_state->dumper.next;
                                        ct; ct = ct->next) {
                tmp = elf_dump_thread_status(cprm->siginfo->si_signo,
@@ -1513,7 +1508,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
        tmp->next = thread_list;
        thread_list = tmp;
 
-       segs = vma_count + elf_core_extra_phdrs();
+       segs = cprm->vma_count + elf_core_extra_phdrs();
 
        /* for notes section */
        segs++;
@@ -1558,7 +1553,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
        /* Page-align dumped data */
        dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE);
 
-       offset += vma_data_size;
+       offset += cprm->vma_data_size;
        offset += elf_core_extra_data_size();
        e_shoff = offset;
 
@@ -1578,8 +1573,8 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
                goto end_coredump;
 
        /* write program headers for segments dump */
-       for (i = 0; i < vma_count; i++) {
-               struct core_vma_metadata *meta = vma_meta + i;
+       for (i = 0; i < cprm->vma_count; i++) {
+               struct core_vma_metadata *meta = cprm->vma_meta + i;
                struct elf_phdr phdr;
                size_t sz;
 
@@ -1628,7 +1623,7 @@ static int elf_fdpic_core_dump(struct coredump_params *cprm)
 
        dump_skip_to(cprm, dataoff);
 
-       if (!elf_fdpic_dump_segments(cprm, vma_meta, vma_count))
+       if (!elf_fdpic_dump_segments(cprm, cprm->vma_meta, cprm->vma_count))
                goto end_coredump;
 
        if (!elf_core_write_extra_data(cprm))
@@ -1652,7 +1647,6 @@ end_coredump:
                thread_list = thread_list->next;
                kfree(tmp);
        }
-       kvfree(vma_meta);
        kfree(phdr4note);
        kfree(elf);
        kfree(psinfo);