aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Szeredi2006-01-16 22:14:25 -0800
committerLinus Torvalds2006-01-16 23:15:29 -0800
commit222f1d69183f10d70a37de5785698fe0aa363c12 (patch)
tree14eeb42423e9feb390a52ce2cf0453c346e92b98
parentf87fd4c2a0c4f3baad28057360b36a59591ef751 (diff)
[PATCH] fuse: fuse_copy_finish() order fix
fuse_copy_finish() must be called before request_end(), since the later might sleep, and no sleeping is allowed between fuse_copy_one() and fuse_copy_finish() because of kmap_atomic()/kunmap_atomic() used in them. Signed-off-by: Miklos Szeredi <miklos@szeredi.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--fs/fuse/dev.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index e08ab4702d97..9af88953db69 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -773,8 +773,10 @@ static ssize_t fuse_dev_writev(struct file *file, const struct iovec *iov,
list_del_init(&req->list);
if (req->interrupted) {
- request_end(fc, req);
+ spin_unlock(&fuse_lock);
fuse_copy_finish(&cs);
+ spin_lock(&fuse_lock);
+ request_end(fc, req);
return -ENOENT;
}
req->out.h = oh;