summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libglusterfs/src/options.c2
-rw-r--r--libglusterfs/src/xlator.c17
-rw-r--r--libglusterfs/src/xlator.h3
3 files changed, 22 insertions, 0 deletions
diff --git a/libglusterfs/src/options.c b/libglusterfs/src/options.c
index 53bd779861c..a28f3b7ea4f 100644
--- a/libglusterfs/src/options.c
+++ b/libglusterfs/src/options.c
@@ -1107,7 +1107,9 @@ xlator_reconfigure_rec (xlator_t *old_xl, xlator_t *new_xl)
old_THIS = THIS;
THIS = old_xl;
+ xlator_init_lock ();
ret = old_xl->reconfigure (old_xl, new_xl->options);
+ xlator_init_unlock ();
THIS = old_THIS;
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index 3c1cde50fa0..2edebc0aec2 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -25,6 +25,21 @@
xl->cbks->fn = default_##fn; \
} while (0)
+pthread_mutex_t xlator_init_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+void
+xlator_init_lock (void)
+{
+ (void) pthread_mutex_lock (&xlator_init_mutex);
+}
+
+
+void
+xlator_init_unlock (void)
+{
+ (void) pthread_mutex_unlock (&xlator_init_mutex);
+}
+
static void
fill_defaults (xlator_t *xl)
@@ -400,7 +415,9 @@ __xlator_init(xlator_t *xl)
old_THIS = THIS;
THIS = xl;
+ xlator_init_lock ();
ret = xl->init (xl);
+ xlator_init_unlock ();
THIS = old_THIS;
diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
index b11d1a96f32..e28790cc034 100644
--- a/libglusterfs/src/xlator.h
+++ b/libglusterfs/src/xlator.h
@@ -1048,4 +1048,7 @@ glusterfs_reachable_leaves(xlator_t *base, dict_t *leaves);
int
xlator_subvolume_count (xlator_t *this);
+void xlator_init_lock (void);
+void xlator_init_unlock (void);
+
#endif /* _XLATOR_H */