Blob Blame History Raw
From 1619231c0313666282b4145db9e1c1ceb40d708f Mon Sep 17 00:00:00 2001
From: anand <anekkunt@redhat.com>
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 <anekkunt@redhat.com>
>Reviewed-on: http://review.gluster.org/11276
>Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
>Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
>Tested-by: NetBSD Build System <jenkins@build.gluster.org>

Change-Id: I8489d915b2f21442e49230e82096a12900d889ef
BUG: 1231635
Signed-off-by: anand <anekkunt@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/52439
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Tested-by: Atin Mukherjee <amukherj@redhat.com>
---
 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