int swsusp_check(void) { int error; resume_bdev = open_by_devnum(swsusp_resume_device, FMODE_READ); if (!IS_ERR(resume_bdev)) { set_blocksize(resume_bdev, PAGE_SIZE); memset(&swsusp_header, 0, sizeof(swsusp_header)); if ((error = bio_read_page(0, &swsusp_header))) return error; if (!memcmp(SWSUSP_SIG, swsusp_header.sig, 10)) { memcpy(swsusp_header.sig, swsusp_header.orig_sig, 10); /* Reset swap signature now */ error = bio_write_page(0, &swsusp_header); } else { return -EINVAL; } if (error) blkdev_put(resume_bdev); else pr_debug("swsusp: Signature found, resuming\n"); } else { error = PTR_ERR(resume_bdev); } if (error) pr_debug("swsusp: Error %d check for resume file\n", error); return error; }
static int swap_read_page(struct swap_map_handle *handle, void *buf) { unsigned long offset; int error; if (!handle->cur) return -EINVAL; offset = handle->cur->entries[handle->k]; if (!offset) return -EFAULT; error = bio_read_page(offset, buf); if (error) return error; if (++handle->k >= MAP_PAGE_ENTRIES) { handle->k = 0; offset = handle->cur->next_swap; if (!offset) release_swap_reader(handle); else error = bio_read_page(offset, handle->cur); } return error; }
static int __init check_header(void) { const char * reason = NULL; int error; if ((error = bio_read_page(swp_offset(swsusp_header.swsusp_info), &swsusp_info))) return error; /* Is this same machine? */ if ((reason = sanity_check())) { printk(KERN_ERR "swsusp: Resume mismatch: %s\n",reason); return -EPERM; } nr_copy_pages = swsusp_info.image_pages; pagedir_order = get_bitmask_order(SUSPEND_PD_PAGES(nr_copy_pages)); return error; }
static int get_swap_reader(struct swap_map_handle *handle, swp_entry_t start) { int error; if (!swp_offset(start)) return -EINVAL; handle->cur = (struct swap_map_page *)get_zeroed_page(GFP_ATOMIC); if (!handle->cur) return -ENOMEM; error = bio_read_page(swp_offset(start), handle->cur); if (error) { release_swap_reader(handle); return error; } handle->k = 0; return 0; }
static int __init check_sig(void) { int error; memset(&swsusp_header, 0, sizeof(swsusp_header)); if ((error = bio_read_page(0, &swsusp_header))) return error; if (!memcmp(SWSUSP_SIG, swsusp_header.sig, 10)) { memcpy(swsusp_header.sig, swsusp_header.orig_sig, 10); /* * Reset swap signature now. */ error = bio_write_page(0, &swsusp_header); } else { pr_debug(KERN_ERR "swsusp: Suspend partition has wrong signature?\n"); return -EINVAL; } if (!error) pr_debug("swsusp: Signature found, resuming\n"); return error; }
static int __init read_pagedir(void) { unsigned long addr; int i, n = swsusp_info.pagedir_pages; int error = 0; addr = __get_free_pages(GFP_ATOMIC, pagedir_order); if (!addr) return -ENOMEM; pagedir_nosave = (struct pbe *)addr; pr_debug("swsusp: Reading pagedir (%d Pages)\n",n); for (i = 0; i < n && !error; i++, addr += PAGE_SIZE) { unsigned long offset = swp_offset(swsusp_info.pagedir[i]); if (offset) error = bio_read_page(offset, (void *)addr); else error = -EFAULT; } if (error) free_pages((unsigned long)pagedir_nosave, pagedir_order); return error; }
static int __init data_read(void) { struct pbe * p; int error; int i; int mod = nr_copy_pages / 100; if (!mod) mod = 1; if ((error = swsusp_pagedir_relocate())) return error; printk( "Reading image data (%d pages): ", nr_copy_pages ); for(i = 0, p = pagedir_nosave; i < nr_copy_pages && !error; i++, p++) { if (!(i%mod)) printk( "\b\b\b\b%3d%%", i / mod ); error = bio_read_page(swp_offset(p->swap_address), (void *)p->address); } printk(" %d done.\n",i); return error; }