void forget_signature_page(void) { if (toi_cur_sig_page) { toi_sig_data = NULL; toi_message(TOI_IO, TOI_VERBOSE, 0, "Freeing toi_cur_sig_page (%p).", toi_cur_sig_page); toi_free_page(38, (unsigned long)toi_cur_sig_page); toi_cur_sig_page = NULL; } if (toi_orig_sig_page) { toi_message(TOI_IO, TOI_VERBOSE, 0, "Freeing toi_orig_sig_page (%p).", toi_orig_sig_page); toi_free_page(38, (unsigned long)toi_orig_sig_page); toi_orig_sig_page = NULL; } }
void free_checksum_pages(void) { while (pages_allocated) { unsigned long next = *((unsigned long *) page_list); ClearPageNosave(virt_to_page(page_list)); toi_free_page(15, (unsigned long) page_list); page_list = next; pages_allocated--; } }
/* * toi_checksum_cleanup * * Frees memory allocated for our labours. */ static void toi_checksum_cleanup(int ending_cycle) { int cpu; if (ending_cycle) { for_each_online_cpu(cpu) { struct cpu_context *this = &per_cpu(contexts, cpu); if (this->transform) { crypto_free_hash(this->transform); this->transform = NULL; this->desc.tfm = NULL; } if (this->buf) { toi_free_page(27, (unsigned long) this->buf); this->buf = NULL; } } } }
/** * free_pbe_list - free page backup entries used by the atomic copy code. * @list: List to free. * @highmem: Whether the list is in highmem. * * Normally, this function isn't used. If, however, we need to abort before * doing the atomic copy, we use this to free the pbes previously allocated. **/ static void free_pbe_list(struct pbe **list, int highmem) { while (*list) { int i; struct pbe *free_pbe, *next_page = NULL; struct page *page; if (highmem) { page = (struct page *) *list; free_pbe = (struct pbe *) kmap(page); } else { page = virt_to_page(*list); free_pbe = *list; } for (i = 0; i < PBES_PER_PAGE; i++) { if (!free_pbe) break; if (highmem) toi__free_page(29, free_pbe->address); else toi_free_page(29, (unsigned long) free_pbe->address); free_pbe = free_pbe->next; } if (highmem) { if (free_pbe) next_page = free_pbe; kunmap(page); } else { if (free_pbe) next_page = free_pbe; } toi__free_page(29, page); *list = (struct pbe *) next_page; }; }
int remove_old_signature(void) { union p_diskpage swap_header_page = (union p_diskpage) toi_cur_sig_page; char *orig_sig, *no_image_signature_contents; char *header_start = (char *) toi_get_zeroed_page(38, TOI_ATOMIC_GFP); int result; struct block_device *header_bdev; struct old_sig_data *old_sig_data = &swap_header_page.pointer->old_sig_data; header_bdev = toi_open_bdev(NULL, old_sig_data->device, 1); result = toi_bio_ops.bdev_page_io(READ, header_bdev, old_sig_data->sector, virt_to_page(header_start)); if (result) goto out; /* * TODO: Get the original contents of the first bytes of the swap * header page. */ if (!old_sig_data->orig_sig_type) orig_sig = "SWAP-SPACE"; else orig_sig = "SWAPSPACE2"; memcpy(swap_header_page.pointer->swh.magic.magic, orig_sig, 10); memcpy(swap_header_page.ptr, header_start, sizeof(no_image_signature_contents)); result = toi_bio_ops.bdev_page_io(WRITE, resume_block_device, resume_firstblock, virt_to_page(swap_header_page.ptr)); out: toi_close_bdev(header_bdev); have_old_image = 0; toi_free_page(38, (unsigned long) header_start); return result; }