aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.am2
-rw-r--r--lib/fuse.c14
-rw-r--r--lib/fuse_lowlevel.c8
-rw-r--r--lib/fuse_misc.h8
-rw-r--r--lib/fuse_mt.c3
-rw-r--r--lib/fuse_opt.c19
-rw-r--r--lib/fuse_session.c3
-rw-r--r--lib/fuse_versionscript1
-rw-r--r--lib/helper.c19
-rw-r--r--lib/mount.c9
-rw-r--r--lib/mount_bsd.c3
11 files changed, 61 insertions, 28 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am
index cf84847..4d14ef4 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -34,7 +34,7 @@ libfuse_la_SOURCES = \
$(iconv_source) \
$(mount_source)
-libfuse_la_LDFLAGS = @libfuse_libs@ -version-number 2:7:1 \
+libfuse_la_LDFLAGS = @libfuse_libs@ -version-number 2:7:2 \
-Wl,--version-script,$(srcdir)/fuse_versionscript
libulockmgr_la_SOURCES = ulockmgr.c
diff --git a/lib/fuse.c b/lib/fuse.c
index 80bfe60..d22e200 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -3290,12 +3290,12 @@ struct fuse *fuse_new_compat1(int fd, int flags,
sizeof(struct fuse_operations_compat1), 11);
}
-__asm__(".symver fuse_exited,__fuse_exited@");
-__asm__(".symver fuse_process_cmd,__fuse_process_cmd@");
-__asm__(".symver fuse_read_cmd,__fuse_read_cmd@");
-__asm__(".symver fuse_set_getcontext_func,__fuse_set_getcontext_func@");
-__asm__(".symver fuse_new_compat2,fuse_new@");
-__asm__(".symver fuse_new_compat22,fuse_new@FUSE_2.2");
+FUSE_SYMVER(".symver fuse_exited,__fuse_exited@");
+FUSE_SYMVER(".symver fuse_process_cmd,__fuse_process_cmd@");
+FUSE_SYMVER(".symver fuse_read_cmd,__fuse_read_cmd@");
+FUSE_SYMVER(".symver fuse_set_getcontext_func,__fuse_set_getcontext_func@");
+FUSE_SYMVER(".symver fuse_new_compat2,fuse_new@");
+FUSE_SYMVER(".symver fuse_new_compat22,fuse_new@FUSE_2.2");
#endif /* __FreeBSD__ */
@@ -3307,4 +3307,4 @@ struct fuse *fuse_new_compat25(int fd, struct fuse_args *args,
op_size, 25);
}
-__asm__(".symver fuse_new_compat25,fuse_new@FUSE_2.5");
+FUSE_SYMVER(".symver fuse_new_compat25,fuse_new@FUSE_2.5");
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 64e2aba..d39a4a1 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -1409,9 +1409,9 @@ int fuse_sync_compat_args(struct fuse_args *args)
return 0;
}
-__asm__(".symver fuse_reply_statfs_compat,fuse_reply_statfs@FUSE_2.4");
-__asm__(".symver fuse_reply_open_compat,fuse_reply_open@FUSE_2.4");
-__asm__(".symver fuse_lowlevel_new_compat,fuse_lowlevel_new@FUSE_2.4");
+FUSE_SYMVER(".symver fuse_reply_statfs_compat,fuse_reply_statfs@FUSE_2.4");
+FUSE_SYMVER(".symver fuse_reply_open_compat,fuse_reply_open@FUSE_2.4");
+FUSE_SYMVER(".symver fuse_lowlevel_new_compat,fuse_lowlevel_new@FUSE_2.4");
#else /* __FreeBSD__ */
@@ -1435,4 +1435,4 @@ struct fuse_session *fuse_lowlevel_new_compat25(struct fuse_args *args,
op_size, userdata);
}
-__asm__(".symver fuse_lowlevel_new_compat25,fuse_lowlevel_new@FUSE_2.5");
+FUSE_SYMVER(".symver fuse_lowlevel_new_compat25,fuse_lowlevel_new@FUSE_2.5");
diff --git a/lib/fuse_misc.h b/lib/fuse_misc.h
index 99e5117..4f5236a 100644
--- a/lib/fuse_misc.h
+++ b/lib/fuse_misc.h
@@ -9,9 +9,17 @@
#include "config.h"
#include <pthread.h>
+/* Versioned symbols confuse the dynamic linker in uClibc */
+#ifndef __UCLIBC__
+#define FUSE_SYMVER(x) __asm__(x)
+#else
+#define FUSE_SYMVER(x)
+#endif
+
#ifndef USE_UCLIBC
#define fuse_mutex_init(mut) pthread_mutex_init(mut, NULL)
#else
+/* Is this hack still needed? */
static inline void fuse_mutex_init(pthread_mutex_t *mut)
{
pthread_mutexattr_t attr;
diff --git a/lib/fuse_mt.c b/lib/fuse_mt.c
index 2c1ff2c..cbdc1a3 100644
--- a/lib/fuse_mt.c
+++ b/lib/fuse_mt.c
@@ -7,6 +7,7 @@
*/
#include "fuse_i.h"
+#include "fuse_misc.h"
#include "fuse_lowlevel.h"
#include <stdio.h>
@@ -112,4 +113,4 @@ int fuse_loop_mt(struct fuse *f)
return fuse_session_loop_mt(fuse_get_session(f));
}
-__asm__(".symver fuse_loop_mt_proc,__fuse_loop_mt@");
+FUSE_SYMVER(".symver fuse_loop_mt_proc,__fuse_loop_mt@");
diff --git a/lib/fuse_opt.c b/lib/fuse_opt.c
index 1c6a315..d10e624 100644
--- a/lib/fuse_opt.c
+++ b/lib/fuse_opt.c
@@ -7,6 +7,7 @@
*/
#include "fuse_opt.h"
+#include "fuse_misc.h"
#include <stdio.h>
#include <stdlib.h>
@@ -65,7 +66,8 @@ int fuse_opt_add_arg(struct fuse_args *args, const char *arg)
return 0;
}
-int fuse_opt_insert_arg(struct fuse_args *args, int pos, const char *arg)
+static int fuse_opt_insert_arg_common(struct fuse_args *args, int pos,
+ const char *arg)
{
assert(pos <= args->argc);
if (fuse_opt_add_arg(args, arg) == -1)
@@ -80,6 +82,18 @@ int fuse_opt_insert_arg(struct fuse_args *args, int pos, const char *arg)
return 0;
}
+int fuse_opt_insert_arg(struct fuse_args *args, int pos, const char *arg)
+{
+ return fuse_opt_insert_arg_common(args, pos, arg);
+}
+
+int fuse_opt_insert_arg_compat(struct fuse_args *args, int pos,
+ const char *arg);
+int fuse_opt_insert_arg_compat(struct fuse_args *args, int pos, const char *arg)
+{
+ return fuse_opt_insert_arg_common(args, pos, arg);
+}
+
static int next_arg(struct fuse_opt_context *ctx, const char *opt)
{
if (ctx->argctr + 1 >= ctx->argc) {
@@ -365,3 +379,6 @@ int fuse_opt_parse(struct fuse_args *args, void *data,
fuse_opt_free_args(&ctx.outargs);
return res;
}
+
+/* This symbol version was mistakenly added to the version script */
+FUSE_SYMVER(".symver fuse_opt_insert_arg_compat,fuse_opt_insert_arg@FUSE_2.5");
diff --git a/lib/fuse_session.c b/lib/fuse_session.c
index 33cc59e..cf2e20b 100644
--- a/lib/fuse_session.c
+++ b/lib/fuse_session.c
@@ -7,6 +7,7 @@
*/
#include "fuse_lowlevel.h"
+#include "fuse_misc.h"
#include "fuse_common_compat.h"
#include "fuse_lowlevel_compat.h"
@@ -204,5 +205,5 @@ void fuse_chan_destroy(struct fuse_chan *ch)
}
#ifndef __FreeBSD__
-__asm__(".symver fuse_chan_new_compat24,fuse_chan_new@FUSE_2.4");
+FUSE_SYMVER(".symver fuse_chan_new_compat24,fuse_chan_new@FUSE_2.4");
#endif
diff --git a/lib/fuse_versionscript b/lib/fuse_versionscript
index 9d6642a..3eedd0c 100644
--- a/lib/fuse_versionscript
+++ b/lib/fuse_versionscript
@@ -67,7 +67,6 @@ FUSE_2.5 {
fuse_opt_add_opt;
fuse_opt_add_arg;
fuse_opt_free_args;
- fuse_opt_insert_arg;
fuse_opt_match;
fuse_parse_cmdline;
fuse_remove_signal_handlers;
diff --git a/lib/helper.c b/lib/helper.c
index e79f4b0..fbbf4b2 100644
--- a/lib/helper.c
+++ b/lib/helper.c
@@ -8,6 +8,7 @@
#include "config.h"
#include "fuse_i.h"
+#include "fuse_misc.h"
#include "fuse_opt.h"
#include "fuse_lowlevel.h"
#include "fuse_common_compat.h"
@@ -402,11 +403,11 @@ int fuse_mount_compat1(const char *mountpoint, const char *args[])
return fuse_mount_compat22(mountpoint, NULL);
}
-__asm__(".symver fuse_setup_compat2,__fuse_setup@");
-__asm__(".symver fuse_setup_compat22,fuse_setup@FUSE_2.2");
-__asm__(".symver fuse_teardown,__fuse_teardown@");
-__asm__(".symver fuse_main_compat2,fuse_main@");
-__asm__(".symver fuse_main_real_compat22,fuse_main_real@FUSE_2.2");
+FUSE_SYMVER(".symver fuse_setup_compat2,__fuse_setup@");
+FUSE_SYMVER(".symver fuse_setup_compat22,fuse_setup@FUSE_2.2");
+FUSE_SYMVER(".symver fuse_teardown,__fuse_teardown@");
+FUSE_SYMVER(".symver fuse_main_compat2,fuse_main@");
+FUSE_SYMVER(".symver fuse_main_real_compat22,fuse_main_real@FUSE_2.2");
#endif /* __FreeBSD__ */
@@ -439,7 +440,7 @@ int fuse_mount_compat25(const char *mountpoint, struct fuse_args *args)
return fuse_kern_mount(mountpoint, args);
}
-__asm__(".symver fuse_setup_compat25,fuse_setup@FUSE_2.5");
-__asm__(".symver fuse_teardown_compat22,fuse_teardown@FUSE_2.2");
-__asm__(".symver fuse_main_real_compat25,fuse_main_real@FUSE_2.5");
-__asm__(".symver fuse_mount_compat25,fuse_mount@FUSE_2.5");
+FUSE_SYMVER(".symver fuse_setup_compat25,fuse_setup@FUSE_2.5");
+FUSE_SYMVER(".symver fuse_teardown_compat22,fuse_teardown@FUSE_2.2");
+FUSE_SYMVER(".symver fuse_main_real_compat25,fuse_main_real@FUSE_2.5");
+FUSE_SYMVER(".symver fuse_mount_compat25,fuse_mount@FUSE_2.5");
diff --git a/lib/mount.c b/lib/mount.c
index e0fea56..8a5c5ab 100644
--- a/lib/mount.c
+++ b/lib/mount.c
@@ -8,6 +8,7 @@
#include "config.h"
#include "fuse_i.h"
+#include "fuse_misc.h"
#include "fuse_opt.h"
#include "fuse_common_compat.h"
#include "mount_util.h"
@@ -283,6 +284,10 @@ void fuse_kern_unmount(const char *mountpoint, int fd)
then the filesystem is already unmounted */
if (res == 1 && (pfd.revents & POLLERR))
return;
+
+ /* Need to close file descriptor, otherwise synchronous umount
+ would recurse into filesystem, and deadlock */
+ close(fd);
}
if (geteuid() == 0) {
@@ -579,5 +584,5 @@ int fuse_kern_mount(const char *mountpoint, struct fuse_args *args)
return res;
}
-__asm__(".symver fuse_mount_compat22,fuse_mount@FUSE_2.2");
-__asm__(".symver fuse_unmount_compat22,fuse_unmount@FUSE_2.2");
+FUSE_SYMVER(".symver fuse_mount_compat22,fuse_mount@FUSE_2.2");
+FUSE_SYMVER(".symver fuse_unmount_compat22,fuse_unmount@FUSE_2.2");
diff --git a/lib/mount_bsd.c b/lib/mount_bsd.c
index 1c4030d..5197464 100644
--- a/lib/mount_bsd.c
+++ b/lib/mount_bsd.c
@@ -7,6 +7,7 @@
*/
#include "fuse_i.h"
+#include "fuse_misc.h"
#include "fuse_opt.h"
#include <sys/stat.h>
@@ -360,4 +361,4 @@ int fuse_kern_mount(const char *mountpoint, struct fuse_args *args)
return res;
}
-__asm__(".symver fuse_unmount_compat22,fuse_unmount@FUSE_2.2");
+FUSE_SYMVER(".symver fuse_unmount_compat22,fuse_unmount@FUSE_2.2");