@@ -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
270271static 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
285302static 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