diff options
author | Todd Poynor <toddpoynor@google.com> | 2011-08-24 15:01:30 -0700 |
---|---|---|
committer | Todd Poynor <toddpoynor@google.com> | 2011-08-24 17:02:43 -0700 |
commit | b44e592cd883d16bb12e9d0fcd31fdb2b17d05c1 (patch) | |
tree | 116a9d452b2a84860514f39a9dd42277d200ec19 /fs | |
parent | 5cb5fb6fef3fd81b55ddc48010e1b520e8473553 (diff) | |
download | kernel_samsung_aries-b44e592cd883d16bb12e9d0fcd31fdb2b17d05c1.zip kernel_samsung_aries-b44e592cd883d16bb12e9d0fcd31fdb2b17d05c1.tar.gz kernel_samsung_aries-b44e592cd883d16bb12e9d0fcd31fdb2b17d05c1.tar.bz2 |
fuse: Freeze client on suspend when request sent to userspace
Suspend attempts can abort when the FUSE daemon is already frozen
and a client is waiting uninterruptibly for a response, causing
freezing of tasks to fail.
Use the freeze-friendly wait API, but disregard other signals.
Change-Id: Icefb7e4bbc718ccb76bf3c04daaa5eeea7e0e63c
Signed-off-by: Todd Poynor <toddpoynor@google.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/fuse/dev.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 640fc22..99e1334 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -19,6 +19,7 @@ #include <linux/pipe_fs_i.h> #include <linux/swap.h> #include <linux/splice.h> +#include <linux/freezer.h> MODULE_ALIAS_MISCDEV(FUSE_MINOR); MODULE_ALIAS("devname:fuse"); @@ -383,7 +384,10 @@ __acquires(fc->lock) * Wait it out. */ spin_unlock(&fc->lock); - wait_event(req->waitq, req->state == FUSE_REQ_FINISHED); + + while (req->state != FUSE_REQ_FINISHED) + wait_event_freezable(req->waitq, + req->state == FUSE_REQ_FINISHED); spin_lock(&fc->lock); if (!req->aborted) |