aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorGravatar Miklos Szeredi <miklos@szeredi.hu>2001-11-19 17:55:51 +0000
committerGravatar Miklos Szeredi <miklos@szeredi.hu>2001-11-19 17:55:51 +0000
commit33232032423dcc06716537204f1995afa5a73940 (patch)
tree2d4a744ada69ab97a0a8bcf8ecfd729a8fc1199f /kernel
parentbcb291798ed06af8a18a5bf76aa3c9591a6886de (diff)
multithreading improvements
Diffstat (limited to 'kernel')
-rw-r--r--kernel/Makefile.am9
-rw-r--r--kernel/dev.c18
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