From 8509b4e94e4066dfc7759460ddc9e87ba91ef5ae Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Tue, 14 Sep 2004 07:13:06 +0000 Subject: [PATCH] fix --- ChangeLog | 10 ++++++++++ kernel/dev.c | 4 +++- lib/fuse.c | 29 ++++++++++++++++++----------- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 29ab0c5..af9269f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2004-09-14 Miklos Szeredi + + * Check temporary file creation failure in do_getdir(). Bug + spotted by Terje Oseberg + +2004-09-13 Miklos Szeredi + + * Make requests non-interruptible so race with FORGET is avoided. + This is only a temporary solution + 2004-09-09 Miklos Szeredi * Fix bug in case two FORGETs for the same node are executed in diff --git a/kernel/dev.c b/kernel/dev.c index 7f6900b..f020f34 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -156,7 +156,9 @@ void __request_send(struct fuse_conn *fc, struct fuse_in *in, void request_send(struct fuse_conn *fc, struct fuse_in *in, struct fuse_out *out) { - __request_send(fc, in, out, 1); + /* There are problems with interrupted requests so it's + disabled for now */ + __request_send(fc, in, out, 0); } void request_send_nonint(struct fuse_conn *fc, struct fuse_in *in, diff --git a/lib/fuse.c b/lib/fuse.c index e954519..dc56b21 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -589,20 +589,27 @@ static void do_getdir(struct fuse *f, struct fuse_in_header *in) dh.fuse = f; dh.fp = tmpfile(); dh.dir = in->ino; - res = -ENOENT; - path = get_path(f, in->ino); - if(path != NULL) { - res = -ENOSYS; - if(f->op.getdir) - res = f->op.getdir(path, &dh, (fuse_dirfil_t) fill_dir); - free(path); + res = -EIO; + + if (dh.fp == NULL) + perror("fuse: failed to create temporary file"); + else { + res = -ENOENT; + path = get_path(f, in->ino); + if(path != NULL) { + res = -ENOSYS; + if(f->op.getdir) + res = f->op.getdir(path, &dh, (fuse_dirfil_t) fill_dir); + free(path); + } + fflush(dh.fp); } - fflush(dh.fp); - memset(&arg, 0, sizeof(struct fuse_getdir_out)); - arg.fd = fileno(dh.fp); + if (res == 0) + arg.fd = fileno(dh.fp); send_reply(f, in, res, &arg, sizeof(arg)); - fclose(dh.fp); + if (dh.fp != NULL) + fclose(dh.fp); } static void do_mknod(struct fuse *f, struct fuse_in_header *in, -- 2.30.2