diff options
| author | Niels de Vos <ndevos@redhat.com> | 2017-01-13 13:02:23 +0100 | 
|---|---|---|
| committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2017-05-17 23:26:03 +0000 | 
| commit | 55a23c268a2451f2f4d25c06c05e4c3bc0933d5d (patch) | |
| tree | d88f5be05b4adc182b20d88f90b7399d3bded7ae /xlators | |
| parent | c71645532523191d3a364a8d1771e377db512e6b (diff) | |
nfs/nlm: remove lock request from the list after cancel
Once an NLM client cancels a lock request, it should be removed from the
list. The list can also be cleaned of unneeded entries once the client
does not have any outstanding lock/share requests/granted.
Cherry picked from commit 71cb7f3eb4fb706aab7f83906592942a2ff2e924:
> Change-Id: I2f2b666b627dcb52cddc6d5b95856e420b2b2e26
> BUG: 1381970
> Signed-off-by: Niels de Vos <ndevos@redhat.com>
> Reviewed-on: https://review.gluster.org/17188
> 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: I2f2b666b627dcb52cddc6d5b95856e420b2b2e26
BUG: 1450377
Signed-off-by: Niels de Vos <ndevos@redhat.com>
Reviewed-on: https://review.gluster.org/17268
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: jiffin tony Thottan <jthottan@redhat.com>
Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/nfs/server/src/nlm4.c | 16 | 
1 files changed, 11 insertions, 5 deletions
diff --git a/xlators/nfs/server/src/nlm4.c b/xlators/nfs/server/src/nlm4.c index 3e540356151..281eaee5fab 100644 --- a/xlators/nfs/server/src/nlm4.c +++ b/xlators/nfs/server/src/nlm4.c @@ -1209,7 +1209,7 @@ ret:  }  void -nlm_search_and_delete (fd_t *fd, char *caller_name) +nlm_search_and_delete (fd_t *fd, nlm4_lock *lk)  {          nlm_fde_t *fde = NULL;          nlm_client_t *nlmclnt = NULL; @@ -1220,7 +1220,7 @@ nlm_search_and_delete (fd_t *fd, char *caller_name)          LOCK (&nlm_client_list_lk);          list_for_each_entry (nlmclnt,                               &nlm_client_list, nlm_clients) { -                if (!strcmp(caller_name, nlmclnt->caller_name)) { +                if (!strcmp (lk->caller_name, nlmclnt->caller_name)) {                          nlmclnt_found = 1;                          break;                  } @@ -1243,6 +1243,9 @@ nlm_search_and_delete (fd_t *fd, char *caller_name)                  goto ret;          list_del (&fde->fde_list); +        if (list_empty (&nlmclnt->fdes) && list_empty (&nlmclnt->shares)) +                nlm_client_free (nlmclnt); +  ret:          UNLOCK (&nlm_client_list_lk); @@ -1358,7 +1361,8 @@ nlm4svc_lock_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (op_ret == -1) {                  if (transit_cnt == 0) -                        nlm_search_and_delete (cs->fd, caller_name); +                        nlm_search_and_delete (cs->fd, +                                               &cs->args.nlm4_lockargs.alock);                  stat = nlm4_errno_to_nlm4stat (op_errno);                  goto err;          } else { @@ -1549,8 +1553,10 @@ nlm4svc_cancel_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (op_ret == -1) {                  stat = nlm4_errno_to_nlm4stat (op_errno);                  goto err; -        } else +        } else {                  stat = nlm4_granted; +                nlm_search_and_delete (cs->fd, &cs->args.nlm4_lockargs.alock); +        }  err:          nlm4_generic_reply (cs->req, cs->args.nlm4_cancargs.cookie, @@ -1703,7 +1709,7 @@ nlm4svc_unlock_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  stat = nlm4_granted;                  if (flock->l_type == F_UNLCK)                          nlm_search_and_delete (cs->fd, -                                               cs->args.nlm4_unlockargs.alock.caller_name); +                                               &cs->args.nlm4_unlockargs.alock);          }  err:  | 
