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(&current->fs_excl)
  #define put_fs_excl() atomic_dec(&current->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