|
@@ -1239,17 +1239,39 @@ asmlinkage int swsusp_save(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void init_header(struct swsusp_info *info)
|
|
|
+#ifndef CONFIG_ARCH_HIBERNATION_HEADER
|
|
|
+static int init_header_complete(struct swsusp_info *info)
|
|
|
{
|
|
|
- memset(info, 0, sizeof(struct swsusp_info));
|
|
|
+ memcpy(&info->uts, init_utsname(), sizeof(struct new_utsname));
|
|
|
info->version_code = LINUX_VERSION_CODE;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static char *check_image_kernel(struct swsusp_info *info)
|
|
|
+{
|
|
|
+ if (info->version_code != LINUX_VERSION_CODE)
|
|
|
+ return "kernel version";
|
|
|
+ if (strcmp(info->uts.sysname,init_utsname()->sysname))
|
|
|
+ return "system type";
|
|
|
+ if (strcmp(info->uts.release,init_utsname()->release))
|
|
|
+ return "kernel release";
|
|
|
+ if (strcmp(info->uts.version,init_utsname()->version))
|
|
|
+ return "version";
|
|
|
+ if (strcmp(info->uts.machine,init_utsname()->machine))
|
|
|
+ return "machine";
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+#endif /* CONFIG_ARCH_HIBERNATION_HEADER */
|
|
|
+
|
|
|
+static int init_header(struct swsusp_info *info)
|
|
|
+{
|
|
|
+ memset(info, 0, sizeof(struct swsusp_info));
|
|
|
info->num_physpages = num_physpages;
|
|
|
- memcpy(&info->uts, init_utsname(), sizeof(struct new_utsname));
|
|
|
- info->cpus = num_online_cpus();
|
|
|
info->image_pages = nr_copy_pages;
|
|
|
info->pages = nr_copy_pages + nr_meta_pages + 1;
|
|
|
info->size = info->pages;
|
|
|
info->size <<= PAGE_SHIFT;
|
|
|
+ return init_header_complete(info);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1303,7 +1325,11 @@ int snapshot_read_next(struct snapshot_handle *handle, size_t count)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
if (!handle->offset) {
|
|
|
- init_header((struct swsusp_info *)buffer);
|
|
|
+ int error;
|
|
|
+
|
|
|
+ error = init_header((struct swsusp_info *)buffer);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
handle->buffer = buffer;
|
|
|
memory_bm_position_reset(&orig_bm);
|
|
|
memory_bm_position_reset(©_bm);
|
|
@@ -1394,22 +1420,13 @@ duplicate_memory_bitmap(struct memory_bitmap *dst, struct memory_bitmap *src)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static inline int check_header(struct swsusp_info *info)
|
|
|
+static int check_header(struct swsusp_info *info)
|
|
|
{
|
|
|
- char *reason = NULL;
|
|
|
+ char *reason;
|
|
|
|
|
|
- if (info->version_code != LINUX_VERSION_CODE)
|
|
|
- reason = "kernel version";
|
|
|
- if (info->num_physpages != num_physpages)
|
|
|
+ reason = check_image_kernel(info);
|
|
|
+ if (!reason && info->num_physpages != num_physpages)
|
|
|
reason = "memory size";
|
|
|
- if (strcmp(info->uts.sysname,init_utsname()->sysname))
|
|
|
- reason = "system type";
|
|
|
- if (strcmp(info->uts.release,init_utsname()->release))
|
|
|
- reason = "kernel release";
|
|
|
- if (strcmp(info->uts.version,init_utsname()->version))
|
|
|
- reason = "version";
|
|
|
- if (strcmp(info->uts.machine,init_utsname()->machine))
|
|
|
- reason = "machine";
|
|
|
if (reason) {
|
|
|
printk(KERN_ERR "swsusp: Resume mismatch: %s\n", reason);
|
|
|
return -EPERM;
|