From 1619231c0313666282b4145db9e1c1ceb40d708f Mon Sep 17 00:00:00 2001 From: anand Date: Wed, 17 Jun 2015 16:11:48 +0530 Subject: [PATCH 211/212] glusterd: Removing sync lock and unlock inside rcu read critical section Issue : Glsuterd was crashing during peer probe. RCA : In glusterd, we are using big lock which is implemented based on sync task frame work for thread synchronization, sync task frame work swap the threads if there is no worker pool threads available. Due to this rcu lock and rcu unlock was happening in different threads (urcu-bp will not allow this), resulting into glusterd crash. fix : Removing sync lock and unlock inside rcu read critical section, which was left out by http://review.gluster.org/#/c/10285/ patch. Backport of: >Change-Id: Id358dfcc797335bcd3b491c3129017b2caa826eb >BUG: 1232693 >Signed-off-by: anand >Reviewed-on: http://review.gluster.org/11276 >Reviewed-by: Atin Mukherjee >Reviewed-by: Krishnan Parthasarathi >Tested-by: NetBSD Build System Change-Id: I8489d915b2f21442e49230e82096a12900d889ef BUG: 1231635 Signed-off-by: anand Reviewed-on: https://code.engineering.redhat.com/gerrit/52439 Reviewed-by: Atin Mukherjee Tested-by: Atin Mukherjee --- xlators/mgmt/glusterd/src/glusterd-rpc-ops.c | 3 +- xlators/mgmt/glusterd/src/glusterd-utils.c | 28 +++---------------------- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c index e380e43..0a144b9 100644 --- a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c @@ -1637,13 +1637,12 @@ glusterd_rpc_friend_remove (call_frame_t *frame, xlator_t *this, req.hostname = gf_strdup (peerinfo->hostname); req.port = peerinfo->port; - rcu_read_unlock (); - ret = glusterd_submit_request (peerinfo->rpc, &req, frame, peerinfo->peer, GLUSTERD_FRIEND_REMOVE, NULL, this, glusterd_friend_remove_cbk, (xdrproc_t)xdr_gd1_mgmt_friend_req); + rcu_read_unlock (); out: GF_FREE (req.hostname); diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 3bb72b1..7347fb2 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -241,11 +241,10 @@ glusterd_get_uuid (uuid_t *uuid) } int -glusterd_submit_request_unlocked (struct rpc_clnt *rpc, void *req, - call_frame_t *frame, rpc_clnt_prog_t *prog, - int procnum, struct iobref *iobref, - xlator_t *this, fop_cbk_fn_t cbkfn, - xdrproc_t xdrproc) +glusterd_submit_request (struct rpc_clnt *rpc, void *req, + call_frame_t *frame, rpc_clnt_prog_t *prog, + int procnum, struct iobref *iobref, + xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc) { char new_iobref = 0; int ret = -1; @@ -309,25 +308,6 @@ out: } -int -glusterd_submit_request (struct rpc_clnt *rpc, void *req, - call_frame_t *frame, rpc_clnt_prog_t *prog, - int procnum, struct iobref *iobref, - xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc) -{ - glusterd_conf_t *priv = THIS->private; - int ret = -1; - - synclock_unlock (&priv->big_lock); - { - ret = glusterd_submit_request_unlocked (rpc, req, frame, prog, - procnum, iobref, this, - cbkfn, xdrproc); - } - synclock_lock (&priv->big_lock); - - return ret; -} struct iobuf * -- 1.7.1