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 <jmor...@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 <p...@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 _______________________________________________ pld-cvs-commit mailing list pld-cvs-commit@lists.pld-linux.org http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit