diff options
| author | Rajesh Joseph <rjoseph@redhat.com> | 2017-01-05 23:58:21 +0530 | 
|---|---|---|
| committer | Raghavendra G <rgowdapp@redhat.com> | 2017-02-06 06:13:46 -0500 | 
| commit | b3188c61d248526a070b1b18df1ea1d181b349d6 (patch) | |
| tree | 47471fadb274430f9c7bfc0b848e26ac5bd5e459 | |
| parent | ddf05f3d1e39cc920251c809e9ba42fe42b2c5f2 (diff) | |
socket: GF_REF_PUT should be called outside lock
GF_REF_PUT was called inside lock which can call
socket_poller_mayday which inturn tries to take the
same lock. This can lead to deadlock scenario.
BUG: 1410701
Change-Id: Ib3b161bcfeac810bd3593dc04c10ef984f996b17
Signed-off-by: Rajesh Joseph <rjoseph@redhat.com>
Reviewed-on: https://review.gluster.org/16343
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
| -rw-r--r-- | rpc/rpc-transport/socket/src/socket.c | 6 | 
1 files changed, 4 insertions, 2 deletions
diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c index 990571289c1..09020aa68ae 100644 --- a/rpc/rpc-transport/socket/src/socket.c +++ b/rpc/rpc-transport/socket/src/socket.c @@ -2427,7 +2427,6 @@ socket_poller (void *ctx)           * conditionally           */          THIS = this->xl; -        GF_REF_GET (priv);          if (priv->ot_state == OT_PLEASE_DIE) {                  gf_log (this->name, GF_LOG_DEBUG, "socket_poller is exiting " @@ -2620,6 +2619,8 @@ socket_spawn (rpc_transport_t *this)          gf_log (this->name, GF_LOG_TRACE,                  "spawning %p with gen %u", this, priv->ot_gen); +        GF_REF_GET (priv); +          /* Create thread after enable detach flag */          ret = gf_thread_create_detached (&priv->thread, socket_poller, this); @@ -2877,9 +2878,10 @@ socket_disconnect (rpc_transport_t *this, gf_boolean_t wait)          priv = this->private;          if (wait && priv->own_thread) { +                GF_REF_PUT (priv); +                  pthread_mutex_lock (&priv->cond_lock);                  { -                        GF_REF_PUT (priv);                          /* Change the state to OT_PLEASE_DIE so that                           * socket_poller can exit. */                          priv->ot_state = OT_PLEASE_DIE;  | 
