From a7110486d048fa379f33ae4e0ba94b5ef3560489 Mon Sep 17 00:00:00 2001 From: Zhang Huan Date: Tue, 26 Mar 2019 10:08:00 +0800 Subject: glusterd: fix potential locking issue on peer probe There are two cases to restart brick, one is when glusterd starts or quorum is met, another is when new peers are joined and quorum is changes. In the later case, sync_lock is not taken, and may cause lock corruption. Change-Id: I0844e7a631350f5ee00bdacb613602bffffcdf9f fixes: bz#1692612 Signed-off-by: Zhang Huan --- xlators/mgmt/glusterd/src/glusterd-utils.c | 6 ++++-- xlators/mgmt/glusterd/src/glusterd.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 63cbaa16c1f..e95bf9665c9 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -3546,8 +3546,8 @@ glusterd_spawn_daemons(void *opaque) glusterd_conf_t *conf = THIS->private; int ret = -1; - synclock_lock(&conf->big_lock); - glusterd_restart_bricks(); + /* glusterd_restart_brick() will take the sync_lock. */ + glusterd_restart_bricks(NULL); glusterd_restart_gsyncds(conf); glusterd_restart_rebalance(conf); ret = glusterd_snapdsvc_restart(); @@ -6275,6 +6275,8 @@ glusterd_restart_bricks(void *opaque) conf = this->private; GF_VALIDATE_OR_GOTO(this->name, conf, return_block); + synclock_lock(&conf->big_lock); + /* We need to ensure that restarting the bricks during glusterd restart * shouldn't race with the import volume thread (refer * glusterd_compare_friend_data ()) diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 67867f86913..0a2fffdbe63 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -1230,7 +1230,7 @@ glusterd_add_volume_detail_to_dict(glusterd_volinfo_t *volinfo, dict_t *volumes, int count); int -glusterd_restart_bricks(); +glusterd_restart_bricks(void *opaque); int32_t glusterd_volume_txn(rpcsvc_request_t *req, char *volname, int flags, -- cgit