|
@@ -229,6 +229,8 @@ out:
|
|
|
|
|
|
}
|
|
|
|
|
|
+static void kimage_free_page_list(struct list_head *list);
|
|
|
+
|
|
|
static int kimage_normal_alloc(struct kimage **rimage, unsigned long entry,
|
|
|
unsigned long nr_segments,
|
|
|
struct kexec_segment __user *segments)
|
|
@@ -252,22 +254,22 @@ static int kimage_normal_alloc(struct kimage **rimage, unsigned long entry,
|
|
|
get_order(KEXEC_CONTROL_PAGE_SIZE));
|
|
|
if (!image->control_code_page) {
|
|
|
printk(KERN_ERR "Could not allocate control_code_buffer\n");
|
|
|
- goto out;
|
|
|
+ goto out_free;
|
|
|
}
|
|
|
|
|
|
image->swap_page = kimage_alloc_control_pages(image, 0);
|
|
|
if (!image->swap_page) {
|
|
|
printk(KERN_ERR "Could not allocate swap buffer\n");
|
|
|
- goto out;
|
|
|
+ goto out_free;
|
|
|
}
|
|
|
|
|
|
- result = 0;
|
|
|
- out:
|
|
|
- if (result == 0)
|
|
|
- *rimage = image;
|
|
|
- else
|
|
|
- kfree(image);
|
|
|
+ *rimage = image;
|
|
|
+ return 0;
|
|
|
|
|
|
+out_free:
|
|
|
+ kimage_free_page_list(&image->control_pages);
|
|
|
+ kfree(image);
|
|
|
+out:
|
|
|
return result;
|
|
|
}
|
|
|
|