packages: kernel/kernel.spec, kernel/kernel-tuxonice.patch - tuxonice 3.1

arekm arekm at pld-linux.org
Tue Mar 16 20:12:17 CET 2010


Author: arekm                        Date: Tue Mar 16 19:12:17 2010 GMT
Module: packages                      Tag: HEAD
---- Log message:
- tuxonice 3.1

---- Files affected:
packages/kernel:
   kernel.spec (1.775 -> 1.776) , kernel-tuxonice.patch (1.10 -> 1.11) 

---- Diffs:

================================================================
Index: packages/kernel/kernel.spec
diff -u packages/kernel/kernel.spec:1.775 packages/kernel/kernel.spec:1.776
--- packages/kernel/kernel.spec:1.775	Mon Mar 15 22:34:16 2010
+++ packages/kernel/kernel.spec	Tue Mar 16 20:12:12 2010
@@ -120,7 +120,7 @@
 
 %define		_enable_debug_packages			0
 
-%define		tuxonice_version	3.0.1
+%define		tuxonice_version	3.1
 %define		netfilter_snap		20070806
 
 %if %{with myown}
@@ -261,7 +261,7 @@
 Patch59:	kernel-rndis_host-wm5.patch
 
 # Project suspend2 renamed to tuxonice
-# http://www.tuxonice.net/downloads/all/tuxonice-3.0.99.48-for-head.patch.bz2
+# http://www.tuxonice.net/downloads/all/tuxonice-3.1-for-2.6.33.patch.bz2
 Patch69:	kernel-tuxonice.patch
 Patch70:	kernel-tuxonice-headers.patch
 
@@ -1593,6 +1593,9 @@
 All persons listed below can be reached at <cvs_login>@pld-linux.org
 
 $Log$
+Revision 1.776  2010/03/16 19:12:12  arekm
+- tuxonice 3.1
+
 Revision 1.775  2010/03/15 21:34:16  arekm
 - up to 2.6.33.1
 

================================================================
Index: packages/kernel/kernel-tuxonice.patch
diff -u packages/kernel/kernel-tuxonice.patch:1.10 packages/kernel/kernel-tuxonice.patch:1.11
--- packages/kernel/kernel-tuxonice.patch:1.10	Sat Mar  6 21:17:49 2010
+++ packages/kernel/kernel-tuxonice.patch	Tue Mar 16 20:12:12 2010
@@ -1,8 +1,8 @@
 diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
-index 736d456..c3048d7 100644
+index e7848a0..616afc2 100644
 --- a/Documentation/kernel-parameters.txt
 +++ b/Documentation/kernel-parameters.txt
-@@ -2694,6 +2694,9 @@ and is between 256 and 4096 characters. It is defined in the file
+@@ -2703,6 +2703,9 @@ and is between 256 and 4096 characters. It is defined in the file
  					medium is write-protected).
  			Example: quirks=0419:aaf5:rl,0421:0433:rc
  
@@ -1450,10 +1450,10 @@
 +   testing. His efforts have contributed as much to TuxOnIce as any of the
 +   names above.
 diff --git a/MAINTAINERS b/MAINTAINERS
-index 03f38c1..0087fd5 100644
+index 2533fc4..e14223f 100644
 --- a/MAINTAINERS
 +++ b/MAINTAINERS
-@@ -5378,6 +5378,13 @@ S:	Maintained
+@@ -5380,6 +5380,13 @@ S:	Maintained
  F:	drivers/tc/
  F:	include/linux/tc.h
  
@@ -1585,7 +1585,7 @@
  obj-$(CONFIG_BLK_DEV_BSG)	+= bsg.o
  obj-$(CONFIG_BLK_CGROUP)	+= blk-cgroup.o
 diff --git a/block/blk-core.c b/block/blk-core.c
-index 718897e..70b4bd9 100644
+index d1a9a0a..d229a5b 100644
 --- a/block/blk-core.c
 +++ b/block/blk-core.c
 @@ -37,6 +37,9 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(block_remap);
