From 43ade7abac6c1d648ef337ace92194d36c8894a4 Mon Sep 17 00:00:00 2001 From: Mohammed Rafi KC Date: Tue, 21 May 2019 17:15:07 +0530 Subject: ec/fini: Fix race with ec_fini and ec_notify During a graph cleanup, we first sent a PARENT_DOWN and wait for a child down to ultimately free the xlator and the graph. In the ec xlator, we cleanup the threads when we get a PARENT_DOWN event. But a racing event like CHILD_UP or event xl_op may trigger healing threads after threads cleanup. So there is a chance that the threads might access a freed private variabe Change-Id: I252d10181bb67b95900c903d479de707a8489532 fixes: bz#1703948 Signed-off-by: Mohammed Rafi KC --- libglusterfs/src/glusterfs/xlator.h | 3 +++ libglusterfs/src/libglusterfs.sym | 1 + libglusterfs/src/xlator.c | 21 +++++++++++++++++++++ 3 files changed, 25 insertions(+) (limited to 'libglusterfs') diff --git a/libglusterfs/src/glusterfs/xlator.h b/libglusterfs/src/glusterfs/xlator.h index b7d0249c9c8..1a0ed99774b 100644 --- a/libglusterfs/src/glusterfs/xlator.h +++ b/libglusterfs/src/glusterfs/xlator.h @@ -1092,4 +1092,7 @@ gluster_graph_take_reference(xlator_t *tree); gf_boolean_t mgmt_is_multiplexed_daemon(char *name); + +gf_boolean_t +xlator_is_cleanup_starting(xlator_t *this); #endif /* _XLATOR_H */ diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym index 1955005a88f..93ab05f166a 100644 --- a/libglusterfs/src/libglusterfs.sym +++ b/libglusterfs/src/libglusterfs.sym @@ -1164,3 +1164,4 @@ glusterfs_process_svc_attach_volfp glusterfs_mux_volfile_reconfigure glusterfs_process_svc_detach mgmt_is_multiplexed_daemon +xlator_is_cleanup_starting diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index 292416ae449..526cd2e2e4d 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -1508,3 +1508,24 @@ mgmt_is_multiplexed_daemon(char *name) } return _gf_false; } + +gf_boolean_t +xlator_is_cleanup_starting(xlator_t *this) +{ + gf_boolean_t cleanup = _gf_false; + glusterfs_graph_t *graph = NULL; + xlator_t *xl = NULL; + + if (!this) + goto out; + graph = this->graph; + + if (!graph) + goto out; + + xl = graph->first; + if (xl && xl->cleanup_starting) + cleanup = _gf_true; +out: + return cleanup; +} -- cgit