summaryrefslogtreecommitdiffstats
path: root/xlators/mount/fuse
diff options
context:
space:
mode:
authorNiels de Vos <ndevos@redhat.com>2014-12-04 15:40:52 +0100
committerNiels de Vos <ndevos@redhat.com>2014-12-12 06:26:02 -0800
commit09af313fe6b49b03501939dd9e46b783ca4b5416 (patch)
treebbf09664feeaa2dc5f3795e091e6f712c644e143 /xlators/mount/fuse
parent12c15f47fe68bcf8b32f55f3ca42638fd4eda998 (diff)
fuse: protect checking/modifying graph->used with a mutex
While reviewing http://review.gluster.org/#/c/9060/ we noticed that fuse checks/modifies graph->used in a unlocked way. There is a potential race in case when fuse_graph_setup() gets called from two different threads (currently unlikely, but poller/notify() might change in future?). In libgfapi we came to the conclusion that each glfs structure can be used to protect the checking/updating of graph->used. In fuse this would be the fuse_private_t with sync_mutex. BUG: 1170643 Change-Id: If5ab5468d22fdb92cfb24a469f538f63f12baf78 Signed-off-by: Niels de Vos <ndevos@redhat.com> Reviewed-on: http://review.gluster.org/9237 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'xlators/mount/fuse')
-rw-r--r--xlators/mount/fuse/src/fuse-bridge.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c
index 1404b148bd5..e61671829e1 100644
--- a/xlators/mount/fuse/src/fuse-bridge.c
+++ b/xlators/mount/fuse/src/fuse-bridge.c
@@ -5032,10 +5032,16 @@ fuse_graph_setup (xlator_t *this, glusterfs_graph_t *graph)
if (priv->active_subvol == graph->top)
return 0; /* This is a valid case */
- if (graph->used)
- return 0;
+ pthread_mutex_lock (&priv->sync_mutex);
+ {
+ if (graph->used) {
+ pthread_mutex_unlock (&priv->sync_mutex);
+ return 0;
+ }
- graph->used = 1;
+ graph->used = 1;
+ }
+ pthread_mutex_unlock (&priv->sync_mutex);
itable = inode_table_new (0, graph->top);
if (!itable)