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