diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2001-11-19 17:55:51 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2001-11-19 17:55:51 +0000 |
commit | 33232032423dcc06716537204f1995afa5a73940 (patch) | |
tree | 2d4a744ada69ab97a0a8bcf8ecfd729a8fc1199f /kernel | |
parent | bcb291798ed06af8a18a5bf76aa3c9591a6886de (diff) |
multithreading improvements
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/Makefile.am | 9 | ||||
-rw-r--r-- | kernel/dev.c | 18 |
2 files changed, 18 insertions, 9 deletions
diff --git a/kernel/Makefile.am b/kernel/Makefile.am index 2ea0e3b..033c8cb 100644 --- a/kernel/Makefile.am +++ b/kernel/Makefile.am @@ -25,7 +25,6 @@ uninstall-local: clean-local: rm -f *.o *.s - .c.o: $(CC) $(CFLAGS) $(CPPFAGS) -c $< @@ -33,3 +32,11 @@ fuse_objs = dev.o dir.o file.o inode.o util.o fuse.o: $(fuse_objs) ld -r -o fuse.o $(fuse_objs) + +fuse_headers = fuse_i.h ../include/linux/fuse.h + +dev.o: $(fuse_headers) +dir.o: $(fuse_headers) +file.o: $(fuse_headers) +inode.o: $(fuse_headers) +util.o: $(fuse_headers) 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 |