summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sys-kernel/suspend2-sources')
-rw-r--r--sys-kernel/suspend2-sources/ChangeLog13
-rw-r--r--sys-kernel/suspend2-sources/Manifest9
-rw-r--r--sys-kernel/suspend2-sources/files/digest-suspend2-sources-2.6.15-r24
-rw-r--r--sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-amd64-temporary-mapping.patch136
-rw-r--r--sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-clean-prepare-image-result-testing.patch53
-rw-r--r--sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-debug-writing-header.patch75
-rw-r--r--sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-filewriter-fix.patch65
-rw-r--r--sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-write-header-chunk-finish.patch87
-rw-r--r--sys-kernel/suspend2-sources/suspend2-sources-2.6.15-r2.ebuild68
9 files changed, 508 insertions, 2 deletions
diff --git a/sys-kernel/suspend2-sources/ChangeLog b/sys-kernel/suspend2-sources/ChangeLog
index dd10d62fb412..15af2203cf6e 100644
--- a/sys-kernel/suspend2-sources/ChangeLog
+++ b/sys-kernel/suspend2-sources/ChangeLog
@@ -1,6 +1,17 @@
# ChangeLog for sys-kernel/suspend2-sources
# Copyright 1999-2006 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sys-kernel/suspend2-sources/ChangeLog,v 1.33 2006/01/11 23:37:01 brix Exp $
+# $Header: /var/cvsroot/gentoo-x86/sys-kernel/suspend2-sources/ChangeLog,v 1.34 2006/01/15 12:49:19 brix Exp $
+
+*suspend2-sources-2.6.15-r2 (15 Jan 2006)
+
+ 15 Jan 2006; Henrik Brix Andersen <brix@gentoo.org>
+ +files/suspend2-2.2-rc16-amd64-temporary-mapping.patch,
+ +files/suspend2-2.2-rc16-clean-prepare-image-result-testing.patch,
+ +files/suspend2-2.2-rc16-debug-writing-header.patch,
+ +files/suspend2-2.2-rc16-filewriter-fix.patch,
+ +files/suspend2-2.2-rc16-write-header-chunk-finish.patch,
+ +suspend2-sources-2.6.15-r2.ebuild:
+ Revision bump to include more bug fixes from upstream.
*suspend2-sources-2.6.15-r1 (11 Jan 2006)
diff --git a/sys-kernel/suspend2-sources/Manifest b/sys-kernel/suspend2-sources/Manifest
index 274d65303252..1755e252f621 100644
--- a/sys-kernel/suspend2-sources/Manifest
+++ b/sys-kernel/suspend2-sources/Manifest
@@ -1,4 +1,4 @@
-MD5 fdc6932a50c212e0d401b3d6abffc6f6 ChangeLog 8274
+MD5 eb82377918ba047447b66385e5d0a79b ChangeLog 8758
MD5 8c885e50de95004ba759a137c3f93495 files/101-software-suspend-2.2-rc3-for-2.6.13-gcc4.patch 877
MD5 a67db8b8f894652b4d1456406d307a37 files/digest-suspend2-sources-2.6.13 310
MD5 5ff92c313009119044ed51956fb509f9 files/digest-suspend2-sources-2.6.13-r1 310
@@ -16,6 +16,7 @@ MD5 da3f42bad1e36436b75ebe041d853c0a files/digest-suspend2-sources-2.6.14-r8 303
MD5 d7831b5753d35ae55b212e95a7bc955f files/digest-suspend2-sources-2.6.14-r9 303
MD5 be9478be473d2185379b70443b714c65 files/digest-suspend2-sources-2.6.15 302
MD5 514a1a6b724c2da7d174db76741c1a31 files/digest-suspend2-sources-2.6.15-r1 303
+MD5 57cb3e2f103c1f69e64ea6a48b2526cb files/digest-suspend2-sources-2.6.15-r2 305
MD5 d1eff82a3bab3c5b67dec45a552888e4 files/linux-2.6.13-poweroff.patch 500
MD5 4c9a2a6532217c3e54a52f6633e33c9f files/suspend2-2.2-rc13-filewriter.patch 5283
MD5 3a1912556d15f96edb9a356555dadf67 files/suspend2-2.2-rc14-do-correct-init-routine.patch 744
@@ -31,11 +32,16 @@ MD5 d33577823e512a90a2b24754f74fdc07 files/suspend2-2.2-rc15-no-pageflags.patch
MD5 6cd7d0c37cc50881f3d3b0feffedb4f1 files/suspend2-2.2-rc15-pageflags.h.patch 3990
MD5 e85851586d845a8b1d841ae93444d28b files/suspend2-2.2-rc15-processor.h.patch 583
MD5 417ee135d00c8e35c1f576c37f55e2d8 files/suspend2-2.2-rc16-amd64-is-ram.patch 1574
+MD5 eb08f1e0877c1949bb649bd278f8ad5b files/suspend2-2.2-rc16-amd64-temporary-mapping.patch 4459
+MD5 6e588370dc66e90b705b5e87ed22dc14 files/suspend2-2.2-rc16-clean-prepare-image-result-testing.patch 2093
MD5 9e649815f55422127e1e239627ee2971 files/suspend2-2.2-rc16-debug-rodata-define.patch 1155
+MD5 4700d50d9d279ad1d8d61aba313dcfaf files/suspend2-2.2-rc16-debug-writing-header.patch 2290
+MD5 b353a7f443c97a1681251f6657686a0d files/suspend2-2.2-rc16-filewriter-fix.patch 2344
MD5 ff097383fa8607f8da27f2d62fe3e313 files/suspend2-2.2-rc16-remove-block-dump.patch 1037
MD5 003a076c7965317f25792c5ee8c59b76 files/suspend2-2.2-rc16-swapwriter-selects-swap.patch 656
MD5 7b1dd9333115cf6aa3ca5241f5f07392 files/suspend2-2.2-rc16-workqueue-post-suspend2.patch 462
MD5 f3c382e7ff5bc9c62f303b6482a5b434 files/suspend2-2.2-rc16-workqueue-pre-suspend2.patch 480
+MD5 5c00a3bc7a4e8410fae25bef22884041 files/suspend2-2.2-rc16-write-header-chunk-finish.patch 3937
MD5 e40cb3df546efa5003fe3778c5a50854 metadata.xml 275
MD5 df999badafc06dd65c6f777b684ad9d6 suspend2-sources-2.6.13-r1.ebuild 2006
MD5 5d404bb0571ae11e7702c33c9577af76 suspend2-sources-2.6.13-r2.ebuild 1967
@@ -52,4 +58,5 @@ MD5 d472627bfcb34566f5b3ef71e410737a suspend2-sources-2.6.14-r8.ebuild 2019
MD5 e88e904ea7b2db03adb7e231ec6d95b4 suspend2-sources-2.6.14-r9.ebuild 2069
MD5 a24f87b3199f5a851070c6ce817dc3ca suspend2-sources-2.6.14.ebuild 1758
MD5 498a52cfb7b6046820f62cfbe3bfd7d3 suspend2-sources-2.6.15-r1.ebuild 2100
+MD5 56fe34a42729d3984a17cf252bc17900 suspend2-sources-2.6.15-r2.ebuild 2164
MD5 f6140ecc2feb0c046a6d5cb812bce375 suspend2-sources-2.6.15.ebuild 1759
diff --git a/sys-kernel/suspend2-sources/files/digest-suspend2-sources-2.6.15-r2 b/sys-kernel/suspend2-sources/files/digest-suspend2-sources-2.6.15-r2
new file mode 100644
index 000000000000..41f510f078b0
--- /dev/null
+++ b/sys-kernel/suspend2-sources/files/digest-suspend2-sources-2.6.15-r2
@@ -0,0 +1,4 @@
+MD5 2673e8dcce81159f82aa457fd4c5591c genpatches-2.6.15-2.base.tar.bz2 15169
+MD5 484d94377e15e4ab3ddf84b897d8a09d genpatches-2.6.15-2.extras.tar.bz2 175417
+MD5 cdf95e00f5111e31f78e1d97304d9522 linux-2.6.15.tar.bz2 39832836
+MD5 aa6bbcc7930ed7a11ff5504a90ad7aef suspend2-2.2-rc16-for-2.6.15.1.tar.bz2 112722
diff --git a/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-amd64-temporary-mapping.patch b/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-amd64-temporary-mapping.patch
new file mode 100644
index 000000000000..0fc03ddcc91a
--- /dev/null
+++ b/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-amd64-temporary-mapping.patch
@@ -0,0 +1,136 @@
+ arch/x86_64/kernel/suspend.c | 6 ---
+ include/asm-x86_64/suspend2.h | 68 ++++++++++++++++++++++++++++++++++++++++--
+ kernel/power/atomic_copy.c | 3 +
+ 3 files changed, 69 insertions(+), 8 deletions(-)
+diff -ruNp 9020-amd64-temporary-mapping.patch-old/arch/x86_64/kernel/suspend.c 9020-amd64-temporary-mapping.patch-new/arch/x86_64/kernel/suspend.c
+--- 9020-amd64-temporary-mapping.patch-old/arch/x86_64/kernel/suspend.c 2006-01-11 16:53:54.000000000 +1000
++++ 9020-amd64-temporary-mapping.patch-new/arch/x86_64/kernel/suspend.c 2006-01-11 16:50:14.000000000 +1000
+@@ -144,7 +144,7 @@ void fix_processor_context(void)
+
+ }
+
+-#if defined(CONFIG_SOFTWARE_SUSPEND) || defined(CONFIG_SUSPEND2)
++#if defined(CONFIG_SOFTWARE_SUSPEND)
+ /* Defined in arch/x86_64/kernel/suspend_asm.S */
+ extern int restore_image(void);
+
+@@ -224,8 +224,4 @@ int swsusp_arch_resume(void)
+ return 0;
+ }
+
+-int suspend2_mapping_prepare(void)
+-{
+- return set_up_temporary_mappings();
+-}
+ #endif /* CONFIG_SOFTWARE_SUSPEND */
+diff -ruNp 9020-amd64-temporary-mapping.patch-old/include/asm-x86_64/suspend2.h 9020-amd64-temporary-mapping.patch-new/include/asm-x86_64/suspend2.h
+--- 9020-amd64-temporary-mapping.patch-old/include/asm-x86_64/suspend2.h 2006-01-11 16:53:54.000000000 +1000
++++ 9020-amd64-temporary-mapping.patch-new/include/asm-x86_64/suspend2.h 2006-01-11 16:53:29.000000000 +1000
+@@ -14,7 +14,7 @@
+ #include <asm/proto.h>
+ #include <asm/page.h>
+
+-extern pgd_t *temp_level4_pgt;
++static pgd_t *temp_level4_pgt;
+ extern int suspend2_mapping_prepare(void);
+
+ /* image of the saved processor states */
+@@ -303,13 +303,77 @@ static inline void suspend2_arch_post_co
+ {
+ }
+
++/* Based on the version from swsusp */
++static int res_phys_pud_init(pud_t *pud, unsigned long address, unsigned long end)
++{
++ long i, j;
++
++ i = pud_index(address);
++ pud = pud + i;
++ for (; i < PTRS_PER_PUD; pud++, i++) {
++ unsigned long paddr;
++ pmd_t *pmd;
++
++ paddr = address + i*PUD_SIZE;
++ if (paddr >= end)
++ break;
++
++ pmd = (pmd_t *)suspend2_get_nonconflicting_pages(0);
++ if (!pmd)
++ return -ENOMEM;
++ set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE));
++ for (j = 0; j < PTRS_PER_PMD; pmd++, j++, paddr += PMD_SIZE) {
++ unsigned long pe;
++
++ if (paddr >= end)
++ break;
++ pe = _PAGE_NX | _PAGE_PSE | _KERNPG_TABLE | paddr;
++ pe &= __supported_pte_mask;
++ set_pmd(pmd, __pmd(pe));
++ }
++ }
++ return 0;
++}
++
++static int set_up_temporary_mappings_suspend2(void)
++{
++ unsigned long start, end, next;
++ int error;
++
++ temp_level4_pgt = (pgd_t *)suspend2_get_nonconflicting_pages(0);
++ if (!temp_level4_pgt)
++ return -ENOMEM;
++
++ /* It is safe to reuse the original kernel mapping */
++ set_pgd(temp_level4_pgt + pgd_index(__START_KERNEL_map),
++ init_level4_pgt[pgd_index(__START_KERNEL_map)]);
++
++ /* Set up the direct mapping from scratch */
++ start = (unsigned long)pfn_to_kaddr(0);
++ end = (unsigned long)pfn_to_kaddr(end_pfn);
++
++ for (; start < end; start = next) {
++ pud_t *pud = (pud_t *)suspend2_get_nonconflicting_pages(0);
++ if (!pud)
++ return -ENOMEM;
++ next = start + PGDIR_SIZE;
++ if (next > end)
++ next = end;
++ if ((error = res_phys_pud_init(pud, __pa(start), __pa(next))))
++ return error;
++ set_pgd(temp_level4_pgt + pgd_index(start),
++ mk_kernel_pgd(__pa(pud)));
++ }
++ return 0;
++}
++
+ static inline void suspend2_arch_pre_copyback(void)
+ {
+ /* We want to run from swsusp_pg_dir, since swsusp_pg_dir is stored in
+ * constant place in memory.
+ */
+
+- suspend2_mapping_prepare();
++ set_up_temporary_mappings_suspend2();
+
+ asm volatile ("movq $0xffff810000000000, %rdx");
+ asm volatile ("movq temp_level4_pgt(%rip), %rax");
+diff -ruNp 9020-amd64-temporary-mapping.patch-old/kernel/power/atomic_copy.c 9020-amd64-temporary-mapping.patch-new/kernel/power/atomic_copy.c
+--- 9020-amd64-temporary-mapping.patch-old/kernel/power/atomic_copy.c 2006-01-11 16:53:55.000000000 +1000
++++ 9020-amd64-temporary-mapping.patch-new/kernel/power/atomic_copy.c 2006-01-11 16:30:07.000000000 +1000
+@@ -5,7 +5,6 @@
+ #include <linux/highmem.h>
+ #include <linux/kthread.h>
+ #include <asm/setup.h>
+-#include <asm/suspend2.h>
+ #include <asm/param.h>
+ #include <asm/thread_info.h>
+ #include "suspend2_common.h"
+@@ -21,6 +20,8 @@
+ #include "debug_pagealloc.h"
+ #include "storage.h"
+
++#include <asm/suspend2.h>
++
+ volatile static int state1 __nosavedata = 0;
+ volatile static int state2 __nosavedata = 0;
+ volatile static int state3 __nosavedata = 0;
diff --git a/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-clean-prepare-image-result-testing.patch b/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-clean-prepare-image-result-testing.patch
new file mode 100644
index 000000000000..87f2707cf4fe
--- /dev/null
+++ b/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-clean-prepare-image-result-testing.patch
@@ -0,0 +1,53 @@
+ prepare_image.c | 7 ++++---
+ suspend.c | 12 +++++-------
+ 2 files changed, 9 insertions(+), 10 deletions(-)
+diff -ruNp 9060-clean-prepare-image-result-testing.patch-old/kernel/power/prepare_image.c 9060-clean-prepare-image-result-testing.patch-new/kernel/power/prepare_image.c
+--- 9060-clean-prepare-image-result-testing.patch-old/kernel/power/prepare_image.c 2006-01-12 13:56:09.000000000 +1000
++++ 9060-clean-prepare-image-result-testing.patch-new/kernel/power/prepare_image.c 2006-01-12 10:14:43.000000000 +1000
+@@ -744,7 +744,7 @@
+ header_space_allocated = 0;
+
+ if (attempt_to_freeze())
+- return 0;
++ return 1;
+
+ if (!extra_pd1_pages_allowance)
+ get_extra_pd1_allowance();
+@@ -755,7 +755,7 @@
+ printk(KERN_ERR "You need some storage available to be able to suspend.\n");
+ set_result_state(SUSPEND_ABORTED);
+ set_result_state(SUSPEND_NOSTORAGE_AVAILABLE);
+- return 0;
++ return 1;
+ }
+
+ do {
+@@ -780,5 +780,5 @@
+
+ check_shift_keys(1, "Image preparation complete.");
+
+- return !result;
++ return result;
+ }
+diff -ruNp 9060-clean-prepare-image-result-testing.patch-old/kernel/power/suspend.c 9060-clean-prepare-image-result-testing.patch-new/kernel/power/suspend.c
+--- 9060-clean-prepare-image-result-testing.patch-old/kernel/power/suspend.c 2006-01-12 13:56:08.000000000 +1000
++++ 9060-clean-prepare-image-result-testing.patch-new/kernel/power/suspend.c 2006-01-12 10:29:52.000000000 +1000
+@@ -646,13 +646,11 @@
+ if (test_result_state(SUSPEND_KEPT_IMAGE) && check_still_keeping_image())
+ goto cleanup;
+
+- if (suspend2_init() && suspend2_prepare_image() && !test_result_state(SUSPEND_ABORTED) &&
+- !test_action_state(SUSPEND_FREEZER_TEST))
+- {
+- if (!test_result_state(SUSPEND_ABORTED)) {
+- suspend2_prepare_status(DONT_CLEAR_BAR, "Starting to save the image..");
+- save_image();
+- }
++
++ if (suspend2_init() && !suspend2_prepare_image() && !test_result_state(SUSPEND_ABORTED) &&
++ !test_action_state(SUSPEND_FREEZER_TEST)) {
++ suspend2_prepare_status(DONT_CLEAR_BAR, "Starting to save the image..");
++ save_image();
+ }
+
+ suspend2_cleanup();
diff --git a/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-debug-writing-header.patch b/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-debug-writing-header.patch
new file mode 100644
index 000000000000..2518ed881f3c
--- /dev/null
+++ b/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-debug-writing-header.patch
@@ -0,0 +1,75 @@
+ block_io.h | 1 +
+ suspend_block_io.c | 34 +++++++++++++++++++++++++++++-----
+ suspend_file.c | 14 ++++++--------
+ suspend_swap.c | 18 ++----------------
+ 4 files changed, 38 insertions(+), 29 deletions(-)
+--- 9050-misc-other.patch-old/kernel/power/suspend_block_io.c 2006-01-12 14:02:12.000000000 +1000
++++ 9050-misc-other.patch-new/kernel/power/suspend_block_io.c 2006-01-12 11:21:39.000000000 +1000
+@@ -810,8 +810,8 @@
+ return 0;
+ }
+
+-static int suspend_rw_page(int rw, struct page *page,
+- int readahead_index, int sync)
++static int __suspend_rw_page(int rw, struct page *page,
++ int readahead_index, int sync, int debug)
+ {
+ int i, current_chain;
+ struct submit_params submit_params;
+@@ -831,7 +831,10 @@
+ s2_devinfo[current_chain].blocks_per_page + 1) <<
+ s2_devinfo[current_chain].bmap_shift;
+
+- //printk("%s: %lx:%d.\n", rw ? "Write" : "Read", submit_params.dev->bd_dev, submit_params.block[0]);
++ if (debug)
++ printk("%s: %lx:%lx.\n", rw ? "Write" : "Read",
++ (long) submit_params.dev->bd_dev,
++ (long) submit_params.block[0]);
+
+ i = suspend_do_io(rw, &submit_params, sync);
+
+@@ -841,6 +844,12 @@
+ return 0;
+ }
+
++static int suspend_rw_page(int rw, struct page *page,
++ int readahead_index, int sync)
++{
++ return __suspend_rw_page(rw, page, readahead_index, sync, 0);
++}
++
+ static int suspend_bio_read_chunk(struct page *buffer_page, int sync)
+ {
+ static int last_result;
+@@ -976,12 +985,18 @@
+ char *from = rw ? source_start : dest_start;
+
+ if (bytes_left <= capacity) {
++ if (test_debug_state(SUSPEND_HEADER))
++ printk("Copy %d bytes from %p to %p.\n",
++ bytes_left, to, from);
+ memcpy(to, from, bytes_left);
+ suspend_writer_buffer_posn += bytes_left;
+ return rw ? 0 : buffer_size;
+ }
+
+ /* Next to read the next page */
++ if (test_debug_state(SUSPEND_HEADER))
++ printk("Copy %d bytes from %p to %p.\n",
++ capacity, to, from);
+ memcpy(to, from, capacity);
+ bytes_left -= capacity;
+
+@@ -989,9 +1004,10 @@
+ sys_read(suspend_read_fd,
+ suspend_writer_buffer, BLOCK_SIZE);
+ else {
+- if (suspend_rw_page(rw,
++ if (__suspend_rw_page(rw,
+ virt_to_page(suspend_writer_buffer),
+- -1, !rw))
++ -1, !rw,
++ test_debug_state(SUSPEND_HEADER)))
+ return -EIO;
+ }
+
diff --git a/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-filewriter-fix.patch b/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-filewriter-fix.patch
new file mode 100644
index 000000000000..f988f4e534a6
--- /dev/null
+++ b/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-filewriter-fix.patch
@@ -0,0 +1,65 @@
+ suspend_file.c | 18 +++++++++++++++---
+ 1 file changed, 15 insertions(+), 3 deletions(-)
+diff -ruNp 9040-filewriter-fix.patch-old/kernel/power/suspend_file.c 9040-filewriter-fix.patch-new/kernel/power/suspend_file.c
+--- 9040-filewriter-fix.patch-old/kernel/power/suspend_file.c 2006-01-12 14:06:25.000000000 +1000
++++ 9040-filewriter-fix.patch-new/kernel/power/suspend_file.c 2006-01-12 14:06:29.000000000 +1000
+@@ -453,6 +453,8 @@ static int filewriter_write_header_init(
+ {
+ char new_sig[sig_size];
+
++ extent_state_goto_start(&suspend_writer_posn);
++
+ suspend_writer_buffer = (char *) get_zeroed_page(GFP_ATOMIC);
+ suspend_writer_buffer_posn = 0;
+
+@@ -460,8 +462,6 @@ static int filewriter_write_header_init(
+ strcpy(new_sig, NoImage);
+ suspend_bio_ops.write_header_chunk(new_sig, sig_size);
+
+- extent_state_goto_start(&suspend_writer_posn);
+-
+ /* Info needed to bootstrap goes at the start of the header.
+ * First we save the basic info needed for reading, including the number
+ * of header pages. Then we save the structs containing data needed
+@@ -473,6 +473,9 @@ static int filewriter_write_header_init(
+ suspend_bio_ops.write_header_chunk((char *) &suspend_writer_posn_save,
+ 3 * sizeof(struct extent_iterate_saved_state));
+
++ suspend_bio_ops.write_header_chunk((char *) &devinfo,
++ sizeof(devinfo));
++
+ serialise_extent_chain(&block_chain);
+
+ return 0;
+@@ -491,7 +494,7 @@ static int filewriter_write_header_clean
+ suspend_bio_ops.finish_all_io();
+
+ extent_state_goto_start(&suspend_writer_posn);
+- extent_state_next(&suspend_writer_posn);
++ suspend_bio_ops.forward_one_page();
+
+ /* Adjust image header */
+ suspend_bio_ops.bdev_page_io(READ, target_bdev,
+@@ -584,6 +587,7 @@ static int file_init(void)
+ static int filewriter_read_header_init(void)
+ {
+ int result;
++ struct block_device *tmp;
+
+ *(suspend_bio_ops.need_extra_next) = 1;
+
+@@ -604,6 +608,14 @@ static int filewriter_read_header_init(v
+
+ suspend_writer_buffer_posn += 3 * sizeof(struct extent_iterate_saved_state);
+
++ tmp = devinfo.bdev;
++
++ memcpy(&devinfo,
++ suspend_writer_buffer + suspend_writer_buffer_posn,
++ sizeof(struct suspend2_bdev_info));
++ devinfo.bdev = tmp;
++ suspend_writer_buffer_posn += sizeof(struct suspend2_bdev_info);
++
+ extent_state_goto_start(&suspend_writer_posn);
+ load_extent_chain(&block_chain);
+
diff --git a/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-write-header-chunk-finish.patch b/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-write-header-chunk-finish.patch
new file mode 100644
index 000000000000..13465e26a399
--- /dev/null
+++ b/sys-kernel/suspend2-sources/files/suspend2-2.2-rc16-write-header-chunk-finish.patch
@@ -0,0 +1,87 @@
+ block_io.h | 1 +
+ suspend_block_io.c | 8 ++++++++
+ suspend_file.c | 8 ++------
+ suspend_swap.c | 18 ++----------------
+ 4 files changed, 13 insertions(+), 22 deletions(-)
+diff -ruNp 9070-write-header-chunk-finish.patch-old/kernel/power/block_io.h 9070-write-header-chunk-finish.patch-new/kernel/power/block_io.h
+--- 9070-write-header-chunk-finish.patch-old/kernel/power/block_io.h 2006-01-12 14:05:18.000000000 +1000
++++ 9070-write-header-chunk-finish.patch-new/kernel/power/block_io.h 2006-01-12 10:48:22.000000000 +1000
+@@ -64,6 +64,7 @@ struct suspend_bio_ops {
+ int (*write_cleanup) (void);
+ int (*read_header_chunk) (char *buffer, int buffer_size);
+ int (*write_header_chunk) (char *buffer, int buffer_size);
++ int (*write_header_chunk_finish) (void);
+ };
+
+ extern struct suspend_bio_ops suspend_bio_ops;
+diff -ruNp 9070-write-header-chunk-finish.patch-old/kernel/power/suspend_block_io.c 9070-write-header-chunk-finish.patch-new/kernel/power/suspend_block_io.c
+--- 9070-write-header-chunk-finish.patch-old/kernel/power/suspend_block_io.c 2006-01-12 14:05:19.000000000 +1000
++++ 9070-write-header-chunk-finish.patch-new/kernel/power/suspend_block_io.c 2006-01-12 11:21:39.000000000 +1000
+@@ -1018,6 +1018,13 @@ static int suspend_rw_header_chunk(int r
+ return rw ? 0 : buffer_size;
+ }
+
++static int write_header_chunk_finish(void)
++{
++ return __suspend_rw_page(WRITE,
++ virt_to_page(suspend_writer_buffer),
++ -1, 0, test_debug_state(SUSPEND_HEADER)) ? -EIO : 0;
++}
++
+ static int read_header_chunk(char *buffer, int buffer_size)
+ {
+ return suspend_rw_header_chunk(READ, buffer, buffer_size);
+@@ -1051,6 +1058,7 @@ struct suspend_bio_ops suspend_bio_ops =
+ .write_cleanup = suspend_write_cleanup,
+ .read_header_chunk = read_header_chunk,
+ .write_header_chunk = write_header_chunk,
++ .write_header_chunk_finish = write_header_chunk_finish,
+ };
+
+ static struct suspend_plugin_ops suspend_blockwriter_ops =
+diff -ruNp 9070-write-header-chunk-finish.patch-old/kernel/power/suspend_file.c 9070-write-header-chunk-finish.patch-new/kernel/power/suspend_file.c
+--- 9070-write-header-chunk-finish.patch-old/kernel/power/suspend_file.c 2006-01-12 14:05:19.000000000 +1000
++++ 9070-write-header-chunk-finish.patch-new/kernel/power/suspend_file.c 2006-01-12 14:05:21.000000000 +1000
+@@ -484,12 +484,8 @@ static int filewriter_write_header_init(
+ static int filewriter_write_header_cleanup(void)
+ {
+ /* Write any unsaved data */
+- if (suspend_writer_buffer_posn) {
+- if (suspend_bio_ops.rw_page(WRITE,
+- virt_to_page(suspend_writer_buffer),
+- -1, 0))
+- return -EIO;
+- }
++ if (suspend_writer_buffer_posn)
++ suspend_bio_ops.write_header_chunk_finish();
+
+ suspend_bio_ops.finish_all_io();
+
+diff -ruNp 9070-write-header-chunk-finish.patch-old/kernel/power/suspend_swap.c 9070-write-header-chunk-finish.patch-new/kernel/power/suspend_swap.c
+--- 9070-write-header-chunk-finish.patch-old/kernel/power/suspend_swap.c 2006-01-12 14:05:18.000000000 +1000
++++ 9070-write-header-chunk-finish.patch-new/kernel/power/suspend_swap.c 2006-01-12 12:27:35.000000000 +1000
+@@ -578,22 +578,8 @@ static int swapwriter_write_header_clean
+ int result;
+
+ /* Write any unsaved data */
+- if (suspend_writer_buffer_posn) {
+- struct submit_params submit_params;
+- int current_chain;
+-
+- if (suspend_bio_ops.forward_one_page())
+- return -EIO;
+-
+- current_chain = suspend_writer_posn.current_chain;
+- submit_params.readahead_index = -1;
+- submit_params.dev = swap_info[suspend_writer_posn.current_chain].bdev;
+- submit_params.block[0] = suspend_writer_posn.current_offset <<
+- devinfo[current_chain].bmap_shift;
+- submit_params.page = virt_to_page(suspend_writer_buffer);
+-
+- suspend_bio_ops.submit_io(WRITE, &submit_params, 0);
+- }
++ if (suspend_writer_buffer_posn)
++ suspend_bio_ops.write_header_chunk_finish();
+
+ extent_state_goto_start(&suspend_writer_posn);
+ suspend_bio_ops.forward_one_page();
diff --git a/sys-kernel/suspend2-sources/suspend2-sources-2.6.15-r2.ebuild b/sys-kernel/suspend2-sources/suspend2-sources-2.6.15-r2.ebuild
new file mode 100644
index 000000000000..5c7579561fd7
--- /dev/null
+++ b/sys-kernel/suspend2-sources/suspend2-sources-2.6.15-r2.ebuild
@@ -0,0 +1,68 @@
+# Copyright 1999-2006 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-kernel/suspend2-sources/suspend2-sources-2.6.15-r2.ebuild,v 1.1 2006/01/15 12:49:19 brix Exp $
+
+ETYPE="sources"
+K_WANT_GENPATCHES="base extras"
+K_GENPATCHES_VER="2"
+
+inherit eutils kernel-2
+detect_version
+detect_arch
+
+DESCRIPTION="Software Suspend 2 + Gentoo patchset sources"
+HOMEPAGE="http://dev.gentoo.org/~dsd/genpatches http://www.suspend2.net"
+
+SUSPEND2_VERSION="2.2-rc16"
+SUSPEND2_TARGET="2.6.15.1"
+SUSPEND2_SRC="suspend2-${SUSPEND2_VERSION}-for-${SUSPEND2_TARGET}"
+SUSPEND2_URI="http://www.suspend2.net/downloads/all/${SUSPEND2_SRC}.tar.bz2"
+
+UNIPATCH_LIST="${DISTDIR}/${SUSPEND2_SRC}.tar.bz2
+${FILESDIR}/suspend2-2.2-rc16-amd64-is-ram.patch
+${FILESDIR}/suspend2-2.2-rc16-debug-rodata-define.patch
+${FILESDIR}/suspend2-2.2-rc16-remove-block-dump.patch
+${FILESDIR}/suspend2-2.2-rc16-swapwriter-selects-swap.patch
+${FILESDIR}/suspend2-2.2-rc16-amd64-temporary-mapping.patch
+${FILESDIR}/suspend2-2.2-rc16-clean-prepare-image-result-testing.patch
+${FILESDIR}/suspend2-2.2-rc16-debug-writing-header.patch
+${FILESDIR}/suspend2-2.2-rc16-filewriter-fix.patch
+${FILESDIR}/suspend2-2.2-rc16-write-header-chunk-finish.patch"
+UNIPATCH_STRICTORDER="yes"
+UNIPATCH_DOCS="${WORKDIR}/patches/${SUSPEND2_SRC}/Changelog.txt
+${WORKDIR}/patches/${SUSPEND2_SRC}/ToDo"
+
+SRC_URI="${KERNEL_URI} ${GENPATCHES_URI} ${ARCH_URI} ${SUSPEND2_URI}"
+
+KEYWORDS="~x86"
+
+IUSE="ultra1"
+RDEPEND="${RDEPEND}
+ >=sys-apps/suspend2-userui-0.6.1
+ >=sys-power/hibernate-script-1.12"
+
+K_EXTRAEINFO="If there are issues with this kernel, please direct any
+queries to the suspend2-users mailing list:
+http://lists.suspend2.net/mailman/listinfo/suspend2-users/"
+
+pkg_setup() {
+ if use sparc; then
+ # hme lockup hack on ultra1
+ use ultra1 || UNIPATCH_EXCLUDE="${UNIPATCH_EXCLUDE} 1399_sparc-U1-hme-lockup.patch"
+ fi
+}
+
+pkg_postinst() {
+ postinst_sources
+
+ echo
+
+ if [ "${ARCH}" = "sparc" ]; then
+ if [ x"`cat /proc/openprom/name 2>/dev/null`" \
+ = x"'SUNW,Ultra-1'" ]; then
+ einfo "For users with an Enterprise model Ultra 1 using the HME"
+ einfo "network interface, please emerge the kernel using the"
+ einfo "following command: USE=ultra1 emerge ${PN}"
+ fi
+ fi
+}