diff options
author | J. Bruce Fields <bfields@fieldses.org> | 2006-01-03 09:55:44 +0100 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-01-06 14:58:53 -0500 |
commit | 5996a298da43a03081e9ba2116983d173001c862 (patch) | |
tree | 533a3289102051cc3e033eff5730301776e64d31 /fs/locks.c | |
parent | f232142cc21127c829559923eb405d1bcb2e2278 (diff) | |
download | linux-5996a298da43a03081e9ba2116983d173001c862.tar.gz linux-5996a298da43a03081e9ba2116983d173001c862.tar.bz2 linux-5996a298da43a03081e9ba2116983d173001c862.zip |
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: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/locks.c')
-rw-r--r-- | fs/locks.c | 13 |
1 files changed, 2 insertions, 11 deletions
diff --git a/fs/locks.c b/fs/locks.c index 250ef53d25ef..75650d52fe60 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -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); |