lib: fix locking when loading a filesystem module
diff --git a/ChangeLog b/ChangeLog
index e50aac3..0e60823 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2007-06-22  Miklos Szeredi <miklos@szeredi.hu>
+
+	* lib: fix locking when loading a filesystem module
+
 2007-06-21  Miklos Szeredi <miklos@szeredi.hu>
 
 	* 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 @@
 
     /** 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 @@
 #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 @@
         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 @@
         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 @@
        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 @@
     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 @@
     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 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;