diff options
| author | Mohit Agrawal <moagrawal@redhat.com> | 2020-04-09 13:08:23 +0530 | 
|---|---|---|
| committer | Xavi Hernandez <xhernandez@redhat.com> | 2020-04-15 08:00:49 +0000 | 
| commit | d0cb5cbaff22ec5fcb685a327d6d54e5ae8d87f2 (patch) | |
| tree | a1a8c773310a82f304621a768b047536db5d07e9 | |
| parent | 0407d10f147862eb1c7854aed3adfbc3e1503c5d (diff) | |
test: tests/bugs/rpc/bug-847624.t is crashed
Problem: glusterfs(GNFS) is crashing at the time of handling
         Pollerr event in rpcsvc_drc_client_unref.GNFS is crashed
         because ref was 0 at the time of unref and ref was taken
         while Pollin event successfully handled.
Solution: Convert drc_client ref to atomic ref to avoid the crash
Change-Id: Ia4c054f2f388032a5cd99597d0cfa18b003ca690
Fixes: #1038
Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
| -rw-r--r-- | rpc/rpc-lib/src/rpc-drc.c | 13 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/rpc-drc.h | 2 | 
2 files changed, 8 insertions, 7 deletions
diff --git a/rpc/rpc-lib/src/rpc-drc.c b/rpc/rpc-lib/src/rpc-drc.c index d083db24fc5..de8dc630626 100644 --- a/rpc/rpc-lib/src/rpc-drc.c +++ b/rpc/rpc-lib/src/rpc-drc.c @@ -190,7 +190,7 @@ rpcsvc_get_drc_client(rpcsvc_drc_globals_t *drc,      if (!client)          goto out; -    client->ref = 0; +    GF_ATOMIC_INIT(client->ref, 0);      client->sock_union = (union gf_sock_union) * sockaddr;      client->op_count = 0;      INIT_LIST_HEAD(&client->client_list); @@ -246,7 +246,7 @@ static drc_client_t *  rpcsvc_drc_client_ref(drc_client_t *client)  {      GF_ASSERT(client); -    client->ref++; +    GF_ATOMIC_INC(client->ref);      return client;  } @@ -261,11 +261,12 @@ rpcsvc_drc_client_ref(drc_client_t *client)  static drc_client_t *  rpcsvc_drc_client_unref(rpcsvc_drc_globals_t *drc, drc_client_t *client)  { +    uint32_t refcount; +      GF_ASSERT(drc); -    GF_ASSERT(client->ref); -    client->ref--; -    if (!client->ref) { +    refcount = GF_ATOMIC_DEC(client->ref); +    if (!refcount) {          drc->client_count--;          rpcsvc_remove_drc_client(client);          client = NULL; @@ -589,7 +590,7 @@ rpcsvc_drc_priv(rpcsvc_drc_globals_t *drc)          }          gf_proc_dump_build_key(key, "client", "%d.ref_count", i); -        gf_proc_dump_write(key, "%d", client->ref); +        gf_proc_dump_write(key, "%" PRIu32, GF_ATOMIC_GET(client->ref));          gf_proc_dump_build_key(key, "client", "%d.op_count", i);          gf_proc_dump_write(key, "%d", client->op_count);          i++; diff --git a/rpc/rpc-lib/src/rpc-drc.h b/rpc/rpc-lib/src/rpc-drc.h index 6aaede0828a..ce66430809b 100644 --- a/rpc/rpc-lib/src/rpc-drc.h +++ b/rpc/rpc-lib/src/rpc-drc.h @@ -24,7 +24,7 @@ struct drc_client {      struct rb_table *rbtree;      /* no. of ops currently cached */      uint32_t op_count; -    uint32_t ref; +    gf_atomic_uint32_t ref;      struct list_head client_list;  };  | 
