diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/power/power.h | 4 | ||||
-rw-r--r-- | kernel/power/snapshot.c | 7 | ||||
-rw-r--r-- | kernel/power/user.c | 18 |
3 files changed, 23 insertions, 6 deletions
diff --git a/kernel/power/power.h b/kernel/power/power.h index 2093c3a9a994..23c17031ed21 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h | |||
@@ -128,6 +128,7 @@ struct snapshot_handle { | |||
128 | #define data_of(handle) ((handle).buffer + (handle).buf_offset) | 128 | #define data_of(handle) ((handle).buffer + (handle).buf_offset) |
129 | 129 | ||
130 | extern unsigned int snapshot_additional_pages(struct zone *zone); | 130 | extern unsigned int snapshot_additional_pages(struct zone *zone); |
131 | extern unsigned long snapshot_get_image_size(void); | ||
131 | extern int snapshot_read_next(struct snapshot_handle *handle, size_t count); | 132 | extern int snapshot_read_next(struct snapshot_handle *handle, size_t count); |
132 | extern int snapshot_write_next(struct snapshot_handle *handle, size_t count); | 133 | extern int snapshot_write_next(struct snapshot_handle *handle, size_t count); |
133 | extern void snapshot_write_finalize(struct snapshot_handle *handle); | 134 | extern void snapshot_write_finalize(struct snapshot_handle *handle); |
@@ -158,7 +159,8 @@ struct resume_swap_area { | |||
158 | #define SNAPSHOT_PMOPS _IOW(SNAPSHOT_IOC_MAGIC, 12, unsigned int) | 159 | #define SNAPSHOT_PMOPS _IOW(SNAPSHOT_IOC_MAGIC, 12, unsigned int) |
159 | #define SNAPSHOT_SET_SWAP_AREA _IOW(SNAPSHOT_IOC_MAGIC, 13, \ | 160 | #define SNAPSHOT_SET_SWAP_AREA _IOW(SNAPSHOT_IOC_MAGIC, 13, \ |
160 | struct resume_swap_area) | 161 | struct resume_swap_area) |
161 | #define SNAPSHOT_IOC_MAXNR 13 | 162 | #define SNAPSHOT_GET_IMAGE_SIZE _IOR(SNAPSHOT_IOC_MAGIC, 14, loff_t) |
163 | #define SNAPSHOT_IOC_MAXNR 14 | ||
162 | 164 | ||
163 | #define PMOPS_PREPARE 1 | 165 | #define PMOPS_PREPARE 1 |
164 | #define PMOPS_ENTER 2 | 166 | #define PMOPS_ENTER 2 |
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index 78039b477d2b..c5ce0f34a5d4 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
@@ -1264,12 +1264,17 @@ static char *check_image_kernel(struct swsusp_info *info) | |||
1264 | } | 1264 | } |
1265 | #endif /* CONFIG_ARCH_HIBERNATION_HEADER */ | 1265 | #endif /* CONFIG_ARCH_HIBERNATION_HEADER */ |
1266 | 1266 | ||
1267 | unsigned long snapshot_get_image_size(void) | ||
1268 | { | ||
1269 | return nr_copy_pages + nr_meta_pages + 1; | ||
1270 | } | ||
1271 | |||
1267 | static int init_header(struct swsusp_info *info) | 1272 | static int init_header(struct swsusp_info *info) |
1268 | { | 1273 | { |
1269 | memset(info, 0, sizeof(struct swsusp_info)); | 1274 | memset(info, 0, sizeof(struct swsusp_info)); |
1270 | info->num_physpages = num_physpages; | 1275 | info->num_physpages = num_physpages; |
1271 | info->image_pages = nr_copy_pages; | 1276 | info->image_pages = nr_copy_pages; |
1272 | info->pages = nr_copy_pages + nr_meta_pages + 1; | 1277 | info->pages = snapshot_get_image_size(); |
1273 | info->size = info->pages; | 1278 | info->size = info->pages; |
1274 | info->size <<= PAGE_SHIFT; | 1279 | info->size <<= PAGE_SHIFT; |
1275 | return init_header_complete(info); | 1280 | return init_header_complete(info); |
diff --git a/kernel/power/user.c b/kernel/power/user.c index 5bd321bcbb75..88aac26e598a 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
@@ -133,7 +133,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
133 | { | 133 | { |
134 | int error = 0; | 134 | int error = 0; |
135 | struct snapshot_data *data; | 135 | struct snapshot_data *data; |
136 | loff_t avail; | 136 | loff_t size; |
137 | sector_t offset; | 137 | sector_t offset; |
138 | 138 | ||
139 | if (_IOC_TYPE(cmd) != SNAPSHOT_IOC_MAGIC) | 139 | if (_IOC_TYPE(cmd) != SNAPSHOT_IOC_MAGIC) |
@@ -210,10 +210,20 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp, | |||
210 | image_size = arg; | 210 | image_size = arg; |
211 | break; | 211 | break; |
212 | 212 | ||
213 | case SNAPSHOT_GET_IMAGE_SIZE: | ||
214 | if (!data->ready) { | ||
215 | error = -ENODATA; | ||
216 | break; | ||
217 | } | ||
218 | size = snapshot_get_image_size(); | ||
219 | size <<= PAGE_SHIFT; | ||
220 | error = put_user(size, (loff_t __user *)arg); | ||
221 | break; | ||
222 | |||
213 | case SNAPSHOT_AVAIL_SWAP: | 223 | case SNAPSHOT_AVAIL_SWAP: |
214 | avail = count_swap_pages(data->swap, 1); | 224 | size = count_swap_pages(data->swap, 1); |
215 | avail <<= PAGE_SHIFT; | 225 | size <<= PAGE_SHIFT; |
216 | error = put_user(avail, (loff_t __user *)arg); | 226 | error = put_user(size, (loff_t __user *)arg); |
217 | break; | 227 | break; |
218 | 228 | ||
219 | case SNAPSHOT_GET_SWAP_PAGE: | 229 | case SNAPSHOT_GET_SWAP_PAGE: |