e7a346
From aad829320132fb2399e8fd8edfa573561a7c03e1 Mon Sep 17 00:00:00 2001
e7a346
From: Mohit Agrawal <moagrawa@redhat.com>
e7a346
Date: Sun, 13 May 2018 12:01:01 +0530
e7a346
Subject: [PATCH 270/271] glusterfs: Resolve brick crashes at the time of
e7a346
 inode_unref
e7a346
e7a346
Problem: Sometimes brick process is getting crash at the time
e7a346
         of calling inode_unref in fd_destroy
e7a346
e7a346
Solution: Brick process is getting crash because inode is already
e7a346
          free by xlator_mem_cleanup call by server_rpc_notify.To
e7a346
          resolve the same move code specific to call transport_unref
e7a346
          in last in free_state.
e7a346
e7a346
> BUG: 1577574
e7a346
> Change-Id: Ia517c230d68af4e929b6b753e4c374a26c39dc1a
e7a346
> fixes: bz#1577574
e7a346
> (cherry picked from commit 8e2289b1e76ac777b71897dc709d9651341bd241)
e7a346
> (Upstream link for review https://review.gluster.org/#/c/20014/)
e7a346
e7a346
BUG: 1575840
e7a346
Change-Id: I62df8dd6f4df545250a977897697c960adba1c4c
e7a346
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
e7a346
Reviewed-on: https://code.engineering.redhat.com/gerrit/138797
e7a346
Tested-by: RHGS Build Bot <nigelb@redhat.com>
e7a346
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
e7a346
---
e7a346
 xlators/protocol/server/src/server-helpers.c | 15 +++++++++++----
e7a346
 xlators/protocol/server/src/server.c         |  6 +++---
e7a346
 2 files changed, 14 insertions(+), 7 deletions(-)
e7a346
e7a346
diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c
e7a346
index c8f5382..c492ab1 100644
e7a346
--- a/xlators/protocol/server/src/server-helpers.c
e7a346
+++ b/xlators/protocol/server/src/server-helpers.c
e7a346
@@ -177,10 +177,6 @@ server_resolve_wipe (server_resolve_t *resolve)
e7a346
 void
e7a346
 free_state (server_state_t *state)
e7a346
 {
e7a346
-        if (state->xprt) {
e7a346
-                rpc_transport_unref (state->xprt);
e7a346
-                state->xprt = NULL;
e7a346
-        }
e7a346
         if (state->fd) {
e7a346
                 fd_unref (state->fd);
e7a346
                 state->fd = NULL;
e7a346
@@ -223,6 +219,17 @@ free_state (server_state_t *state)
e7a346
 
e7a346
         compound_args_cleanup (state->args);
e7a346
 
e7a346
+        /* Call rpc_trnasport_unref to avoid crashes at last after free
e7a346
+           all resources because of server_rpc_notify (for transport destroy)
e7a346
+           call's xlator_mem_cleanup if all xprt are destroyed that internally
e7a346
+           call's inode_table_destroy.
e7a346
+        */
e7a346
+        if (state->xprt) {
e7a346
+                rpc_transport_unref (state->xprt);
e7a346
+                state->xprt = NULL;
e7a346
+        }
e7a346
+
e7a346
+
e7a346
         GF_FREE (state);
e7a346
 }
e7a346
 
e7a346
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
e7a346
index 2ba5da3..d40457c 100644
e7a346
--- a/xlators/protocol/server/src/server.c
e7a346
+++ b/xlators/protocol/server/src/server.c
e7a346
@@ -208,9 +208,6 @@ server_submit_reply (call_frame_t *frame, rpcsvc_request_t *req, void *arg,
e7a346
 
e7a346
         ret = 0;
e7a346
 ret:
e7a346
-        if (state)
e7a346
-                free_state (state);
e7a346
-
e7a346
         if (client)
e7a346
                 gf_client_unref (client);
e7a346
 
e7a346
@@ -220,6 +217,9 @@ ret:
e7a346
         if (new_iobref)
e7a346
                 iobref_unref (iobref);
e7a346
 
e7a346
+        if (state)
e7a346
+                free_state (state);
e7a346
+
e7a346
         return ret;
e7a346
 }
e7a346
 
e7a346
-- 
e7a346
1.8.3.1
e7a346