diff options
author | Soumya Koduri <skoduri@redhat.com> | 2017-02-13 16:52:07 +0530 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2017-02-14 04:16:46 -0500 |
commit | a88ae92de190af0956013780939ba6bdfd509ff8 (patch) | |
tree | d2ffbf390a88564f660b7757013e2fb91988ed56 /xlators/nfs/server | |
parent | be44a1bd519af69b21acf682b0908d4d695f868e (diff) |
gNFS: Keep the mountdict as long as the service is active
We initialize and take ref once on mountdict during NFS/MNT3 server
initialization but seem to be unref'in it for every UMNTALL request.
This can lead to crash when there are multiple UMNTALL requests
with >=1 active mount entry(/ies) in the mountlist.
Since we take the ref only once, we should keep the mountdict through
out the life of the process and dereference it only during unitialization
of mnt3 service.
Change-Id: I3238a8df09b8972e56dd93fee426d866d40d9959
BUG: 1421759
Signed-off-by: Soumya Koduri <skoduri@redhat.com>
Reviewed-on: https://review.gluster.org/16611
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: jiffin tony Thottan <jthottan@redhat.com>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
Diffstat (limited to 'xlators/nfs/server')
-rw-r--r-- | xlators/nfs/server/src/mount3.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/xlators/nfs/server/src/mount3.c b/xlators/nfs/server/src/mount3.c index 4fb4b757423..823b94dd3ca 100644 --- a/xlators/nfs/server/src/mount3.c +++ b/xlators/nfs/server/src/mount3.c @@ -2543,8 +2543,6 @@ __mnt3svc_umountall (struct mount3_state *ms) GF_FREE (me); } - dict_unref (ms->mountdict); - return 0; } @@ -3938,7 +3936,13 @@ mnt3svc_deinit (xlator_t *nfsx) mnt3_auth_params_deinit (mstate->auth_params); /* Unmount everything and clear mountdict */ - mnt3svc_umountall (mstate); + LOCK (&mstate->mountlock); + { + __mnt3svc_umountall (mstate); + dict_unref (mstate->mountdict); + } + UNLOCK (&mstate->mountlock); + } rpcsvc_program_t * |