@@ -2647,10 +2647,10 @@
  		goto free;
  
 diff --git a/drivers/md/md.c b/drivers/md/md.c
-index dd3dfe4..6b62cef 100644
+index a20a71e..6f221e5 100644
 --- a/drivers/md/md.c
 +++ b/drivers/md/md.c
-@@ -6473,6 +6473,9 @@ void md_do_sync(mddev_t *mddev)
+@@ -6469,6 +6469,9 @@ void md_do_sync(mddev_t *mddev)
  		mddev->curr_resync = 2;
  
  	try_again:
@@ -2660,7 +2660,7 @@
  		if (kthread_should_stop())
  			set_bit(MD_RECOVERY_INTR, &mddev->recovery);
  
-@@ -6495,6 +6498,10 @@ void md_do_sync(mddev_t *mddev)
+@@ -6491,6 +6494,10 @@ void md_do_sync(mddev_t *mddev)
  					 * time 'round when curr_resync == 2
  					 */
  					continue;
@@ -2671,7 +2671,7 @@
  				/* We need to wait 'interruptible' so as not to
  				 * contribute to the load average, and not to
  				 * be caught by 'softlockup'
-@@ -6507,6 +6514,7 @@ void md_do_sync(mddev_t *mddev)
+@@ -6503,6 +6510,7 @@ void md_do_sync(mddev_t *mddev)
  					       " share one or more physical units)\n",
  					       desc, mdname(mddev), mdname(mddev2));
  					mddev_put(mddev2);
@@ -2679,7 +2679,7 @@
  					if (signal_pending(current))
  						flush_signals(current);
  					schedule();
-@@ -6616,6 +6624,9 @@ void md_do_sync(mddev_t *mddev)
+@@ -6612,6 +6620,9 @@ void md_do_sync(mddev_t *mddev)
  						 || kthread_should_stop());
  		}
  
@@ -2689,7 +2689,7 @@
  		if (kthread_should_stop())
  			goto interrupted;
  
-@@ -6660,6 +6671,9 @@ void md_do_sync(mddev_t *mddev)
+@@ -6656,6 +6667,9 @@ void md_do_sync(mddev_t *mddev)
  			last_mark = next;
  		}
  
@@ -2700,10 +2700,10 @@
  		if (kthread_should_stop())
  			goto interrupted;
 diff --git a/fs/block_dev.c b/fs/block_dev.c
-index 73d6a73..2e80ea9 100644
+index d11d028..b2388cc 100644
 --- a/fs/block_dev.c
 +++ b/fs/block_dev.c
-@@ -334,6 +334,93 @@ out_unlock:
+@@ -335,6 +335,93 @@ out_unlock:
  }
  EXPORT_SYMBOL(thaw_bdev);
  
@@ -3163,10 +3163,10 @@
  
  static inline int register_fuseblk(void)
 diff --git a/fs/namei.c b/fs/namei.c
-index 94a5e60..17c839b 100644
+index a4855af..3d57581 100644
 --- a/fs/namei.c
 +++ b/fs/namei.c
-@@ -2260,6 +2260,8 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry)
+@@ -2268,6 +2268,8 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry)
  	if (!dir->i_op->unlink)
  		return -EPERM;
  
@@ -3250,7 +3250,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 b1bcb27..f6343be 100644
+index ebb1cd5..e30e318 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
 @@ -173,6 +173,7 @@ struct inodes_stat_t {
@@ -3515,7 +3515,7 @@
  	sys_fchdir(old_fd);
  	sys_mount("/", ".", NULL, MS_MOVE, NULL);
 diff --git a/init/main.c b/init/main.c
-index dac44a9..1879ca9 100644
+index 4cb47a1..36eac80 100644
 --- a/init/main.c
 +++ b/init/main.c
 @@ -116,6 +116,7 @@ extern void softirq_init(void);
@@ -4813,7 +4813,7 @@
   *	suspend_finish - Do final work before exiting suspend sequence.
 diff --git a/kernel/power/tuxonice.h b/kernel/power/tuxonice.h
 new file mode 100644
-index 0000000..5a17e10
+index 0000000..e7bc111
 --- /dev/null
 +++ b/kernel/power/tuxonice.h
 @@ -0,0 +1,211 @@
@@ -4840,7 +4840,7 @@
 +#include "tuxonice_pageflags.h"
 +#include "power.h"
 +
-+#define TOI_CORE_VERSION "3.0.99.48"
++#define TOI_CORE_VERSION "3.1"
 +#define	TOI_HEADER_VERSION 2
 +#define MY_BOOT_KERNEL_DATA_VERSION 3
 +
@@ -5939,7 +5939,7 @@
 +};
 diff --git a/kernel/power/tuxonice_bio_chains.c b/kernel/power/tuxonice_bio_chains.c
 new file mode 100644
-index 0000000..5ee97b7
+index 0000000..2ac2042
 --- /dev/null
 +++ b/kernel/power/tuxonice_bio_chains.c
 @@ -0,0 +1,1044 @@
@@ -6098,7 +6098,7 @@
 +	int i;
 +
 +	if (!toi_writer_posn.current_chain)
-+		return -ENODATA;
++		return -ENOSPC;
 +
 +	/* Assume chains always have lengths that are multiples of @blocks */
 +	for (i = 0; i < blocks; i++)
