summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShehjar Tikoo <shehjart@gluster.com>2009-06-26 13:05:00 +0000
committerAnand V. Avati <avati@dev.gluster.com>2009-06-30 15:24:53 -0700
commite4a4d04a691a27c1e52e8e0f78458fb4ebf00912 (patch)
treef61cd2ee7d6d165261daa64a747b71a696284dd5
parenta36094277df22295f49726c0fcc9a3cdeb1134db (diff)
libglusterfsclient: Fix glusterfs_mount-vmp search deadlock
It is possible that the only translator in the libglusterfsclient tree is the posix. In that case, inside gluster_init, the graph init routines will need to call lstat on the posix subdirectory. Since even the glusterfs stack is running over booster, those calls will also first require vmp searching. BUT, the vmp lock is the same as the mount lock that was already taken when we entered glusterfs_mount, so a deadlock occurs. Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
-rwxr-xr-xlibglusterfsclient/src/libglusterfsclient.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c
index 89a7dff8ac0..576fef7f1b6 100755
--- a/libglusterfsclient/src/libglusterfsclient.c
+++ b/libglusterfsclient/src/libglusterfsclient.c
@@ -73,7 +73,16 @@ struct {
int entries;
}vmplist;
-pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+
+/* Protects the VMP list above. */
+pthread_mutex_t vmplock = PTHREAD_MUTEX_INITIALIZER;
+
+/* Ensures only one thread is ever calling glusterfs_mount.
+ * Since that function internally calls routines which
+ * use the yacc parser code using global vars, this process
+ * needs to be syncronised.
+ */
+pthread_mutex_t mountlock = PTHREAD_MUTEX_INITIALIZER;
char *
libgf_vmp_virtual_path(struct vmp_entry *entry, const char *path)
@@ -1319,11 +1328,11 @@ libgf_vmp_search_entry (char *path)
if (!path)
goto out;
- pthread_mutex_lock (&lock);
+ pthread_mutex_lock (&vmplock);
{
entry = _libgf_vmp_search_entry (path);
}
- pthread_mutex_unlock (&lock);
+ pthread_mutex_unlock (&vmplock);
out:
if (entry)
@@ -1390,7 +1399,7 @@ glusterfs_mount (char *vmp, glusterfs_init_params_t *ipars)
if (!vmp_resolved)
goto out;
- pthread_mutex_lock (&lock);
+ pthread_mutex_lock (&mountlock);
{
vmp_entry = _libgf_vmp_search_entry (vmp);
if (vmp_entry) {
@@ -1410,7 +1419,7 @@ glusterfs_mount (char *vmp, glusterfs_init_params_t *ipars)
}
}
unlock:
- pthread_mutex_unlock (&lock);
+ pthread_mutex_unlock (&mountlock);
out:
if (vmp_resolved)
@@ -1454,11 +1463,11 @@ libgf_umount (char *vmp)
{
int ret = -1;
- pthread_mutex_lock (&lock);
+ pthread_mutex_lock (&vmplock);
{
ret = _libgf_umount (vmp);
}
- pthread_mutex_unlock (&lock);
+ pthread_mutex_unlock (&vmplock);
return ret;
}
@@ -1489,7 +1498,7 @@ glusterfs_umount_all (void)
{
struct vmp_entry *entry = NULL, *tmp = NULL;
- pthread_mutex_lock (&lock);
+ pthread_mutex_lock (&vmplock);
{
list_for_each_entry_safe (entry, tmp, &vmplist.list, list) {
/* even if there are errors, continue with other
@@ -1498,7 +1507,7 @@ glusterfs_umount_all (void)
_libgf_umount (entry->vmp);
}
}
- pthread_mutex_unlock (&lock);
+ pthread_mutex_unlock (&vmplock);
return 0;
}
@@ -1509,8 +1518,8 @@ glusterfs_reset (void)
INIT_LIST_HEAD (&vmplist.list);
vmplist.entries = 0;
- memset (&lock, 0, sizeof (lock));
- pthread_mutex_init (&lock, NULL);
+ memset (&vmplock, 0, sizeof (vmplock));
+ pthread_mutex_init (&vmplock, NULL);
first_fini = first_init = 1;
}