aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/dev.c')
-rw-r--r--kernel/dev.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/kernel/dev.c b/kernel/dev.c
index 4395736..1bff1eb 100644
--- a/kernel/dev.c
+++ b/kernel/dev.c
@@ -246,15 +246,17 @@ static ssize_t fuse_dev_read(struct file *file, char *buf, size_t nbytes,
ret = copy_in_args(req->in, buf, nbytes);
spin_lock(&fuse_lock);
- if(req->issync || ret < 0) {
- if(ret < 0)
- list_add_tail(&req->list, &fc->pending);
+ if(req->issync) {
+ if(ret < 0) {
+ req->out->h.error = -EPROTO;
+ req->finished = 1;
+ }
else {
list_add_tail(&req->list, &fc->processing);
req->sent = 1;
}
req->locked = 0;
- if(req->interrupted)
+ if(ret < 0 || req->interrupted)
wake_up(&req->waitq);
req = NULL;
@@ -395,16 +397,15 @@ static ssize_t fuse_dev_write(struct file *file, const char *buf,
spin_lock(&fuse_lock);
if(err)
- list_add_tail(&fc->processing, &req->list);
+ req->out->h.error = -EPROTO;
else {
/* fget() needs to be done in this context */
if(req->in->h.opcode == FUSE_GETDIR && !oh.error)
process_getdir(req);
- req->finished = 1;
}
+ req->finished = 1;
req->locked = 0;
- if(!err || req->interrupted)
- wake_up(&req->waitq);
+ wake_up(&req->waitq);
spin_unlock(&fuse_lock);
if(!err)
@@ -473,6 +474,7 @@ static void end_requests(struct fuse_conn *fc, struct list_head *head)
list_del_init(&req->list);
if(req->issync) {
req->out->h.error = -ECONNABORTED;
+ req->finished = 1;
wake_up(&req->waitq);
}
else