SOURCES: kernel-tuxonice.patch - TuxOnIce up to 3.0.1 with modular build fi...
lmasko
lmasko at pld-linux.org
Mon Apr 13 17:55:00 CEST 2009
Author: lmasko Date: Mon Apr 13 15:55:00 2009 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- TuxOnIce up to 3.0.1 with modular build fix. Builds and works with kernel
2.6.29.1.
---- Files affected:
SOURCES:
kernel-tuxonice.patch (1.3 -> 1.4)
---- Diffs:
================================================================
Index: SOURCES/kernel-tuxonice.patch
diff -u SOURCES/kernel-tuxonice.patch:1.3 SOURCES/kernel-tuxonice.patch:1.4
--- SOURCES/kernel-tuxonice.patch:1.3 Sat Apr 4 15:01:30 2009
+++ SOURCES/kernel-tuxonice.patch Mon Apr 13 17:54:54 2009
@@ -1365,369 +1365,6 @@
return (rdr->magic == RESTORE_MAGIC) ? 0 : -EINVAL;
}
+EXPORT_SYMBOL_GPL(arch_hibernation_header_restore);
-diff --git a/crypto/Kconfig b/crypto/Kconfig
-index 8dde4fc..1867a5e 100644
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -286,6 +286,14 @@ config CRYPTO_MD5
- help
- MD5 message digest algorithm (RFC1321).
-
-+config CRYPTO_LZF
-+ tristate "LZF compression algorithm"
-+ default y
-+ select CRYPTO_ALGAPI
-+ help
-+ This is the LZF algorithm. It is especially useful for TuxOnIce,
-+ because it achieves good compression quickly.
-+
- config CRYPTO_MICHAEL_MIC
- tristate "Michael MIC keyed digest algorithm"
- select CRYPTO_HASH
-diff --git a/crypto/Makefile b/crypto/Makefile
-index 46b08bf..0cab903 100644
---- a/crypto/Makefile
-+++ b/crypto/Makefile
-@@ -72,6 +72,7 @@ obj-$(CONFIG_CRYPTO_SALSA20) += salsa20_generic.o
- obj-$(CONFIG_CRYPTO_DEFLATE) += deflate.o
- obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o
- obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o
-+obj-$(CONFIG_CRYPTO_LZF) += lzf.o
- obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o
- obj-$(CONFIG_CRYPTO_LZO) += lzo.o
- obj-$(CONFIG_CRYPTO_RNG2) += rng.o
-diff --git a/crypto/lzf.c b/crypto/lzf.c
-new file mode 100644
-index 0000000..ccaf83a
---- /dev/null
-+++ b/crypto/lzf.c
-@@ -0,0 +1,326 @@
-+/*
-+ * Cryptoapi LZF compression module.
-+ *
-+ * Copyright (c) 2004-2008 Nigel Cunningham <nigel at tuxonice net>
-+ *
-+ * based on the deflate.c file:
-+ *
-+ * Copyright (c) 2003 James Morris <jmorris at intercode.com.au>
-+ *
-+ * and upon the LZF compression module donated to the TuxOnIce project with
-+ * the following copyright:
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the Free
-+ * Software Foundation; either version 2 of the License, or (at your option)
-+ * any later version.
-+ * Copyright (c) 2000-2003 Marc Alexander Lehmann <pcg at goof.com>
-+ *
-+ * Redistribution and use in source and binary forms, with or without modifica-
-+ * tion, are permitted provided that the following conditions are met:
-+ *
-+ * 1. Redistributions of source code must retain the above copyright notice,
-+ * this list of conditions and the following disclaimer.
-+ *
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ * notice, this list of conditions and the following disclaimer in the
-+ * documentation and/or other materials provided with the distribution.
-+ *
-+ * 3. The name of the author may not be used to endorse or promote products
-+ * derived from this software without specific prior written permission.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-
-+ * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-
-+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-
-+ * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
-+ * OF THE POSSIBILITY OF SUCH DAMAGE.
-+ *
-+ * Alternatively, the contents of this file may be used under the terms of
-+ * the GNU General Public License version 2 (the "GPL"), in which case the
-+ * provisions of the GPL are applicable instead of the above. If you wish to
-+ * allow the use of your version of this file only under the terms of the
-+ * GPL and not to allow others to use your version of this file under the
-+ * BSD license, indicate your decision by deleting the provisions above and
-+ * replace them with the notice and other provisions required by the GPL. If
-+ * you do not delete the provisions above, a recipient may use your version
-+ * of this file under either the BSD or the GPL.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/crypto.h>
-+#include <linux/err.h>
-+#include <linux/vmalloc.h>
-+#include <linux/string.h>
-+
-+struct lzf_ctx {
-+ void *hbuf;
-+ unsigned int bufofs;
-+};
-+
-+/*
-+ * size of hashtable is (1 << hlog) * sizeof (char *)
-+ * decompression is independent of the hash table size
-+ * the difference between 15 and 14 is very small
-+ * for small blocks (and 14 is also faster).
-+ * For a low-memory configuration, use hlog == 13;
-+ * For best compression, use 15 or 16.
-+ */
-+static const int hlog = 13;
-+
-+/*
-+ * don't play with this unless you benchmark!
-+ * decompression is not dependent on the hash function
-+ * the hashing function might seem strange, just believe me
-+ * it works ;)
-+ */
-+static inline u16 first(const u8 *p)
-+{
-+ return ((p[0]) << 8) + p[1];
-+}
-+
-+static inline u16 next(u8 v, const u8 *p)
-+{
-+ return ((v) << 8) + p[2];
-+}
-+
-+static inline u32 idx(unsigned int h)
-+{
-+ return (((h ^ (h << 5)) >> (3*8 - hlog)) + h*3) & ((1 << hlog) - 1);
-+}
-+
-+/*
-+ * IDX works because it is very similar to a multiplicative hash, e.g.
-+ * (h * 57321 >> (3*8 - hlog))
-+ * the next one is also quite good, albeit slow ;)
-+ * (int)(cos(h & 0xffffff) * 1e6)
-+ */
-+
-+static const int max_lit = (1 << 5);
-+static const int max_off = (1 << 13);
-+static const int max_ref = ((1 << 8) + (1 << 3));
-+
-+/*
-+ * compressed format
-+ *
-+ * 000LLLLL <L+1> ; literal
-+ * LLLOOOOO oooooooo ; backref L
-+ * 111OOOOO LLLLLLLL oooooooo ; backref L+7
-+ *
-+ */
-+
-+static void lzf_compress_exit(struct crypto_tfm *tfm)
-+{
-+ struct lzf_ctx *ctx = crypto_tfm_ctx(tfm);
-+
-+ if (!ctx->hbuf)
-+ return;
-+
-+ vfree(ctx->hbuf);
-+ ctx->hbuf = NULL;
-+}
-+
-+static int lzf_compress_init(struct crypto_tfm *tfm)
-+{
-+ struct lzf_ctx *ctx = crypto_tfm_ctx(tfm);
-+
-+ /* Get LZF ready to go */
-+ ctx->hbuf = vmalloc_32((1 << hlog) * sizeof(char *));
-+ if (ctx->hbuf)
-+ return 0;
-+
-+ printk(KERN_WARNING "Failed to allocate %ld bytes for lzf workspace\n",
-+ (long) ((1 << hlog) * sizeof(char *)));
-+ return -ENOMEM;
-+}
-+
-+static int lzf_compress(struct crypto_tfm *tfm, const u8 *in_data,
-+ unsigned int in_len, u8 *out_data, unsigned int *out_len)
-+{
-+ struct lzf_ctx *ctx = crypto_tfm_ctx(tfm);
-+ const u8 **htab = ctx->hbuf;
-+ const u8 **hslot;
-+ const u8 *ip = in_data;
-+ u8 *op = out_data;
-+ const u8 *in_end = ip + in_len;
-+ u8 *out_end = op + *out_len - 3;
-+ const u8 *ref;
-+
-+ unsigned int hval = first(ip);
-+ unsigned long off;
-+ int lit = 0;
-+
-+ memset(htab, 0, sizeof(htab));
-+
-+ for (;;) {
-+ if (ip < in_end - 2) {
-+ hval = next(hval, ip);
-+ hslot = htab + idx(hval);
-+ ref = *hslot;
-+ *hslot = ip;
-+
-+ off = ip - ref - 1;
-+ if (off < max_off
-+ && ip + 4 < in_end && ref > in_data
-+ && *(u16 *) ref == *(u16 *) ip && ref[2] == ip[2]
-+ ) {
-+ /* match found at *ref++ */
-+ unsigned int len = 2;
-+ unsigned int maxlen = in_end - ip - len;
-+ maxlen = maxlen > max_ref ? max_ref : maxlen;
-+
-+ do {
-+ len++;
-+ } while (len < maxlen && ref[len] == ip[len]);
-+
-+ if (op + lit + 1 + 3 >= out_end) {
-+ *out_len = PAGE_SIZE;
-+ return 0;
-+ }
-+
-+ if (lit) {
-+ *op++ = lit - 1;
-+ lit = -lit;
-+ do {
-+ *op++ = ip[lit];
-+ } while (++lit);
-+ }
-+
-+ len -= 2;
-+ ip++;
-+
-+ if (len < 7) {
-+ *op++ = (off >> 8) + (len << 5);
-+ } else {
-+ *op++ = (off >> 8) + (7 << 5);
-+ *op++ = len - 7;
-+ }
-+
-+ *op++ = off;
-+
-+ ip += len;
-+ hval = first(ip);
-+ hval = next(hval, ip);
-+ htab[idx(hval)] = ip;
-+ ip++;
-+ continue;
-+ }
-+ } else if (ip == in_end)
-+ break;
-+
-+ /* one more literal byte we must copy */
-+ lit++;
-+ ip++;
-+
-+ if (lit == max_lit) {
-+ if (op + 1 + max_lit >= out_end) {
-+ *out_len = PAGE_SIZE;
-+ return 0;
-+ }
-+
-+ *op++ = max_lit - 1;
-+ memcpy(op, ip - max_lit, max_lit);
-+ op += max_lit;
-+ lit = 0;
-+ }
-+ }
-+
-+ if (lit) {
-+ if (op + lit + 1 >= out_end) {
-+ *out_len = PAGE_SIZE;
-+ return 0;
-+ }
-+
-+ *op++ = lit - 1;
-+ lit = -lit;
-+ do {
-+ *op++ = ip[lit];
-+ } while (++lit);
-+ }
-+
-+ *out_len = op - out_data;
-+ return 0;
-+}
-+
-+static int lzf_decompress(struct crypto_tfm *tfm, const u8 *src,
-+ unsigned int slen, u8 *dst, unsigned int *dlen)
-+{
-+ u8 const *ip = src;
-+ u8 *op = dst;
-+ u8 const *const in_end = ip + slen;
-+ u8 *const out_end = op + *dlen;
-+
-+ *dlen = PAGE_SIZE;
-+ do {
-+ unsigned int ctrl = *ip++;
-+
-+ if (ctrl < (1 << 5)) {
-+ /* literal run */
-+ ctrl++;
-+
-+ if (op + ctrl > out_end)
-+ return 0;
-+ memcpy(op, ip, ctrl);
-+ op += ctrl;
-+ ip += ctrl;
-+ } else { /* back reference */
-+
-+ unsigned int len = ctrl >> 5;
-+
-+ u8 *ref = op - ((ctrl & 0x1f) << 8) - 1;
-+
-+ if (len == 7)
-+ len += *ip++;
-+
-+ ref -= *ip++;
-+ len += 2;
-+
-+ if (op + len > out_end || ref < (u8 *) dst)
-+ return 0;
-+
-+ do {
-+ *op++ = *ref++;
-+ } while (--len);
-+ }
-+ } while (op < out_end && ip < in_end);
-+
-+ *dlen = op - (u8 *) dst;
-+ return 0;
-+}
-+
-+static struct crypto_alg alg = {
-+ .cra_name = "lzf",
-+ .cra_flags = CRYPTO_ALG_TYPE_COMPRESS,
-+ .cra_ctxsize = sizeof(struct lzf_ctx),
-+ .cra_module = THIS_MODULE,
-+ .cra_list = LIST_HEAD_INIT(alg.cra_list),
-+ .cra_init = lzf_compress_init,
-+ .cra_exit = lzf_compress_exit,
-+ .cra_u = { .compress = {
-+ .coa_compress = lzf_compress,
-+ .coa_decompress = lzf_decompress } }
-+};
-+
-+static int __init init(void)
-+{
-+ return crypto_register_alg(&alg);
-+}
-+
-+static void __exit fini(void)
-+{
-+ crypto_unregister_alg(&alg);
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION("LZF Compression Algorithm");
-+MODULE_AUTHOR("Marc Alexander Lehmann & Nigel Cunningham");
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 1352312..f705dce 100644
--- a/drivers/base/dd.c
@@ -2144,7 +1781,7 @@
return PTR_ERR(req);
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
-index d9fdb7c..57922c4 100644
+index 821d10f..4b8b86f 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -7,11 +7,13 @@
@@ -2454,7 +2091,7 @@
#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 065cdf8..175f46d 100644
+index 3daa05f..8497a33 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -104,6 +104,7 @@ extern unsigned int kobjsize(const void *objp);
@@ -2465,7 +2102,7 @@
#ifndef VM_STACK_DEFAULT_FLAGS /* arch can override this */
#define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS
-@@ -1294,6 +1295,7 @@ int drop_caches_sysctl_handler(struct ctl_table *, int, struct file *,
+@@ -1305,6 +1306,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);
@@ -3917,10 +3554,10 @@
* pack_pfns - pfns corresponding to the set bits found in the bitmap @bm
diff --git a/kernel/power/tuxonice.h b/kernel/power/tuxonice.h
new file mode 100644
-index 0000000..336049f
+index 0000000..267368d
--- /dev/null
+++ b/kernel/power/tuxonice.h
-@@ -0,0 +1,211 @@
+@@ -0,0 +1,212 @@
+/*
+ * kernel/power/tuxonice.h
+ *
@@ -3943,7 +3580,7 @@
+#include <asm/setup.h>
+#include "tuxonice_pageflags.h"
+
-+#define TOI_CORE_VERSION "3.0"
++#define TOI_CORE_VERSION "3.0.1"
+
+#define MY_BOOT_KERNEL_DATA_VERSION 1
+
@@ -4021,6 +3658,7 @@
+ TOI_PRE_RESTORE_FAILED,
+ TOI_USERMODE_HELPERS_ERR,
+ TOI_CANT_USE_ALT_RESUME,
++ TOI_HEADER_TOO_BIG,
+ TOI_NUM_RESULT_STATES /* Used in printing debug info only */
+};
+
@@ -4939,10 +4577,10 @@
+void toi_end_atomic(int stage, int toi_time, int error);
diff --git a/kernel/power/tuxonice_block_io.c b/kernel/power/tuxonice_block_io.c
new file mode 100644
-index 0000000..dfa3448
+index 0000000..7100da0
--- /dev/null
+++ b/kernel/power/tuxonice_block_io.c
-@@ -0,0 +1,1305 @@
+@@ -0,0 +1,1336 @@
+/*
+ * kernel/power/tuxonice_block_io.c
+ *
@@ -5157,10 +4795,11 @@
+ *
+ * Flush any queued but unsubmitted I/O and wait for it all to complete.
+ **/
-+static void toi_finish_all_io(void)
++static int toi_finish_all_io(void)
+{
-+ toi_bio_queue_flush_pages(0);
++ int result = toi_bio_queue_flush_pages(0);
+ wait_event(num_in_progress_wait, !TOTAL_OUTSTANDING_IO);
++ return result;
+}
+
+/**
@@ -5248,7 +4887,7 @@
+ bio->bi_end_io = toi_end_bio;
+
+ if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) {
-+ printk(KERN_INFO "ERROR: adding page to bio at %lld\n",
++ printk(KERN_DEBUG "ERROR: adding page to bio at %lld\n",
+ (unsigned long long) first_block);
+ bio_put(bio);
+ return -EFAULT;
@@ -5432,7 +5071,7 @@
+ if (!this)
+ continue;
+
-+ printk(KERN_INFO "Chain %d:", i);
++ printk(KERN_DEBUG "Chain %d:", i);
+
+ while (this) {
+ printk(" [%lu-%lu]%s", this->start,
@@ -5444,12 +5083,30 @@
+ }
+
+ for (i = 0; i < 4; i++)
-+ printk(KERN_INFO "Posn %d: Chain %d, extent %d, offset %lu.\n",
++ printk(KERN_DEBUG "Posn %d: Chain %d, extent %d, offset %lu.\n",
+ i, toi_writer_posn_save[i].chain_num,
+ toi_writer_posn_save[i].extent_num,
+ toi_writer_posn_save[i].offset);
+}
+
++static int total_header_bytes;
++static int unowned;
++
++static int debug_broken_header(void)
++{
++ printk(KERN_DEBUG "Image header too big for size allocated!\n");
++ print_toi_header_storage_for_modules();
++ printk(KERN_DEBUG "Page flags : %d.\n", toi_pageflags_space_needed());
++ printk(KERN_DEBUG "toi_header : %ld.\n", sizeof(struct toi_header));
++ printk(KERN_DEBUG "Total unowned : %d.\n", unowned);
++ printk(KERN_DEBUG "Total used : %d (%ld pages).\n", total_header_bytes,
++ DIV_ROUND_UP(total_header_bytes, PAGE_SIZE));
++ printk(KERN_DEBUG "Space needed now : %ld.\n", get_header_storage_needed());
++ dump_block_chains();
++ abort_hibernate(TOI_HEADER_TOO_BIG, "Header reservation too small.");
++ return -EIO;
++}
++
+/**
+ * go_next_page - skip blocks to the start of the next page
+ * @writing: Whether we're reading or writing the image.
@@ -5458,7 +5115,7 @@
+ * set at the start of reading the image header, to skip the first page
+ * of the header, which is read without using the extent chains.
+ **/
-+static int go_next_page(int writing)
++static int go_next_page(int writing, int section_barrier)
+{
+ int i, max = (toi_writer_posn.current_chain == -1) ? 1 :
+ toi_devinfo[toi_writer_posn.current_chain].blocks_per_page,
@@ -5477,13 +5134,14 @@
+ break;
+ }
+
-+ if (toi_writer_posn.current_chain ==
++ if (section_barrier && toi_writer_posn.current_chain ==
+ toi_writer_posn_save[compare_to].chain_num &&
+ toi_writer_posn.current_offset ==
+ toi_writer_posn_save[compare_to].offset) {
-+ if (writing)
-+ BUG_ON(!current_stream);
-+ else {
++ if (writing) {
++ if (!current_stream)
++ return debug_broken_header();
++ } else {
+ more_readahead = 0;
+ return -ENODATA;
+ }
@@ -5495,8 +5153,8 @@
+
+ if (toi_extent_state_eof(&toi_writer_posn)) {
+ /* Don't complain if readahead falls off the end */
-+ if (writing) {
-+ printk(KERN_INFO "Extent state eof. "
++ if (writing && section_barrier) {
++ printk(KERN_DEBUG "Extent state eof. "
+ "Expected compression ratio too optimistic?\n");
+ dump_block_chains();
+ }
@@ -5505,7 +5163,7 @@
+
+ if (extra_page_forward) {
+ extra_page_forward = 0;
-+ return go_next_page(writing);
++ return go_next_page(writing, section_barrier);
+ }
+
+ return 0;
@@ -5537,9 +5195,10 @@
+ int is_readahead, int free_group)
+{
+ struct toi_bdev_info *dev_info;
++ int result = go_next_page(writing, 1);
+
-+ if (go_next_page(writing))
-+ return -ENODATA;
++ if (result)
++ return result;
+
+ dev_info = &toi_devinfo[toi_writer_posn.current_chain];
+
@@ -5626,7 +5285,7 @@
+ **/
+static int toi_rw_cleanup(int writing)
+{
-+ int i;
++ int i, result;
+
+ if (writing) {
+ int result;
@@ -5647,7 +5306,7 @@
+ &toi_writer_posn_save[3]);
+ }
+
-+ toi_finish_all_io();
++ result = toi_finish_all_io();
+
+ while (readahead_list_head) {
+ void *next = (void *) readahead_list_head->private;
@@ -5658,18 +5317,18 @@
+ readahead_list_tail = NULL;
+
+ if (!current_stream)
-+ return 0;
++ return result;
+
+ for (i = 0; i < NUM_REASONS; i++) {
+ if (!atomic_read(&reasons[i]))
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/kernel-tuxonice.patch?r1=1.3&r2=1.4&f=u
More information about the pld-cvs-commit
mailing list