From ce922a4c58c8e7a1b5990a0575fe7bdf24d694a3 Mon Sep 17 00:00:00 2001
From: Pavel Machek <pavel@ucw.cz>
Date: Thu, 23 May 2002 21:55:13 -0700
Subject: [PATCH] [PATCH] swsusp fixes

This kills unneccessary include from ide-disk.c, kills #ifdef from
reiserfs/journal.c, makes suspend_device local as it should be,
abstains from suspending devices two times in a row (typo), and makes
sure we do not run_task_queue() while we hold spinlock.
---
 drivers/ide/ide-disk.c |  1 -
 fs/reiserfs/journal.c  |  9 +++------
 kernel/suspend.c       | 16 ++++------------
 mm/pdflush.c           |  6 +++---
 4 files changed, 10 insertions(+), 22 deletions(-)

diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
index 6fdcb7a36365..d6cba782dc2c 100644
--- a/drivers/ide/ide-disk.c
+++ b/drivers/ide/ide-disk.c
@@ -27,7 +27,6 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include <linux/ide.h>
-#include <linux/suspend.h>
 
 #include <asm/byteorder.h>
 #include <asm/irq.h>
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c
index cf4dd84fd758..b1ef9b65b704 100644
--- a/fs/reiserfs/journal.c
+++ b/fs/reiserfs/journal.c
@@ -1901,12 +1901,9 @@ static int reiserfs_journal_commit_thread(void *nullp) {
       break ;
     }
     wake_up(&reiserfs_commit_thread_done) ;
-#ifdef CONFIG_SOFTWARE_SUSPEND
-    if (current->flags & PF_FREEZE) {
-	    refrigerator(PF_IOTHREAD);
-    } else
-#endif
-	    interruptible_sleep_on_timeout(&reiserfs_commit_thread_wait, 5 * HZ) ;
+    if (current->flags & PF_FREEZE)
+      refrigerator(PF_IOTHREAD);
+    interruptible_sleep_on_timeout(&reiserfs_commit_thread_wait, 5 * HZ) ;
   }
   unlock_kernel() ;
   wake_up(&reiserfs_commit_thread_done) ;
diff --git a/kernel/suspend.c b/kernel/suspend.c
index d0fde1a86046..1164db22cdb1 100644
--- a/kernel/suspend.c
+++ b/kernel/suspend.c
@@ -409,15 +409,12 @@ static void lock_swapdevices(void) /* This is called after saving image so modif
 	swap_list_lock();
 	for(i = 0; i< MAX_SWAPFILES; i++)
 		if(swapfile_used[i] == SWAPFILE_IGNORED) {
-//			PRINTS( "device %s locked\n", swap_info[i].swap_file->d_name.name );
 			swap_info[i].flags ^= 0xFF; /* we make the device unusable. A new call to
 						       lock_swapdevices can unlock the devices. */
 		}
 	swap_list_unlock();
 }
 
-kdev_t suspend_device;
-
 static int write_suspend_image(void)
 {
 	int i;
@@ -425,6 +422,7 @@ static int write_suspend_image(void)
 	int nr_pgdir_pages = SUSPEND_PD_PAGES(nr_copy_pages);
 	union diskpage *cur,  *buffer = (union diskpage *)get_free_page(GFP_ATOMIC);
 	unsigned long address;
+	kdev_t suspend_device;
 
 	PRINTS( "Writing data to swap (%d pages): ", nr_copy_pages );
 	for (i=0; i<nr_copy_pages; i++) {
@@ -809,7 +807,6 @@ static int suspend_save_image(void)
 	 *
 	 * Following line enforces not writing to disk until we choose.
 	 */
-	suspend_device = NODEV;					/* We do not want any writes, thanx */
 	drivers_unsuspend();
 	spin_unlock_irq(&suspend_pagedir_lock);
 	PRINTS( "critical section/: done (%d pages copied)\n", nr_copy_pages );
@@ -899,13 +896,9 @@ static void do_magic_suspend_1(void)
 static void do_magic_suspend_2(void)
 {
 	read_swapfiles();
-	if (!suspend_save_image()) {
-#if 1
-		suspend_power_down ();	/* FIXME: if suspend_power_down is commented out, console is lost after few suspends ?! */
-#endif
-	}
+	if (!suspend_save_image())
+		suspend_power_down();	/* FIXME: if suspend_power_down is commented out, console is lost after few suspends ?! */
 
-	suspend_device = NODEV;
 	printk(KERN_WARNING "%sSuspend failed, trying to recover...\n", name_suspend);
 	MDELAY(1000); /* So user can wait and report us messages if armageddon comes :-) */
 
@@ -944,9 +937,8 @@ void do_software_suspend(void)
 			 * We sync here -- so you have consistent filesystem state when things go wrong.
 			 * -- so that noone writes to disk after we do atomic copy of data.
 			 */
-			PRINTS( "Syncing disks before copy\n" );
+			PRINTS("Syncing disks before copy\n");
 			do_suspend_sync();
-			drivers_suspend();
 			if(drivers_suspend()==0)
 				do_magic(0);			/* This function returns after machine woken up from resume */
 			PRINTR("Restarting processes...\n");
diff --git a/mm/pdflush.c b/mm/pdflush.c
index 44d292959a19..320559998a3b 100644
--- a/mm/pdflush.c
+++ b/mm/pdflush.c
@@ -108,16 +108,16 @@ static int __pdflush(struct pdflush_work *my_work)
 	for ( ; ; ) {
 		struct pdflush_work *pdf;
 
-#ifdef CONFIG_SOFTWARE_SUSPEND
-		run_task_queue(&tq_bdflush);
-#endif
 		list_add(&my_work->list, &pdflush_list);
 		my_work->when_i_went_to_sleep = jiffies;
 		set_current_state(TASK_INTERRUPTIBLE);
 		spin_unlock_irq(&pdflush_lock);
 
+#ifdef CONFIG_SOFTWARE_SUSPEND
+		run_task_queue(&tq_bdflush);
 		if (current->flags & PF_FREEZE)
 			refrigerator(PF_IOTHREAD);
+#endif
 		schedule();
 
 		preempt_enable();
-- 
2.30.9