Package: fusedav
Version: 0.2-3
Severity: normal
Tags: upstream patch
I've noticed fusedav is getting stuck on futexes sometimes. While
eyeballing the code, I've found one possible source of deadlock on
stat_cache_mutex:
stat_cache_get() - locks stat_cache_mutex
file_cache_unref()
file_cache_sync_unlocked()
stat_cache_invalidate() -> locks stat_cache_mutex again
I'm testing with the attached patch, but I hope there can be
a better fix than using a recursive mutex.
-- System Information:
Debian Release: 6.0.6
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages fusedav depends on:
ii fuse-utils 2.8.4-1.1 Filesystem in USErspace (utilities
ii libc6 2.11.3-4 Embedded GNU C Library: Shared lib
ii libfuse2 2.8.4-1.1 Filesystem in USErspace library
ii libneon27-gnutls 0.29.3-3 An HTTP and WebDAV client library
fusedav recommends no packages.
fusedav suggests no packages.
-- no debconf information
diff --git a/src/statcache.c b/src/statcache.c
index d556f37..879d8a0 100644
--- a/src/statcache.c
+++ b/src/statcache.c
@@ -63,7 +63,7 @@ struct cache_entry {
};
static struct cache_entry *cache = NULL;
-static pthread_mutex_t stat_cache_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t stat_cache_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
static pthread_mutex_t dir_cache_mutex = PTHREAD_MUTEX_INITIALIZER;
static uint32_t calc_hash(const char *s) {