pinctrl: at91-pio4: add missing of_node_put
[linux-2.6-block.git] / kernel / kexec_file.c
index 269116fd932ca1a55a91f7522b27c8c2ae50a335..75d8e7cf040e69bfcde16fb555c09054cfe9ebad 100644 (file)
@@ -730,8 +730,8 @@ static int kexec_purgatory_setup_kbuf(struct purgatory_info *pi,
        int i, ret;
 
        sechdrs = (void *)pi->ehdr + pi->ehdr->e_shoff;
-       bss_align = 1;
-       bss_sz = 0;
+       kbuf->buf_align = bss_align = 1;
+       kbuf->bufsz = bss_sz = 0;
 
        for (i = 0; i < pi->ehdr->e_shnum; i++) {
                if (!(sechdrs[i].sh_flags & SHF_ALLOC))
@@ -763,7 +763,6 @@ static int kexec_purgatory_setup_kbuf(struct purgatory_info *pi,
        ret = kexec_add_buffer(kbuf);
        if (ret)
                goto out;
-       pi->purgatory_load_addr = kbuf->mem;
 
        return 0;
 out:
@@ -901,27 +900,32 @@ static int kexec_apply_relocations(struct kimage *image)
        return 0;
 }
 
-/* Load relocatable purgatory object and relocate it appropriately */
-int kexec_load_purgatory(struct kimage *image, unsigned long min,
-                        unsigned long max, int top_down,
-                        unsigned long *load_addr)
+/*
+ * kexec_load_purgatory - Load and relocate the purgatory object.
+ * @image:     Image to add the purgatory to.
+ * @kbuf:      Memory parameters to use.
+ *
+ * Allocates the memory needed for image->purgatory_info.sechdrs and
+ * image->purgatory_info.purgatory_buf/kbuf->buffer. Caller is responsible
+ * to free the memory after use.
+ *
+ * Return: 0 on success, negative errno on error.
+ */
+int kexec_load_purgatory(struct kimage *image, struct kexec_buf *kbuf)
 {
        struct purgatory_info *pi = &image->purgatory_info;
        int ret;
-       struct kexec_buf kbuf = { .image = image, .bufsz = 0, .buf_align = 1,
-                                 .buf_min = min, .buf_max = max,
-                                 .top_down = top_down };
 
        if (kexec_purgatory_size <= 0)
                return -EINVAL;
 
        pi->ehdr = (const Elf_Ehdr *)kexec_purgatory;
 
-       ret = kexec_purgatory_setup_kbuf(pi, &kbuf);
+       ret = kexec_purgatory_setup_kbuf(pi, kbuf);
        if (ret)
                return ret;
 
-       ret = kexec_purgatory_setup_sechdrs(pi, &kbuf);
+       ret = kexec_purgatory_setup_sechdrs(pi, kbuf);
        if (ret)
                goto out_free_kbuf;
 
@@ -929,7 +933,6 @@ int kexec_load_purgatory(struct kimage *image, unsigned long min,
        if (ret)
                goto out;
 
-       *load_addr = pi->purgatory_load_addr;
        return 0;
 out:
        vfree(pi->sechdrs);