diff -ruNp 837-core-pageflags-old/kernel/power/suspend2_core/pageflags.c 837-core-pageflags-new/kernel/power/suspend2_core/pageflags.c
--- 837-core-pageflags-old/kernel/power/suspend2_core/pageflags.c	1970-01-01 10:00:00.000000000 +1000
+++ 837-core-pageflags-new/kernel/power/suspend2_core/pageflags.c	2004-12-13 19:32:22.575923280 +1100
@@ -0,0 +1,161 @@
+/*
+ * kernel/power/pageflags.c
+ *
+ * Copyright (C) 2004 Nigel Cunningham <ncunningham@linuxmail.org>
+ * 
+ * This file is released under the GPLv2.
+ *
+ * Routines for dynamically allocating and releasing bitmaps
+ * used as pseudo-pageflags.
+ *
+ * Arrays are not contiguous. The first sizeof(void *) bytes are
+ * the pointer to the next page in the bitmap. This allows us to
+ * 1) work under low memory conditions where order 0 might be all
+ *    that's available
+ * 2) save the pages at suspend time, reload and relocate them as
+ *    necessary at resume time without breaking anything (cf
+ *    extent pages).
+ */
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/bitops.h>
+#include <linux/list.h>
+#include <linux/suspend.h>
+#include "pageflags.h"
+#include "../plugins.h"
+#include "pagedir.h"
+
+/* Maps used in copying the image back are in builtin.c */
+//unsigned long ** pageset1_map;
+//unsigned long ** pageset1_copy_map;
+unsigned long ** in_use_map;
+unsigned long ** pageset2_map;
+unsigned long ** allocd_pages_map;
+unsigned long ** checksum_map;
+#ifdef CONFIG_DEBUG_PAGEALLOC
+unsigned long ** unmap_map;
+#endif
+
+/* ------------- Dynamically Allocated Page Flags --------------- */
+
+/* clear_map
+ *
+ * Description:	Clear an array used to store local page flags.
+ * Arguments:	unsigned long *:	The pagemap to be cleared.
+ */
+
+void clear_map(unsigned long ** pagemap)
+{
+	int i = 0;
+	
+	for (i = 0; i < PAGES_PER_BITMAP; i++)
+		memset((pagemap[i]), 0, PAGE_SIZE);
+}
+
+/* allocate_local_pageflags
+ *
+ * Description:	Allocate a bitmap for local page flags.
+ * Arguments:	unsigned long ***:	Pointer to the bitmap.
+ */
+int allocate_local_pageflags(unsigned long *** pagemap)
+{
+	int i;
+
+	BUG_ON(*pagemap);
+
+	if (test_suspend_state(SUSPEND_NOW_RESUMING)) {
+		/* 
+		 * We use kfree unconditionally below. That's not a problem
+		 * because we only use this path when reloading pageset1.
+		 */
+		*pagemap = (unsigned long **) get_nonconflicting_page();
+		if (! *pagemap)
+			return 1;
+	} else 
+		*pagemap = kmalloc(sizeof(void *) * PAGES_PER_BITMAP, GFP_ATOMIC);
+
+	for (i = 0; i < PAGES_PER_BITMAP; i++) {
+		(*pagemap)[i] = (unsigned long *) get_zeroed_page(GFP_ATOMIC);
+		if (!(*pagemap)[i]) {
+			printk("Error. Unable to allocate memory for "
+					"local page flags.");
+			free_local_pageflags(pagemap);
+			return 1;
+		}
+	}
+	return 0;
+}
+
+/* freemap
+ *
+ * Description:	Free a local pageflags bitmap.
+ * Arguments:	unsigned long ***: Pointer to the bitmap being freed.
+ */
+int free_local_pageflags(unsigned long *** pagemap)
+{
+	int i = 0;
+	if (!*pagemap)
+		return 1;
+	
+	for (i = 0; i < PAGES_PER_BITMAP; i++)
+		free_pages((unsigned long) (*pagemap)[i], 0);
+	
+	kfree(*pagemap);
+	*pagemap = NULL;
+	return 0;
+}
+
+/* savepageflags
+ *
+ * Description: Save a set of pageflags.
+ * Arguments:   unsigned long ***: Pointer to the bitmap being saved.
+ */
+
+void save_local_pageflags(unsigned long **pagemap)
+{
+	int i;
+
+	if (!*pagemap)
+		return;
+
+	for (i = 0; i < PAGES_PER_BITMAP; i++)
+		active_writer->ops.writer.write_header_chunk((char *) pagemap[i], PAGE_SIZE);
+}
+
+/* loadpageflags
+ *
+ * Description: Load a set of pageflags.
+ * Arguments:   unsigned long ***: Pointer to the bitmap being loaded.
+ *              (It must be allocated before calling this routine).
+ */
+
+void load_local_pageflags(unsigned long **pagemap)
+{
+	int i;
+
+	if (!pagemap)
+		return;
+
+	for (i = 0; i < PAGES_PER_BITMAP; i++)
+		active_writer->ops.writer.read_header_chunk((char *) pagemap[i], PAGE_SIZE);
+}
+
+void relocate_local_pageflags(unsigned long ***pagemap)
+{
+	int i;
+	LIST_HEAD(rejected_pages);
+
+	if (!*pagemap)
+		return;
+
+	relocate_page_if_required((void *) pagemap);
+
+	for (i = 0; i < PAGES_PER_BITMAP; i++)
+		relocate_page_if_required((void *) &((*pagemap)[i]));
+}
+
+
+EXPORT_SYMBOL_GPL(allocate_local_pageflags);
+EXPORT_SYMBOL_GPL(free_local_pageflags);
+EXPORT_SYMBOL_GPL(pageset2_map);
