diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-12-06 14:14:16 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-12-06 14:14:16 -0800 | 
| commit | f194d132e4971111f85c18c96067acffb13cee6d (patch) | |
| tree | e7510b0f2300e059db3fbe850b68667af28531f0 | |
| parent | 09f3eca2b7e2762e223fdd359f9d0f6303a85f6c (diff) | |
| parent | 982286d1b8e438f595cdc9304cc4c185c7b90a39 (diff) | |
| download | olio-linux-3.10-f194d132e4971111f85c18c96067acffb13cee6d.tar.xz olio-linux-3.10-f194d132e4971111f85c18c96067acffb13cee6d.zip  | |
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6:
  ACPI: suspend: old debugging hacks sneaked back
  Freezer: Fix JFFS2 garbage collector freezing issue (rev. 2)
  HWMON: coretemp, suspend fix
  Freezer: Fix APM emulation breakage
  Freezer: Fix s2disk resume from initrd
| -rw-r--r-- | arch/x86/kernel/acpi/wakeup_32.S | 4 | ||||
| -rw-r--r-- | drivers/char/apm-emulation.c | 15 | ||||
| -rw-r--r-- | drivers/hwmon/coretemp.c | 5 | ||||
| -rw-r--r-- | fs/jffs2/background.c | 2 | ||||
| -rw-r--r-- | init/do_mounts_initrd.c | 12 | 
5 files changed, 20 insertions, 18 deletions
diff --git a/arch/x86/kernel/acpi/wakeup_32.S b/arch/x86/kernel/acpi/wakeup_32.S index a97313b1270..1e931aaf2ef 100644 --- a/arch/x86/kernel/acpi/wakeup_32.S +++ b/arch/x86/kernel/acpi/wakeup_32.S @@ -35,10 +35,6 @@ wakeup_code:  	wakeup_code_start = .  	.code16 - 	movw	$0xb800, %ax -	movw	%ax,%fs -	movw	$0x0e00 + 'L', %fs:(0x10) -  	cli  	cld diff --git a/drivers/char/apm-emulation.c b/drivers/char/apm-emulation.c index c99e43b837f..17d54315e14 100644 --- a/drivers/char/apm-emulation.c +++ b/drivers/char/apm-emulation.c @@ -295,7 +295,6 @@ static int  apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)  {  	struct apm_user *as = filp->private_data; -	unsigned long flags;  	int err = -EINVAL;  	if (!as->suser || !as->writer) @@ -331,10 +330,16 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)  			 * Wait for the suspend/resume to complete.  If there  			 * are pending acknowledges, we wait here for them.  			 */ -			flags = current->flags; +			freezer_do_not_count();  			wait_event(apm_suspend_waitqueue,  				   as->suspend_state == SUSPEND_DONE); + +			/* +			 * Since we are waiting until the suspend is done, the +			 * try_to_freeze() in freezer_count() will not trigger +			 */ +			freezer_count();  		} else {  			as->suspend_state = SUSPEND_WAIT;  			mutex_unlock(&state_lock); @@ -362,14 +367,10 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)  			 * Wait for the suspend/resume to complete.  If there  			 * are pending acknowledges, we wait here for them.  			 */ -			flags = current->flags; - -			wait_event_interruptible(apm_suspend_waitqueue, +			wait_event_freezable(apm_suspend_waitqueue,  					 as->suspend_state == SUSPEND_DONE);  		} -		current->flags = flags; -  		mutex_lock(&state_lock);  		err = as->suspend_result;  		as->suspend_state = SUSPEND_NONE; diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 5c82ec7f8bb..3ee60d26e3a 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c @@ -337,11 +337,10 @@ static int coretemp_cpu_callback(struct notifier_block *nfb,  	switch (action) {  	case CPU_ONLINE: -	case CPU_ONLINE_FROZEN: +	case CPU_DOWN_FAILED:  		coretemp_device_add(cpu);  		break; -	case CPU_DEAD: -	case CPU_DEAD_FROZEN: +	case CPU_DOWN_PREPARE:  		coretemp_device_remove(cpu);  		break;  	} diff --git a/fs/jffs2/background.c b/fs/jffs2/background.c index d568ae84674..8adebd3e43c 100644 --- a/fs/jffs2/background.c +++ b/fs/jffs2/background.c @@ -105,7 +105,7 @@ static int jffs2_garbage_collect_thread(void *_c)  		/* Put_super will send a SIGKILL and then wait on the sem.  		 */ -		while (signal_pending(current)) { +		while (signal_pending(current) || freezing(current)) {  			siginfo_t info;  			unsigned long signr; diff --git a/init/do_mounts_initrd.c b/init/do_mounts_initrd.c index fd4fc12d262..614241b5200 100644 --- a/init/do_mounts_initrd.c +++ b/init/do_mounts_initrd.c @@ -55,12 +55,18 @@ static void __init handle_initrd(void)  	sys_mount(".", "/", NULL, MS_MOVE, NULL);  	sys_chroot("."); +	/* +	 * In case that a resume from disk is carried out by linuxrc or one of +	 * its children, we need to tell the freezer not to wait for us. +	 */ +	current->flags |= PF_FREEZER_SKIP; +  	pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD);  	if (pid > 0) -		while (pid != sys_wait4(-1, NULL, 0, NULL)) { -			try_to_freeze(); +		while (pid != sys_wait4(-1, NULL, 0, NULL))  			yield(); -		} + +	current->flags &= ~PF_FREEZER_SKIP;  	/* move initrd to rootfs' /old */  	sys_fchdir(old_fd);  |