diff options
| author | Niels de Vos <ndevos@redhat.com> | 2017-01-20 14:15:31 +0100 | 
|---|---|---|
| committer | Raghavendra Talur <rtalur@redhat.com> | 2017-05-14 17:19:06 +0000 | 
| commit | 4e118f1846caeb1024c2bc3eaff01d9f0cd11374 (patch) | |
| tree | 6fd691a7d9cb7fcc5df766fd419ea59611254132 /xlators/nfs | |
| parent | 24da81a2f143c9a429db179099088a0b456122da (diff) | |
nfs/nlm: free the nlm_client upon RPC_DISCONNECT
When an NLM client disconnects, it should be removed from the list and
free'd.
> Cherry picked from commit 6897ba5c51b29c05b270c447adb1a34cb8e61911:
> Change-Id: Ib427c896bfcdc547a3aee42a652578ffd076e2ad
> BUG: 1381970
> Signed-off-by: Niels de Vos <ndevos@redhat.com>
> Reviewed-on: https://review.gluster.org/17189
> Smoke: Gluster Build System <jenkins@build.gluster.org>
> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
> Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
> Reviewed-by: jiffin tony Thottan <jthottan@redhat.com>
Change-Id: Ib427c896bfcdc547a3aee42a652578ffd076e2ad
BUG: 1450378
Signed-off-by: Niels de Vos <ndevos@redhat.com>
Reviewed-on: https://review.gluster.org/17272
Smoke: Gluster Build System <jenkins@build.gluster.org>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Raghavendra Talur <rtalur@redhat.com>
Diffstat (limited to 'xlators/nfs')
| -rw-r--r-- | xlators/nfs/server/src/nlm4.c | 32 | 
1 files changed, 20 insertions, 12 deletions
diff --git a/xlators/nfs/server/src/nlm4.c b/xlators/nfs/server/src/nlm4.c index 903262eff54..cff9a3f5044 100644 --- a/xlators/nfs/server/src/nlm4.c +++ b/xlators/nfs/server/src/nlm4.c @@ -45,7 +45,7 @@  /* TODO:   * 1) 2 opens racing .. creating an fd leak. - * 2) use mempool for nlmclnt - destroy if no fd exists, create during 1st call + * 2) use GF_REF_* for nlm_clnt_t   */  typedef ssize_t (*nlm4_serializer) (struct iovec outmsg, void *args); @@ -333,6 +333,24 @@ ret:          return rpc_clnt;  } +static void +nlm_client_free (nlm_client_t *nlmclnt) +{ +        list_del (&nlmclnt->fdes); +        list_del (&nlmclnt->nlm_clients); +        list_del (&nlmclnt->shares); + +        GF_FREE (nlmclnt->caller_name); + +        if (nlmclnt->rpc_clnt) { +                /* cleanup the saved-frames before last unref */ +                rpc_clnt_connection_cleanup (&nlmclnt->rpc_clnt->conn); +                /* rpc_clnt_connection_cleanup() calls rpc_clnt_unref() */ +        } + +        GF_FREE (nlmclnt); +} +  int  nlm_set_rpc_clnt (rpc_clnt_t *rpc_clnt, char *caller_name)  { @@ -375,26 +393,16 @@ int  nlm_unset_rpc_clnt (rpc_clnt_t *rpc)  {          nlm_client_t *nlmclnt = NULL; -        rpc_clnt_t *rpc_clnt = NULL;          LOCK (&nlm_client_list_lk);          list_for_each_entry (nlmclnt, &nlm_client_list, nlm_clients) {                  if (rpc == nlmclnt->rpc_clnt) { -                        rpc_clnt = nlmclnt->rpc_clnt; -                        nlmclnt->rpc_clnt = NULL; +                        nlm_client_free (nlmclnt);                          break;                  }          }          UNLOCK (&nlm_client_list_lk); -        if (rpc_clnt == NULL) { -                return -1; -        } -        if (rpc_clnt) { -                /* cleanup the saved-frames before last unref */ -                rpc_clnt_connection_cleanup (&rpc_clnt->conn); -                rpc_clnt_unref (rpc_clnt); -        }          return 0;  }  | 
