Skip to content

Commit

Permalink
lockd: server should unlock lock if client rejects the grant
Browse files Browse the repository at this point in the history
Currently lockd just dequeues the block and ignores it if the client
sends a GRANT_RES with a status of nlm_lck_denied. That status is an
indicator that the client has rejected the lock, so the right thing to
do is to unlock the lock we were trying to grant.

Reported-by: Yongcheng Yang <[email protected]>
Link: https://bugzilla.redhat.com/show_bug.cgi?id=2063818
Signed-off-by: Jeff Layton <[email protected]>
Signed-off-by: Chuck Lever <[email protected]>
  • Loading branch information
jtlayton authored and chucklever committed Apr 26, 2023
1 parent 2005f5b commit 244cc19
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions fs/lockd/svclock.c
Original file line number Diff line number Diff line change
Expand Up @@ -954,19 +954,32 @@ void
nlmsvc_grant_reply(struct nlm_cookie *cookie, __be32 status)
{
struct nlm_block *block;
struct file_lock *fl;
int error;

dprintk("grant_reply: looking for cookie %x, s=%d \n",
*(unsigned int *)(cookie->data), status);
if (!(block = nlmsvc_find_block(cookie)))
return;

if (status == nlm_lck_denied_grace_period) {
switch (status) {
case nlm_lck_denied_grace_period:
/* Try again in a couple of seconds */
nlmsvc_insert_block(block, 10 * HZ);
} else {
break;
case nlm_lck_denied:
/* Client doesn't want it, just unlock it */
nlmsvc_unlink_block(block);
fl = &block->b_call->a_args.lock.fl;
fl->fl_type = F_UNLCK;
error = vfs_lock_file(fl->fl_file, F_SETLK, fl, NULL);
if (error)
pr_warn("lockd: unable to unlock lock rejected by client!\n");
break;
default:
/*
* Lock is now held by client, or has been rejected.
* In both cases, the block should be removed.
* Either it was accepted or the status makes no sense
* just unlink it either way.
*/
nlmsvc_unlink_block(block);
}
Expand Down

0 comments on commit 244cc19

Please sign in to comment.