Skip to content

Commit 6f612af

Browse files
Jiri Slabyrjwysocki
authored andcommitted
PM / Hibernate: Group swap ops
Move all the swap processing into one function. It will make swap calls from a non-swap code easier. Signed-off-by: Jiri Slaby <[email protected]> Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent 51fb352 commit 6f612af

File tree

1 file changed

+74
-43
lines changed

1 file changed

+74
-43
lines changed

kernel/power/swap.c

Lines changed: 74 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,10 @@ static int mark_swapfiles(struct swap_map_handle *handle, unsigned int flags)
208208
/**
209209
* swsusp_swap_check - check if the resume device is a swap device
210210
* and get its index (if so)
211+
*
212+
* This is called before saving image
211213
*/
212-
213-
static int swsusp_swap_check(void) /* This is called before saving image */
214+
static int swsusp_swap_check(void)
214215
{
215216
int res;
216217

@@ -269,17 +270,33 @@ static void release_swap_writer(struct swap_map_handle *handle)
269270

270271
static int get_swap_writer(struct swap_map_handle *handle)
271272
{
273+
int ret;
274+
275+
ret = swsusp_swap_check();
276+
if (ret) {
277+
if (ret != -ENOSPC)
278+
printk(KERN_ERR "PM: Cannot find swap device, try "
279+
"swapon -a.\n");
280+
return ret;
281+
}
272282
handle->cur = (struct swap_map_page *)get_zeroed_page(GFP_KERNEL);
273-
if (!handle->cur)
274-
return -ENOMEM;
283+
if (!handle->cur) {
284+
ret = -ENOMEM;
285+
goto err_close;
286+
}
275287
handle->cur_swap = alloc_swapdev_block(root_swap);
276288
if (!handle->cur_swap) {
277-
release_swap_writer(handle);
278-
return -ENOSPC;
289+
ret = -ENOSPC;
290+
goto err_rel;
279291
}
280292
handle->k = 0;
281293
handle->first_sector = handle->cur_swap;
282294
return 0;
295+
err_rel:
296+
release_swap_writer(handle);
297+
err_close:
298+
swsusp_close(FMODE_WRITE);
299+
return ret;
283300
}
284301

285302
static int swap_write_page(struct swap_map_handle *handle, void *buf,
@@ -322,6 +339,24 @@ static int flush_swap_writer(struct swap_map_handle *handle)
322339
return -EINVAL;
323340
}
324341

342+
static int swap_writer_finish(struct swap_map_handle *handle,
343+
unsigned int flags, int error)
344+
{
345+
if (!error) {
346+
flush_swap_writer(handle);
347+
printk(KERN_INFO "PM: S");
348+
error = mark_swapfiles(handle, flags);
349+
printk("|\n");
350+
}
351+
352+
if (error)
353+
free_all_swap_pages(root_swap);
354+
release_swap_writer(handle);
355+
swsusp_close(FMODE_WRITE);
356+
357+
return error;
358+
}
359+
325360
/**
326361
* save_image - save the suspend image data
327362
*/
@@ -399,48 +434,34 @@ int swsusp_write(unsigned int flags)
399434
struct swap_map_handle handle;
400435
struct snapshot_handle snapshot;
401436
struct swsusp_info *header;
437+
unsigned long pages;
402438
int error;
403439

404-
error = swsusp_swap_check();
440+
pages = snapshot_get_image_size();
441+
error = get_swap_writer(&handle);
405442
if (error) {
406-
printk(KERN_ERR "PM: Cannot find swap device, try "
407-
"swapon -a.\n");
443+
printk(KERN_ERR "PM: Cannot get swap writer\n");
408444
return error;
409445
}
446+
if (!enough_swap(pages)) {
447+
printk(KERN_ERR "PM: Not enough free swap\n");
448+
error = -ENOSPC;
449+
goto out_finish;
450+
}
410451
memset(&snapshot, 0, sizeof(struct snapshot_handle));
411452
error = snapshot_read_next(&snapshot);
412453
if (error < PAGE_SIZE) {
413454
if (error >= 0)
414455
error = -EFAULT;
415456

416-
goto out;
457+
goto out_finish;
417458
}
418459
header = (struct swsusp_info *)data_of(snapshot);
419-
if (!enough_swap(header->pages)) {
420-
printk(KERN_ERR "PM: Not enough free swap\n");
421-
error = -ENOSPC;
422-
goto out;
423-
}
424-
error = get_swap_writer(&handle);
425-
if (!error) {
426-
error = swap_write_page(&handle, header, NULL);
427-
if (!error)
428-
error = save_image(&handle, &snapshot,
429-
header->pages - 1);
430-
431-
if (!error) {
432-
flush_swap_writer(&handle);
433-
printk(KERN_INFO "PM: S");
434-
error = mark_swapfiles(&handle, flags);
435-
printk("|\n");
436-
}
437-
}
438-
if (error)
439-
free_all_swap_pages(root_swap);
440-
441-
release_swap_writer(&handle);
442-
out:
443-
swsusp_close(FMODE_WRITE);
460+
error = swap_write_page(&handle, header, NULL);
461+
if (!error)
462+
error = save_image(&handle, &snapshot, pages - 1);
463+
out_finish:
464+
error = swap_writer_finish(&handle, flags, error);
444465
return error;
445466
}
446467

