diff options
author | Niels de Vos <ndevos@redhat.com> | 2017-01-20 14:15:31 +0100 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2017-05-12 11:24:54 +0000 |
commit | 6897ba5c51b29c05b270c447adb1a34cb8e61911 (patch) | |
tree | d4d95818520f29063996742a498d48f6f5703128 /xlators/nfs | |
parent | cea8b702506ff914deadd056f4b7dd20a3ca7670 (diff) | |
download | glusterfs-6897ba5c51b29c05b270c447adb1a34cb8e61911.tar.gz glusterfs-6897ba5c51b29c05b270c447adb1a34cb8e61911.tar.xz glusterfs-6897ba5c51b29c05b270c447adb1a34cb8e61911.zip |
nfs/nlm: free the nlm_client upon RPC_DISCONNECT
When an NLM client disconnects, it should be removed from the list and
free'd.
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>
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 ed8684fdca..3e54035615 100644 --- a/xlators/nfs/server/src/nlm4.c +++ b/xlators/nfs/server/src/nlm4.c @@ -41,7 +41,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); @@ -329,6 +329,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) { @@ -371,26 +389,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; } |