@@ -6109,7 +6109,7 @@
 +	    !toi_writer_posn.current_chain->blocks.current_extent)
 +		find_next_chain();
 +
-+	return  toi_writer_posn.current_chain ? 0 : -ENODATA;
++	return  toi_writer_posn.current_chain ? 0 : -ENOSPC;
 +}
 +
 +static void toi_insert_chain_in_prio_list(struct toi_bdev_info *this)
@@ -6722,7 +6722,7 @@
 +		}
 +		toi_message(TOI_IO, TOI_VERBOSE, 0, "Ran out of extents to "
 +				"read/write. (Not necessarily a fatal error.");
-+		return -ENODATA;
++		return -ENOSPC;
 +	}
 +
 +	return 0;
@@ -6762,7 +6762,7 @@
 +	if (result) {
 +		toi_message(TOI_IO, TOI_VERBOSE, 0, "Seeking to read/write "
 +				"another page when stream has ended.");
-+		return -ENODATA;
++		return -ENOSPC;
 +	}
 +
 +	toi_message(TOI_IO, TOI_VERBOSE, 0,
@@ -6831,7 +6831,7 @@
 +
 +	for (i = 0; i < header_pages_reserved; i++)
 +		if (go_next_page(1, 0))
-+			return -ENODATA;
++			return -ENOSPC;
 +
 +	/* The end of header pages will be the start of pageset 2 */
 +	toi_extent_state_save(2);
@@ -6989,10 +6989,10 @@
 +}
 diff --git a/kernel/power/tuxonice_bio_core.c b/kernel/power/tuxonice_bio_core.c
 new file mode 100644
-index 0000000..6bb7887
+index 0000000..b8ae996
 --- /dev/null
 +++ b/kernel/power/tuxonice_bio_core.c