@@ -456,18 +477,21 @@ static void release_swap_reader(struct swap_map_handle *handle)
456477
handle->cur = NULL;
457478
}
458479

459-
static int get_swap_reader(struct swap_map_handle *handle, sector_t start)
480+
static int get_swap_reader(struct swap_map_handle *handle,
481+
unsigned int *flags_p)
460482
{
461483
int error;
462484

463-
if (!start)
485+
*flags_p = swsusp_header->flags;
486+
487+
if (!swsusp_header->image) /* how can this happen? */
464488
return -EINVAL;
465489

466490
handle->cur = (struct swap_map_page *)get_zeroed_page(__GFP_WAIT | __GFP_HIGH);
467491
if (!handle->cur)
468492
return -ENOMEM;
469493

470-
error = hib_bio_read_page(start, handle->cur, NULL);
494+
error = hib_bio_read_page(swsusp_header->image, handle->cur, NULL);
471495
if (error) {
472496
release_swap_reader(handle);
473497
return error;
@@ -502,6 +526,13 @@ static int swap_read_page(struct swap_map_handle *handle, void *buf,
502526
return error;
503527
}
504528

529+
static int swap_reader_finish(struct swap_map_handle *handle)
530+
{
531+
release_swap_reader(handle);
532+
533+
return 0;
534+
}
535+
505536
/**
506537
* load_image - load the image using the swap map handle
507538
* @handle and the snapshot handle @snapshot
@@ -571,20 +602,20 @@ int swsusp_read(unsigned int *flags_p)
571602
struct snapshot_handle snapshot;
572603
struct swsusp_info *header;
573604

574-
*flags_p = swsusp_header->flags;
575-
576605
memset(&snapshot, 0, sizeof(struct snapshot_handle));
577606
error = snapshot_write_next(&snapshot);
578607
if (error < PAGE_SIZE)
579608
return error < 0 ? error : -EFAULT;
580609
header = (struct swsusp_info *)data_of(snapshot);
581-
error = get_swap_reader(&handle, swsusp_header->image);
610+
error = get_swap_reader(&handle, flags_p);
611+
if (error)
612+
goto end;
582613
if (!error)
583614
error = swap_read_page(&handle, header, NULL);
584615
if (!error)
585616
error = load_image(&handle, &snapshot, header->pages - 1);
586-
release_swap_reader(&handle);
587-
617+
swap_reader_finish(&handle);
618+
end:
588619
if (!error)
589620
pr_debug("PM: Image successfully loaded\n");
590621
else

0 commit comments

Comments
 (0)