From 37fb19c74ffed25e2dbb0ec3f84c560ff69e5fad Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Fri, 22 Jun 2007 20:41:26 +0000 Subject: lib: fix locking when loading a filesystem module --- ChangeLog | 4 ++++ include/fuse.h | 8 ++++---- lib/fuse.c | 8 +++----- lib/mount.c | 10 +++++----- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index e50aac3..0e60823 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2007-06-22 Miklos Szeredi + + * lib: fix locking when loading a filesystem module + 2007-06-21 Miklos Szeredi * Add fs subtype support to mount.fuse diff --git a/include/fuse.h b/include/fuse.h index 19b38b3..dc0975a 100644 --- a/include/fuse.h +++ b/include/fuse.h @@ -97,9 +97,9 @@ struct fuse_operations { /** Create a file node * - * If the filesystem doesn't define a create() operation, mknod() - * will be called for creation of all non-directory, non-symlink - * nodes. + * This is called for creation of all non-directory, non-symlink + * nodes. If the filesystem defines a create() method, then for + * regular files that will be called instead. */ int (*mknod) (const char *, mode_t, dev_t); @@ -722,7 +722,7 @@ void fuse_register_module(struct fuse_module *mod); #define FUSE_REGISTER_MODULE(name_, factory_) \ static __attribute__((constructor)) void name_ ## _register(void) \ { \ - static struct fuse_module mod = { .name = #name_, .factory = factory_ }; \ + static struct fuse_module mod = { #name_, factory_, NULL, NULL, 0 }; \ fuse_register_module(&mod); \ } diff --git a/lib/fuse.c b/lib/fuse.c index d756cf0..69fd737 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -161,11 +161,9 @@ static int fuse_load_so_name(const char *soname) return -1; } - pthread_mutex_lock(&fuse_context_lock); fuse_current_so = so; so->handle = dlopen(soname, RTLD_NOW); fuse_current_so = NULL; - pthread_mutex_unlock(&fuse_context_lock); if (!so->handle) { fprintf(stderr, "fuse: %s\n", dlerror()); goto err; @@ -191,9 +189,7 @@ static int fuse_load_so_module(const char *module) fprintf(stderr, "fuse: memory allocation failed\n"); return -1; } - if (soname) - sprintf(soname, "libfusemod_%s.so", module); - + sprintf(soname, "libfusemod_%s.so", module); res = fuse_load_so_name(soname); free(soname); return res; @@ -3157,6 +3153,7 @@ struct fuse *fuse_new_common(struct fuse_chan *ch, struct fuse_args *args, called on the filesystem without init being called first */ fs->op.destroy = NULL; fuse_fs_destroy(f->fs); + free(f->conf.modules); out_free: free(f); out_delete_context_key: @@ -3213,6 +3210,7 @@ void fuse_destroy(struct fuse *f) pthread_mutex_destroy(&f->lock); pthread_rwlock_destroy(&f->tree_lock); fuse_session_destroy(f->se); + free(f->conf.modules); free(f); fuse_delete_context_key(); } diff --git a/lib/mount.c b/lib/mount.c index aa0c0cb..8c2b048 100644 --- a/lib/mount.c +++ b/lib/mount.c @@ -392,6 +392,11 @@ static int fuse_mount_sys(const char *mnt, struct mount_opts *mo, int fd; int res; + if (!mnt) { + fprintf(stderr, "fuse: missing mountpoint\n"); + return -1; + } + res = lstat(mnt, &stbuf); if (res == -1) { fprintf(stderr ,"fuse: failed to access mountpoint %s: %s\n", @@ -516,11 +521,6 @@ int fuse_kern_mount(const char *mountpoint, struct fuse_args *args) int res = -1; char *mnt_opts = NULL; - if (!mountpoint) { - fprintf(stderr, "fuse: missing mountpoint\n"); - return -1; - } - memset(&mo, 0, sizeof(mo)); mo.flags = MS_NOSUID | MS_NODEV; -- cgit v1.2.3