NLM: don't unlock on cancel requests
authorJ. Bruce Fields <bfields@fieldses.org>
Tue, 3 Jan 2006 08:55:44 +0000 (09:55 +0100)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 6 Jan 2006 19:58:53 +0000 (14:58 -0500)
 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: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/lockd/svclock.c
fs/locks.c

index e42f0cc6c45060bf66703e0fdbf589c984fe5aef..5fb48b4390bdba2107a03d294f60d1e2625ea924 100644 (file)
@@ -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. */
index 250ef53d25ef8cfce06e333b83a746ef2577aa3d..75650d52fe60a126cdfbb523f039dc08f9954855 100644 (file)
@@ -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);
-       }
+       unlock_kernel();
 }
 
 EXPORT_SYMBOL(posix_unblock_lock);