From fc5309cfd2b84b13279f5c512bd575b0a2322ae8 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Sat, 11 Nov 2006 09:55:55 +0000 Subject: [PATCH] fixes --- ChangeLog | 14 ++++++++++++++ include/fuse.h | 5 ++++- lib/fuse.c | 3 ++- lib/fuse_lowlevel.c | 7 +++++++ lib/helper.c | 8 ++++---- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5e0b300..24d143f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2006-11-11 Miklos Szeredi + + * Print an error if an incompatible kernel interface version is + detected in INIT. This will only show if filesystem is started + with -d or -f + + * Fix order of fuse_destroy()/fuse_unmount() in error cleanup of + fuse_setup_common(). Reported by Szakacsits Szabolcs + +2006-11-06 Miklos Szeredi + + * Fix recursive locking in fuse_create(). Thanks to Takuya + Ishibashi for the bug report + 2006-10-28 Miklos Szeredi * Fix automake problem. Patch from Nix diff --git a/include/fuse.h b/include/fuse.h index 6af2c4f..1531296 100644 --- a/include/fuse.h +++ b/include/fuse.h @@ -495,7 +495,10 @@ struct fuse *fuse_new(struct fuse_chan *ch, struct fuse_args *args, /** * Destroy the FUSE handle. * - * The filesystem is not unmounted. + * The communication channel attached to the handle is also destroyed. + * + * NOTE: This function does not unmount the filesystem. If this is + * needed, call fuse_unmount() before calling this function. * * @param f the FUSE handle */ diff --git a/lib/fuse.c b/lib/fuse.c index 6de98fa..4446245 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -1442,12 +1442,13 @@ static void fuse_create(fuse_req_t req, fuse_ino_t parent, const char *name, /* The open syscall was interrupted, so it must be cancelled */ if(f->op.release) fuse_do_release(f, req, path, fi); + pthread_mutex_unlock(&f->lock); forget_node(f, e.ino, 1); } else { struct node *node = get_node(f, e.ino); node->open_count ++; + pthread_mutex_unlock(&f->lock); } - pthread_mutex_unlock(&f->lock); } else reply_err(req, err); diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c index 05d99e1..98738e4 100644 --- a/lib/fuse_lowlevel.c +++ b/lib/fuse_lowlevel.c @@ -952,6 +952,13 @@ static void do_init(fuse_req_t req, fuse_ino_t nodeid, const void *inarg) f->conn.proto_major = arg->major; f->conn.proto_minor = arg->minor; + if (arg->major < 7) { + fprintf(stderr, "fuse: unsupported protocol version: %u.%u\n", + arg->major, arg->minor); + fuse_reply_err(req, EPROTO); + return; + } + if (arg->major > 7 || (arg->major == 7 && arg->minor >= 6)) { if (f->conn.async_read) f->conn.async_read = arg->flags & FUSE_ASYNC_READ; diff --git a/lib/helper.c b/lib/helper.c index b6925d4..63aefd5 100644 --- a/lib/helper.c +++ b/lib/helper.c @@ -255,21 +255,21 @@ static struct fuse *fuse_setup_common(int argc, char *argv[], res = fuse_daemonize(foreground); if (res == -1) - goto err_destroy; + goto err_unmount; res = fuse_set_signal_handlers(fuse_get_session(fuse)); if (res == -1) - goto err_destroy; + goto err_unmount; if (fd) *fd = fuse_chan_fd(ch); return fuse; - err_destroy: - fuse_destroy(fuse); err_unmount: fuse_unmount_common(*mountpoint, ch); + if (fuse) + fuse_destroy(fuse); err_free: free(*mountpoint); return NULL; -- 2.30.2