-@@ -0,0 +1,1806 @@
+@@ -0,0 +1,1810 @@
 +/*
 + * kernel/power/tuxonice_bio.c
 + *
@@ -7224,7 +7224,8 @@
 +
 +	/* Getting low on memory and I/O is in progress? */
 +	while (unlikely(free_pages < free_mem_throttle) &&
-+			atomic_read(&toi_io_in_progress)) {
++			atomic_read(&toi_io_in_progress) &&
++			!test_result_state(TOI_ABORTED)) {
 +		if (!(flags & THROTTLE_WAIT))
 +			return -ENOMEM;
 +		do_bio_wait(4);
@@ -7232,7 +7233,8 @@
 +	}
 +
 +	while (!(flags & MEMORY_ONLY) && throughput_throttle &&
-+		TOTAL_OUTSTANDING_IO >= throughput_throttle) {
++		TOTAL_OUTSTANDING_IO >= throughput_throttle &&
++		!test_result_state(TOI_ABORTED)) {
 +		int result = toi_bio_queue_flush_pages(0);
 +		if (result)
 +			return result;
@@ -7621,16 +7623,15 @@
 + **/
 +static int toi_rw_cleanup(int writing)
 +{
-+	int i, result;
++	int i, result = 0;
 +
 +	toi_message(TOI_IO, TOI_VERBOSE, 0, "toi_rw_cleanup.");
 +	if (writing) {
-+		int result;
-+
 +		if (toi_writer_buffer_posn && !test_result_state(TOI_ABORTED))
 +			toi_bio_queue_write(&toi_writer_buffer);
 +
-+		result = toi_bio_queue_flush_pages(0);
++		while (bio_queue_head && !result)
++			result = toi_bio_queue_flush_pages(0);
 +
 +		if (result)
 +			return result;
@@ -7701,11 +7702,11 @@
 +	}
 +
 +	result = toi_bio_rw_page(READ, virt_to_page(buffer), 1, 0);
-+	if (result == -ENODATA)
++	if (result == -ENOSPC)
 +		toi__free_page(12, virt_to_page(buffer));
 +	mutex_unlock(&toi_bio_readahead_mutex);
 +	if (result) {
-+		if (result == -ENODATA)
++		if (result == -ENOSPC)
 +			toi_message(TOI_IO, TOI_VERBOSE, 0,
 +					"Last readahead page submitted.");
 +		else
@@ -7744,7 +7745,7 @@
 +		last_result = toi_start_one_readahead(dedicated_thread);
 +
 +		if (last_result) {
-+			if (last_result == -ENOMEM || last_result == -ENODATA)
++			if (last_result == -ENOMEM || last_result == -ENOSPC)
 +				return 0;
 +
 +			printk(KERN_DEBUG
@@ -7806,7 +7807,7 @@
 +		 */
 +		if (!more_readahead) {
 +			printk(KERN_EMERG "No more readahead.\n");
-+			return -ENODATA;
++			return -ENOSPC;
 +		}
 +		if (unlikely(toi_start_one_readahead(0))) {
 +			printk(KERN_EMERG "No readahead and "
@@ -7866,7 +7867,10 @@
 +			bio_queue_tail = NULL;
 +		atomic_dec(&toi_bio_queue_size);
 +		spin_unlock_irqrestore(&bio_queue_lock, flags);
-+		result = toi_bio_rw_page(WRITE, page, 0, 11);
++
++		/* Don't generate more error messages if already had one */
++		if (!result)
++			result = toi_bio_rw_page(WRITE, page, 0, 11);
 +		/*
 +		 * If writing the page failed, don't drop out.
 +		 * Flush the rest of the queue too.
@@ -11230,7 +11234,7 @@
 +
 diff --git a/kernel/power/tuxonice_compress.c b/kernel/power/tuxonice_compress.c
 new file mode 100644
-index 0000000..785f1d5
+index 0000000..6bbc446
 --- /dev/null
 +++ b/kernel/power/tuxonice_compress.c
 @@ -0,0 +1,497 @@
@@ -11460,7 +11464,7 @@
 +
 +	ctx->buffer_start = kmap(buffer_page);
 +
-+	ctx->len = buf_size;
++	ctx->len = PAGE_SIZE;
 +
 +	ret = crypto_comp_compress(ctx->transform,
 +			ctx->buffer_start, buf_size,
@@ -13733,10 +13737,10 @@
 +#endif
 diff --git a/kernel/power/tuxonice_io.c b/kernel/power/tuxonice_io.c
 new file mode 100644
-index 0000000..2ce4367
+index 0000000..02be4d9
 --- /dev/null
 +++ b/kernel/power/tuxonice_io.c
-@@ -0,0 +1,1802 @@
+@@ -0,0 +1,1822 @@
 +/*
 + * kernel/power/tuxonice_io.c
 + *
@@ -14155,6 +14159,7 @@
 +					"still %d.\n", atomic_read(&io_count));
 +			BUG();
 +		}
++		mutex_unlock(&io_mutex);
 +		return -ENODATA;
 +	}
 +
@@ -14192,15 +14197,23 @@
 + * @my_io_index: The index of the page in the pageset.
 + * @write_pfn: The pfn in which the data belongs.
 + *
-+ * Read a page of the image into our buffer.
++ * Read a page of the image into our buffer. It can happen (here and in the
++ * write routine) that threads don't get run until after other CPUs have done
++ * all the work. This was the cause of the long standing issue with
++ * occasionally getting -ENODATA errors at the end of reading the image. We
++ * therefore need to check there's actually a page to read before trying to
++ * retrieve one.
 + **/
 +
 +static int read_next_page(int *my_io_index, unsigned long *write_pfn,
 +		struct page *buffer, struct toi_module_ops *first_filter)
 +{
 +	unsigned int buf_size = PAGE_SIZE;
++	unsigned long left = atomic_read(&io_count);
++
++	if (left)
++		*my_io_index = io_finish_at - atomic_sub_return(1, &io_count);
 +
-+	*my_io_index = io_finish_at - atomic_sub_return(1, &io_count);
 +	mutex_unlock(&io_mutex);
 +
 +	/*
@@ -14222,6 +14235,9 @@
 +			schedule();
 +	}
 +
++	if (!left)
++		return -ENODATA;
++
 +	/*
 +	 * See toi_bio_read_page in tuxonice_bio.c:
 +	 * read the next page in the image.
@@ -14302,7 +14318,6 @@
 +
 +	current->flags |= PF_NOFREEZE;
 +
-+	atomic_inc(&toi_io_workers);
 +	mutex_lock(&io_mutex);
 +
 +	do {
@@ -14328,8 +14343,12 @@
 +					buffer, first_filter);
 +
 +		if (result) {
-+			io_result = result;
 +			mutex_lock(&io_mutex);
++			/* Nothing to do? */
++			if (result == -ENODATA)
++				break;
++
++			io_result = result;
 +
 +			if (io_write) {
 +				printk(KERN_INFO "Write chunk returned %d.\n",
@@ -14401,9 +14420,12 @@
 +{
 +	int cpu, num_started = 0;
 +	struct task_struct *p;
++	int to_start = (toi_max_workers ? toi_max_workers : num_online_cpus()) - 1;
++
++	atomic_set(&toi_io_workers, to_start);
 +
 +	for_each_online_cpu(cpu) {
-+		if (toi_max_workers && (num_started + 1) == toi_max_workers)
++		if (num_started == to_start)
 +			break;
 +
 +		if (cpu == smp_processor_id())
@@ -14413,6 +14435,7 @@
 +				"ktoi_io/%d", cpu);
 +		if (IS_ERR(p)) {
 +			printk(KERN_ERR "ktoi_io for %i failed\n", cpu);
++			atomic_dec(&toi_io_workers);
 +			continue;
 +		}
 +		kthread_bind(p, cpu);
@@ -14484,9 +14507,10 @@
 +		num_other_threads = start_other_threads();
 +
 +	if (!num_other_threads || !toiActiveAllocator->io_flusher ||
-+		test_action_state(TOI_NO_FLUSHER_THREAD))
++		test_action_state(TOI_NO_FLUSHER_THREAD)) {
++		atomic_inc(&toi_io_workers);
 +		worker_rw_loop(num_other_threads ? NULL : MONITOR);
-+	else
++	} else
 +		result = toiActiveAllocator->io_flusher(write);
 +
 +	while (atomic_read(&toi_io_workers))
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel.spec?r1=1.775&r2=1.776&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel-tuxonice.patch?r1=1.10&r2=1.11&f=u



More information about the pld-cvs-commit mailing list