aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTodd Poynor <toddpoynor@google.com>2011-08-24 15:01:30 -0700
committerTodd Poynor <toddpoynor@google.com>2011-08-24 17:02:43 -0700
commitb44e592cd883d16bb12e9d0fcd31fdb2b17d05c1 (patch)
tree116a9d452b2a84860514f39a9dd42277d200ec19 /fs
parent5cb5fb6fef3fd81b55ddc48010e1b520e8473553 (diff)
downloadkernel_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.c6
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)