Lines Matching +full:data +full:- +full:ready

1 // SPDX-License-Identifier: GPL-2.0-only
36 bool ready; member
49 struct snapshot_data *data; in snapshot_open() local
54 return -EPERM; in snapshot_open()
59 error = -EBUSY; in snapshot_open()
63 if ((filp->f_flags & O_ACCMODE) == O_RDWR) { in snapshot_open()
65 error = -ENOSYS; in snapshot_open()
69 data = &snapshot_state; in snapshot_open()
70 filp->private_data = data; in snapshot_open()
71 memset(&data->handle, 0, sizeof(struct snapshot_handle)); in snapshot_open()
72 if ((filp->f_flags & O_ACCMODE) == O_RDONLY) { in snapshot_open()
74 data->swap = swap_type_of(swsusp_resume_device, 0); in snapshot_open()
75 data->mode = O_RDONLY; in snapshot_open()
76 data->free_bitmaps = false; in snapshot_open()
85 data->swap = -1; in snapshot_open()
86 data->mode = O_WRONLY; in snapshot_open()
90 data->free_bitmaps = !error; in snapshot_open()
96 data->frozen = false; in snapshot_open()
97 data->ready = false; in snapshot_open()
98 data->platform_support = false; in snapshot_open()
99 data->dev = 0; in snapshot_open()
109 struct snapshot_data *data; in snapshot_release() local
115 data = filp->private_data; in snapshot_release()
116 data->dev = 0; in snapshot_release()
117 free_all_swap_pages(data->swap); in snapshot_release()
118 if (data->frozen) { in snapshot_release()
122 } else if (data->free_bitmaps) { in snapshot_release()
125 pm_notifier_call_chain(data->mode == O_RDONLY ? in snapshot_release()
138 struct snapshot_data *data; in snapshot_read() local
144 data = filp->private_data; in snapshot_read()
145 if (!data->ready) { in snapshot_read()
146 res = -ENODATA; in snapshot_read()
150 res = snapshot_read_next(&data->handle); in snapshot_read()
154 res = PAGE_SIZE - pg_offp; in snapshot_read()
158 data_of(data->handle), res); in snapshot_read()
172 struct snapshot_data *data; in snapshot_write() local
183 data = filp->private_data; in snapshot_write()
186 res = snapshot_write_next(&data->handle); in snapshot_write()
193 if (!data_of(data->handle)) { in snapshot_write()
194 res = -EINVAL; in snapshot_write()
198 res = simple_write_to_buffer(data_of(data->handle), res, &pg_offp, in snapshot_write()
213 static int snapshot_set_swap_area(struct snapshot_data *data, in snapshot_set_swap_area() argument
220 return -EPERM; in snapshot_set_swap_area()
226 return -EFAULT; in snapshot_set_swap_area()
233 return -EFAULT; in snapshot_set_swap_area()
239 * User space encodes device types as two-byte values, in snapshot_set_swap_area()
242 data->swap = swap_type_of(swdev, offset); in snapshot_set_swap_area()
243 if (data->swap < 0) in snapshot_set_swap_area()
244 return swdev ? -ENODEV : -EINVAL; in snapshot_set_swap_area()
245 data->dev = swdev; in snapshot_set_swap_area()
253 struct snapshot_data *data; in snapshot_ioctl() local
263 return -ENOTTY; in snapshot_ioctl()
265 return -ENOTTY; in snapshot_ioctl()
267 return -EPERM; in snapshot_ioctl()
270 return -EBUSY; in snapshot_ioctl()
273 data = filp->private_data; in snapshot_ioctl()
278 if (data->frozen) in snapshot_ioctl()
291 data->frozen = true; in snapshot_ioctl()
296 if (!data->frozen || data->ready) in snapshot_ioctl()
300 data->free_bitmaps = false; in snapshot_ioctl()
302 data->frozen = false; in snapshot_ioctl()
306 if (data->mode != O_RDONLY || !data->frozen || data->ready) { in snapshot_ioctl()
307 error = -EPERM; in snapshot_ioctl()
311 error = hibernation_snapshot(data->platform_support); in snapshot_ioctl()
314 data->ready = !freezer_test_done && !error; in snapshot_ioctl()
320 error = snapshot_write_finalize(&data->handle); in snapshot_ioctl()
323 if (data->mode != O_WRONLY || !data->frozen || in snapshot_ioctl()
324 !snapshot_image_loaded(&data->handle)) { in snapshot_ioctl()
325 error = -EPERM; in snapshot_ioctl()
328 error = hibernation_restore(data->platform_support); in snapshot_ioctl()
333 memset(&data->handle, 0, sizeof(struct snapshot_handle)); in snapshot_ioctl()
334 data->ready = false; in snapshot_ioctl()
351 if (!data->ready) { in snapshot_ioctl()
352 error = -ENODATA; in snapshot_ioctl()
361 size = count_swap_pages(data->swap, 1); in snapshot_ioctl()
367 if (data->swap < 0 || data->swap >= MAX_SWAPFILES) { in snapshot_ioctl()
368 error = -ENODEV; in snapshot_ioctl()
371 offset = alloc_swapdev_block(data->swap); in snapshot_ioctl()
376 error = -ENOSPC; in snapshot_ioctl()
381 if (data->swap < 0 || data->swap >= MAX_SWAPFILES) { in snapshot_ioctl()
382 error = -ENODEV; in snapshot_ioctl()
385 free_all_swap_pages(data->swap); in snapshot_ioctl()
389 if (!data->frozen) { in snapshot_ioctl()
390 error = -EPERM; in snapshot_ioctl()
398 data->ready = false; in snapshot_ioctl()
402 data->platform_support = !!arg; in snapshot_ioctl()
406 if (data->platform_support) in snapshot_ioctl()
411 error = snapshot_set_swap_area(data, (void __user *)arg); in snapshot_ioctl()
415 error = -ENOTTY; in snapshot_ioctl()