SOURCES (LINUX_2_6): linux-2.6-suspend2.patch - Updated to current-tuxonice...
lmasko
lmasko at pld-linux.org
Wed Feb 18 14:40:22 CET 2009
Author: lmasko Date: Wed Feb 18 13:40:22 2009 GMT
Module: SOURCES Tag: LINUX_2_6
---- Log message:
- Updated to current-tuxonice-for-2.6.28.patch-20090214-v1, which is
recomended over the previous version.
---- Files affected:
SOURCES:
linux-2.6-suspend2.patch (1.1.2.2.2.14 -> 1.1.2.2.2.15)
---- Diffs:
================================================================
Index: SOURCES/linux-2.6-suspend2.patch
diff -u SOURCES/linux-2.6-suspend2.patch:1.1.2.2.2.14 SOURCES/linux-2.6-suspend2.patch:1.1.2.2.2.15
--- SOURCES/linux-2.6-suspend2.patch:1.1.2.2.2.14 Thu Jan 15 13:52:29 2009
+++ SOURCES/linux-2.6-suspend2.patch Wed Feb 18 14:40:16 2009
@@ -1,6 +1,6 @@
diff --git a/Documentation/power/tuxonice-internals.txt b/Documentation/power/tuxonice-internals.txt
new file mode 100644
-index 0000000..68c0454
+index 0000000..cca629a
--- /dev/null
+++ b/Documentation/power/tuxonice-internals.txt
@@ -0,0 +1,474 @@
@@ -109,7 +109,7 @@
+ Second, we have constraints on the amount of storage available. In these
+ calculations, we may also consider any compression that will be done. The
+ cryptoapi module allows the user to configure an expected compression ratio.
-+
++
+ Third, the user can specify an arbitrary limit on the image size, in
+ megabytes. This limit is treated as a soft limit, so that we don't fail the
+ attempt to suspend if we cannot meet this constraint.
@@ -122,7 +122,7 @@
+ seek to free the amount of memory that we calculate is needed and try again.
+ We allow up to four iterations of this loop before aborting the cycle. If we
+ do fail, it should only be because of a bug in TuxOnIce's calculations.
-+
++
+ These steps are merged together in the prepare_image function, found in
+ prepare_image.c. The functions are merged because of the cyclical nature
+ of the problem of calculating how much memory and storage is needed. Since
@@ -480,7 +480,7 @@
+
diff --git a/Documentation/power/tuxonice.txt b/Documentation/power/tuxonice.txt
new file mode 100644
-index 0000000..d13ce85
+index 0000000..49199ff
--- /dev/null
+++ b/Documentation/power/tuxonice.txt
@@ -0,0 +1,750 @@
@@ -529,7 +529,7 @@
+2. Why would you want it?
+
+ Why wouldn't you want it?
-+
++
+ Being able to save the state of your system and quickly restore it improves
+ your productivity - you get a useful system in far less time than through
+ the normal boot process. You also get to be completely 'green', using zero
@@ -537,13 +537,13 @@
+ minimal power to some devices, so they can initiate a power on, but that
+ will be the same amount of power as would be used if you told the computer
+ to shutdown.
-+
++
+3. What do you need to use it?
+
+ a. Kernel Support.
+
+ i) The TuxOnIce patch.
-+
++
+ TuxOnIce is part of the Linux Kernel. This version is not part of Linus's
+ 2.6 tree at the moment, so you will need to download the kernel source and
+ apply the latest patch. Having done that, enable the appropriate options in
@@ -586,7 +586,7 @@
+ add the amount of memory you have. This swapspace can be arranged in any way
+ you'd like. It can be in one partition or file, or spread over a number. The
+ only requirement is that they be active when you start a hibernation cycle.
-+
++
+ There is one exception to this requirement. TuxOnIce has the ability to turn
+ on one swap file or partition at the start of hibernating and turn it back off
+ at the end. If you want to ensure you have enough memory to store a image
@@ -628,13 +628,13 @@
+ ---EXAMPLE-ONLY-DON'T-COPY-AND-PASTE---
+ # cat /sys/power/tuxonice/resume
+ file:/dev/hda2:0x1e001
-+
++
+ In this example, we would edit the append= line of our lilo.conf|menu.lst
+ so that it included:
+
+ resume=file:/dev/hda2:0x1e001
+ ---EXAMPLE-ONLY-DON'T-COPY-AND-PASTE---
-+
++
+ For those who are thinking 'Could I make the file sparse?', the answer is
+ 'No!'. At the moment, there is no way for TuxOnIce to fill in the holes in
+ a sparse file while hibernating. In the longer term (post merge!), I'd like
@@ -643,13 +643,13 @@
+ priority.
+
+ c. Bootloader configuration.
-+
-+ Using TuxOnIce also requires that you add an extra parameter to
++
++ Using TuxOnIce also requires that you add an extra parameter to
+ your lilo.conf or equivalent. Here's an example for a swap partition:
+
+ append="resume=swap:/dev/hda1"
+
-+ This would tell TuxOnIce that /dev/hda1 is a swap partition you
++ This would tell TuxOnIce that /dev/hda1 is a swap partition you
+ have. TuxOnIce will use the swap signature of this partition as a
+ pointer to your data when you hibernate. This means that (in this example)
+ /dev/hda1 doesn't need to be _the_ swap partition where all of your data
@@ -658,7 +658,7 @@
+
+ You don't need to have a swap partition for this purpose. TuxOnIce
+ can also use a swap file, but usage is a little more complex. Having made
-+ your swap file, turn it on and do
++ your swap file, turn it on and do
+
+ cat /sys/power/tuxonice/swap/headerlocations
+
@@ -700,8 +700,8 @@
+ - Switching to a text console and back if X doesn't like the video card
+ status on resume.
+ - Un/reloading drivers that don't play well with hibernation.
-+
-+ Note that you might not be able to unload some drivers if there are
++
++ Note that you might not be able to unload some drivers if there are
+ processes using them. You might have to kill off processes that hold
+ devices open. Hint: if your X server accesses an USB mouse, doing a
+ 'chvt' to a text console releases the device and you can unload the
@@ -790,7 +790,7 @@
+ You can change the settings for powering down while the image is being
+ written by pressing 'R' to toggle rebooting and 'O' to toggle between
+ suspending to ram and powering down completely).
-+
++
+ If you run into problems with resuming, adding the "noresume" option to
+ the kernel command line will let you skip the resume step and recover your
+ system. This option shouldn't normally be needed, because TuxOnIce modifies
@@ -818,7 +818,7 @@
+ writeable ones are accessible only to the root user. You may want to
+ configure sudo to allow you to invoke your hibernate script as an ordinary
+ user.
-+
++
+ - checksum/enabled
+
+ Use cryptoapi hashing routines to verify that Pageset2 pages don't change
@@ -828,7 +828,7 @@
+ being able to resume, enable this option, hibernate and cancel the cycle
+ after the atomic copy is done. If the debugging info shows a non-zero
+ number of pages resaved, please report this to Nigel.
-+
++
+ - compression/algorithm
+
+ Set the cryptoapi algorithm used for compressing the image.
@@ -842,7 +842,7 @@
+ ratio is achieved in the logs after hibernating.
+
+ - debug_info:
-+
++
+ This file returns information about your configuration that may be helpful
+ in diagnosing problems with hibernating.
+
@@ -945,7 +945,7 @@
+ you want to protect your machine with the bios password, this is probably
+ not the right choice. Mode 4 may be necessary on some machines where ACPI
+ wake up methods need to be run to properly reinitialise hardware after a
-+ hibernation cycle.
++ hibernation cycle.
+ 0: Switch the machine completely off. The only possible wakeup is the power
+ button. For the bios, resume is then the same as a cold boot, in
+ particular you would have to provide your bios boot password if your
@@ -979,7 +979,7 @@
+ TuxOnIce will attempt to swapon/swapoff automatically. Thus, if
+ I normally use /dev/hda1 for swap, and want to use /dev/hda2 for specifically
+ for my hibernation image, I would
-+
++
+ echo /dev/hda2 > /sys/power/tuxonice/swap/swapfile
+
+ /dev/hda2 would then be automatically swapon'd and swapoff'd. Note that the
@@ -1040,7 +1040,7 @@
+ on its ability to save the image are not met).
+
+ - version:
-+
++
+ The version of TuxOnIce you have compiled into the currently running kernel.
+
+7. How do you get support?
@@ -1277,10 +1277,10 @@
void machine_halt(void)
{
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
-index e89d248..7fb630d 100644
+index 84ba748..5078db0 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
-@@ -1116,6 +1116,7 @@ void kernel_map_pages(struct page *page, int numpages, int enable)
+@@ -1135,6 +1135,7 @@ void kernel_map_pages(struct page *page, int numpages, int enable)
*/
__flush_tlb_all();
}
@@ -1288,7 +1288,7 @@
#ifdef CONFIG_HIBERNATION
-@@ -1130,7 +1131,7 @@ bool kernel_page_present(struct page *page)
+@@ -1149,7 +1150,7 @@ bool kernel_page_present(struct page *page)
pte = lookup_address((unsigned long)page_address(page), &level);
return (pte_val(*pte) & _PAGE_PRESENT);
}
@@ -1758,10 +1758,10 @@
/*
* For each existing display, we have a pointer to console currently visible
diff --git a/drivers/md/md.c b/drivers/md/md.c
-index 1b1d326..84b843a 100644
+index fb15676..d6142dc 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
-@@ -5591,7 +5591,6 @@ void md_done_sync(mddev_t *mddev, int blocks, int ok)
+@@ -5595,7 +5595,6 @@ void md_done_sync(mddev_t *mddev, int blocks, int ok)
}
}
@@ -1769,7 +1769,7 @@
/* md_write_start(mddev, bi)
* If we need to update some array metadata (e.g. 'active' flag
* in superblock) before writing, schedule a superblock update
-@@ -5736,6 +5735,9 @@ void md_do_sync(mddev_t *mddev)
+@@ -5740,6 +5739,9 @@ void md_do_sync(mddev_t *mddev)
mddev->curr_resync = 2;
try_again:
@@ -1779,7 +1779,7 @@
if (kthread_should_stop()) {
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
goto skip;
-@@ -5757,6 +5759,10 @@ void md_do_sync(mddev_t *mddev)
+@@ -5761,6 +5763,10 @@ void md_do_sync(mddev_t *mddev)
* time 'round when curr_resync == 2
*/
continue;
@@ -1790,7 +1790,7 @@
/* We need to wait 'interruptible' so as not to
* contribute to the load average, and not to
* be caught by 'softlockup'
-@@ -5769,6 +5775,7 @@ void md_do_sync(mddev_t *mddev)
+@@ -5773,6 +5779,7 @@ void md_do_sync(mddev_t *mddev)
" share one or more physical units)\n",
desc, mdname(mddev), mdname(mddev2));
mddev_put(mddev2);
@@ -1798,7 +1798,7 @@
if (signal_pending(current))
flush_signals(current);
schedule();
-@@ -5852,6 +5859,10 @@ void md_do_sync(mddev_t *mddev)
+@@ -5856,6 +5863,10 @@ void md_do_sync(mddev_t *mddev)
mddev->resync_max > j
|| kthread_should_stop());
}
@@ -1809,7 +1809,7 @@
if (kthread_should_stop())
goto interrupted;
sectors = mddev->pers->sync_request(mddev, j, &skipped,
-@@ -5895,6 +5906,9 @@ void md_do_sync(mddev_t *mddev)
+@@ -5899,6 +5910,9 @@ void md_do_sync(mddev_t *mddev)
last_mark = next;
}
@@ -1820,7 +1820,7 @@
if (kthread_should_stop())
goto interrupted;
diff --git a/fs/buffer.c b/fs/buffer.c
-index 10179cf..e892125 100644
+index 5e62011..ce937fa 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -246,6 +246,93 @@ void thaw_bdev(struct block_device *bdev, struct super_block *sb)
@@ -1959,7 +1959,7 @@
.kill_sb = fuse_ctl_kill_sb,
};
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
-index b723614..ef5d259 100644
+index 2e37f14..e5f1188 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -7,6 +7,7 @@
@@ -1978,7 +1978,7 @@
MODULE_ALIAS_MISCDEV(FUSE_MINOR);
-@@ -743,6 +745,8 @@ static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov,
+@@ -744,6 +746,8 @@ static ssize_t fuse_dev_read(struct kiocb *iocb, const struct iovec *iov,
if (!fc)
return -EPERM;
@@ -1987,7 +1987,7 @@
restart:
spin_lock(&fc->lock);
err = -EAGAIN;
-@@ -869,6 +873,9 @@ static ssize_t fuse_dev_write(struct kiocb *iocb, const struct iovec *iov,
+@@ -870,6 +874,9 @@ static ssize_t fuse_dev_write(struct kiocb *iocb, const struct iovec *iov,
if (!fc)
return -EPERM;
@@ -2115,7 +2115,7 @@
return PTR_ERR(req);
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
-index 34930a9..57414f5 100644
+index d8029d8..66905e4 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -7,11 +7,13 @@
@@ -2261,10 +2261,10 @@
+ } \
+} while (0)
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
-index 2e99f34..ad8d103 100644
+index 755fe24..6159be4 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
-@@ -908,7 +908,7 @@ static int fuse_get_sb(struct file_system_type *fs_type,
+@@ -912,7 +912,7 @@ static int fuse_get_sb(struct file_system_type *fs_type,
static struct file_system_type fuse_fs_type = {
.owner = THIS_MODULE,
.name = "fuse",
@@ -2273,7 +2273,7 @@
.get_sb = fuse_get_sb,
.kill_sb = kill_anon_super,
};
-@@ -927,7 +927,7 @@ static struct file_system_type fuseblk_fs_type = {
+@@ -931,7 +931,7 @@ static struct file_system_type fuseblk_fs_type = {
.name = "fuseblk",
.get_sb = fuse_get_sb_blk,
.kill_sb = kill_block_super,
@@ -2283,7 +2283,7 @@
static inline int register_fuseblk(void)
diff --git a/fs/namei.c b/fs/namei.c
-index d34e0f9..3768232 100644
+index 3ca2574..b781965 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2205,6 +2205,8 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry)
@@ -2296,7 +2296,7 @@
mutex_lock(&dentry->d_inode->i_mutex);
diff --git a/fs/super.c b/fs/super.c
-index 400a760..c3eea82 100644
+index f7d4bd6..00d5263 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -43,6 +43,8 @@
@@ -2309,10 +2309,10 @@
/**
diff --git a/include/linux/Kbuild b/include/linux/Kbuild
-index e531783..4431e99 100644
+index 3a025d9..190873f 100644
--- a/include/linux/Kbuild
+++ b/include/linux/Kbuild
-@@ -212,6 +212,7 @@ unifdef-y += filter.h
+@@ -213,6 +213,7 @@ unifdef-y += filter.h
unifdef-y += flat.h
unifdef-y += futex.h
unifdef-y += fs.h
@@ -2374,7 +2374,7 @@
static inline void freezer_do_not_count(void) {}
static inline void freezer_count(void) {}
diff --git a/include/linux/fs.h b/include/linux/fs.h
-index 4a853ef..4704292 100644
+index 4b91924..773d48c 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -8,6 +8,7 @@
@@ -2401,7 +2401,7 @@
#define MS_ACTIVE (1<<30)
#define MS_NOUSER (1<<31)
-@@ -1186,8 +1189,11 @@ enum {
+@@ -1188,8 +1191,11 @@ enum {
SB_FREEZE_TRANS = 2,
};
@@ -2416,10 +2416,10 @@
#define get_fs_excl() atomic_inc(¤t->fs_excl)
#define put_fs_excl() atomic_dec(¤t->fs_excl)
diff --git a/include/linux/mm.h b/include/linux/mm.h
-index ffee2f7..17532e2 100644
+index 86b836d..f7a05fb 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
-@@ -1264,6 +1264,7 @@ int drop_caches_sysctl_handler(struct ctl_table *, int, struct file *,
+@@ -1263,6 +1263,7 @@ int drop_caches_sysctl_handler(struct ctl_table *, int, struct file *,
void __user *, size_t *, loff_t *);
unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask,
unsigned long lru_pages);
@@ -2441,10 +2441,30 @@
#define MAX_LINKS 32
diff --git a/include/linux/suspend.h b/include/linux/suspend.h
-index 2ce8207..f469faf 100644
+index 2ce8207..c8680be 100644
--- a/include/linux/suspend.h
+++ b/include/linux/suspend.h
-@@ -280,4 +280,70 @@ static inline void register_nosave_region_late(unsigned long b, unsigned long e)
+@@ -13,6 +13,7 @@
+
+ #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_VT) && defined(CONFIG_VT_CONSOLE)
+ extern void pm_set_vt_switch(int);
++extern int pm_get_vt_switch(void);
+ extern int pm_prepare_console(void);
+ extern void pm_restore_console(void);
+ #else
+@@ -20,6 +21,11 @@ static inline void pm_set_vt_switch(int do_switch)
+ {
+ }
+
++static inline int pm_get_vt_switch(void)
++{
++ return 0;
++}
++
+ static inline int pm_prepare_console(void)
+ {
+ return 0;
+@@ -280,4 +286,70 @@ static inline void register_nosave_region_late(unsigned long b, unsigned long e)
extern struct mutex pm_mutex;
@@ -2605,7 +2625,7 @@
/**
diff --git a/kernel/fork.c b/kernel/fork.c
-index 495da2e..f7103e0 100644
+index f2c9c60..f98f44c 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -79,6 +79,7 @@ int max_threads; /* tunable limit on nr_threads */
@@ -2637,7 +2657,7 @@
static void helper_lock(void)
{
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
-index 23bd4da..3e39c7c 100644
+index 23bd4da..f53e64d 100644
--- a/kernel/power/Kconfig
+++ b/kernel/power/Kconfig
@@ -38,6 +38,13 @@ config CAN_PM_TRACE
@@ -2664,13 +2684,13 @@
+ default y
+ ---help---
+ TuxOnIce is the 'new and improved' suspend support.
-+
++
+ See the TuxOnIce home page (tuxonice.net)
+ for FAQs, HOWTOs and other documentation.
+
+ comment "Image Storage (you need at least one allocator)"
+ depends on TOI_CORE
-+
++
+ config TOI_FILE
+ tristate "File Allocator"
+ depends on TOI_CORE
@@ -2779,7 +2799,7 @@
+ When booting, TuxOnIce can check for an image and start to resume prior
+ to any initrd/ramfs running (via a late initcall).
+
-+ If you don't have an initrd/ramfs, this is what you want to happen -
++ If you don't have an initrd/ramfs, this is what you want to happen -
+ otherwise you won't be able to safely resume. You should set this option
+ to 'No'.
+
@@ -2806,7 +2826,7 @@
+ ---help---
+ The default interface on which to communicate with other nodes in
+ the cluster.
-+
++
+ If no value is set here, cluster support will be disabled by default.
+
+ config TOI_DEFAULT_CLUSTER_KEY
@@ -2952,10 +2972,23 @@
obj-$(CONFIG_HIBERNATION) += swsusp.o disk.o snapshot.o swap.o user.o
diff --git a/kernel/power/console.c b/kernel/power/console.c
-index b8628be..0d11c15 100644
+index b8628be..5bc87cf 100644
--- a/kernel/power/console.c
+++ b/kernel/power/console.c
-@@ -68,6 +68,7 @@ int pm_prepare_console(void)
+@@ -31,6 +31,12 @@ void pm_set_vt_switch(int do_switch)
+ }
+ EXPORT_SYMBOL(pm_set_vt_switch);
+
++int pm_get_vt_switch(void)
++{
++ return disable_vt_switch;
++}
++EXPORT_SYMBOL(pm_get_vt_switch);
++
+ int pm_prepare_console(void)
+ {
+ acquire_console_sem();
+@@ -68,6 +74,7 @@ int pm_prepare_console(void)
kmsg_redirect = SUSPEND_CONSOLE;
return 0;
}
@@ -2963,7 +2996,7 @@
void pm_restore_console(void)
{
-@@ -80,4 +81,5 @@ void pm_restore_console(void)
+@@ -80,4 +87,5 @@ void pm_restore_console(void)
release_console_sem();
kmsg_redirect = orig_kmsg;
}
@@ -3189,7 +3222,7 @@
/**
* state - control system power state.
diff --git a/kernel/power/power.h b/kernel/power/power.h
-index 46b5ec7..4cfac49 100644
+index 46b5ec7..b9622b8 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -1,3 +1,10 @@
@@ -3245,16 +3278,20 @@
/* Preferred image size in bytes (default 500 MB) */
extern unsigned long image_size;
extern int in_suspend;
-@@ -223,3 +237,90 @@ static inline void suspend_thaw_processes(void)
+@@ -223,3 +237,88 @@ static inline void suspend_thaw_processes(void)
{
}
#endif
+
-+extern struct page *saveable_page(unsigned long pfn);
++extern struct page *saveable_page(struct zone *z, unsigned long p);
+#ifdef CONFIG_HIGHMEM
-+extern struct page *saveable_highmem_page(unsigned long pfn);
++extern struct page *saveable_highmem_page(struct zone *z, unsigned long p);
+#else
-+static inline void *saveable_highmem_page(unsigned long pfn) { return NULL; }
++static
++inline struct page *saveable_highmem_page(struct zone *z, unsigned long p)
++{
++ return NULL;
++}
+#endif
+
+#define PBES_PER_PAGE (PAGE_SIZE / sizeof(struct pbe))
@@ -3282,35 +3319,29 @@
+#define BM_BITS_PER_BLOCK (PAGE_SIZE << 3)
+
+struct bm_block {
-+ struct bm_block *next; /* next element of the list */
++ struct list_head hook; /* hook into a list of bitmap blocks */
+ unsigned long start_pfn; /* pfn represented by the first bit */
+ unsigned long end_pfn; /* pfn represented by the last bit plus 1 */
+ unsigned long *data; /* bitmap representing pages */
+};
+
-+struct zone_bitmap {
-+ struct zone_bitmap *next; /* next element of the list */
-+ unsigned long start_pfn; /* minimal pfn in this zone */
-+ unsigned long end_pfn; /* maximal pfn in this zone plus 1 */
-+ struct bm_block *bm_blocks; /* list of bitmap blocks */
-+ struct bm_block *cur_block; /* recently used bitmap block */
-+};
-+
-+/* strcut bm_position is used for browsing memory bitmaps */
++/* struct bm_position is used for browsing memory bitmaps */
+
+struct bm_position {
-+ struct zone_bitmap *zone_bm;
+ struct bm_block *block;
+ int bit;
+};
+
+struct memory_bitmap {
-+ struct zone_bitmap *zone_bm_list; /* list of zone bitmaps */
++ struct list_head blocks; /* list of bitmap blocks */
+ struct linked_page *p_list; /* list of pages used to store zone
+ * bitmap objects and bitmap block
+ * objects
+ */
-+ struct bm_position cur; /* most recently used bit position */
++ struct bm_position cur; /* most recently used bit position */
++ struct bm_position iter; /* most recently used bit position
++ * when iterating over a bitmap.
++ */
+};
+
+extern int memory_bm_create(struct memory_bitmap *bm, gfp_t gfp_mask,
@@ -3440,10 +3471,18 @@
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/linux-2.6-suspend2.patch?r1=1.1.2.2.2.14&r2=1.1.2.2.2.15&f=u
More information about the pld-cvs-commit
mailing list