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;
			}
		}
	}
}
Example #4
0
/**
 * 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;
}