Skip to content

Commit

Permalink
freezer: do not sync filesystems from freeze_processes
Browse files Browse the repository at this point in the history
The syncing of filesystems from within the freezer is generally not needed.
Also, if there's an ext3 filesystem loopback-mounted from a FUSE one, the
syncing results in writes to it and deadlocks.  Similarly, it will deadlock if
FUSE implements sync.

Change freeze_processes() so that it doesn't execute sys_sync() and make the
suspend and hibernation code path sync filesystems independently of the
freezer.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Pavel Machek <pavel@ucw.cz>
Cc: Nigel Cunningham <nigel@nigel.suspend2.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Rafael J. Wysocki authored and Linus Torvalds committed Oct 18, 2007
1 parent 2776365 commit 232b143
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 1 deletion.
4 changes: 4 additions & 0 deletions kernel/power/disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,10 @@ int hibernate(void)
if (error)
goto Exit;

printk("Syncing filesystems ... ");
sys_sync();
printk("done.\n");

error = prepare_processes();
if (error)
goto Finish;
Expand Down
6 changes: 6 additions & 0 deletions kernel/power/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <linux/resume-trace.h>
#include <linux/freezer.h>
#include <linux/vmstat.h>
#include <linux/syscalls.h>

#include "power.h"

Expand Down Expand Up @@ -230,9 +231,14 @@ static int enter_state(suspend_state_t state)

if (!valid_state(state))
return -ENODEV;

if (!mutex_trylock(&pm_mutex))
return -EBUSY;

printk("Syncing filesystems ... ");
sys_sync();
printk("done.\n");

pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]);
if ((error = suspend_prepare()))
goto Unlock;
Expand Down
1 change: 0 additions & 1 deletion kernel/power/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,6 @@ int freeze_processes(void)
if (error)
return error;

sys_sync();
error = try_to_freeze_tasks(FREEZER_KERNEL_THREADS);
if (error)
return error;
Expand Down
4 changes: 4 additions & 0 deletions kernel/power/user.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
mutex_lock(&pm_mutex);
error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE);
if (!error) {
printk("Syncing filesystems ... ");
sys_sync();
printk("done.\n");

error = freeze_processes();
if (error)
thaw_processes();
Expand Down

0 comments on commit 232b143

Please sign in to comment.