Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5996a298 authored by J. Bruce Fields's avatar J. Bruce Fields Committed by Trond Myklebust
Browse files

NLM: don't unlock on cancel requests



 Currently when lockd gets an NLM_CANCEL request, it also does an unlock for
 the same range.  This is incorrect.

 The Open Group documentation says that "This procedure cancels an
 *outstanding* blocked lock request."  (Emphasis mine.)

 Also, consider a client that holds a lock on the first byte of a file, and
 requests a lock on the entire file.  If the client cancels that request
 (perhaps because the requesting process is signalled), the server shouldn't
 apply perform an unlock on the entire file, since that will also remove the
 previous lock that the client was already granted.

 Or consider a lock request that actually *downgraded* an exclusive lock to
 a shared lock.

 Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
 Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent f232142c
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -240,11 +240,6 @@ nlmsvc_delete_block(struct nlm_block *block, int unlock)
	nlmsvc_remove_block(block);
	if (fl->fl_next)
		posix_unblock_lock(file->f_file, fl);
	if (unlock) {
		fl->fl_type = F_UNLCK;
		posix_lock_file(file->f_file, fl);
		block->b_granted = 0;
	}

	/* If the block is in the middle of a GRANT callback,
	 * don't kill it yet. */
+2 −11
Original line number Diff line number Diff line
@@ -1961,19 +1961,10 @@ EXPORT_SYMBOL(posix_block_lock);
void
posix_unblock_lock(struct file *filp, struct file_lock *waiter)
{
	/* 
	 * A remote machine may cancel the lock request after it's been
	 * granted locally.  If that happens, we need to delete the lock.
	 */
	lock_kernel();
	if (waiter->fl_next) {
	if (waiter->fl_next)
		__locks_delete_block(waiter);
	unlock_kernel();
	} else {
		unlock_kernel();
		waiter->fl_type = F_UNLCK;
		posix_lock_file(filp, waiter);
	}
}

EXPORT_SYMBOL(posix_unblock_lock);