From: Frank van Maarseveen <frankvm@frankvm.com>
To: Linux NFS mailing list <nfs@lists.sourceforge.net>
Subject: [PATCH] lockd: unlock when client rejects GRANTED_MSG
Date: Sun, 1 Jul 2007 16:38:01 +0200 [thread overview]
Message-ID: <20070701143801.GA22967@janus> (raw)
In-Reply-To: <20070629155226.GA25561@janus>
When lockd grants a blocked lock request after a while then the client
response on it should not be ignored: When the client rejects GRANTED_MSG
with GRANTED_RES NLM_LCK_DENIED then lockd on the server must release
the POSIX lock.
Signed-off-by: Frank van Maarseveen <frankvm@frankvm.com>
---
On Fri, Jun 29, 2007 at 05:52:26PM +0200, Frank van Maarseveen wrote:
> Both server and client run 2.6.21.5 and use NFSv3 over UDP.
>
> The server has a second IP address on eth0. The client mounts from the
> second address. Two instances of attached test program run on the client
> specifying the same lockfile. Basically they repeatedly F_SETLKW for
> an exclusive lock, sleep 0.2s with lock held, unlock, sleep 0.1s. The
> F_SETLKW is aborted by alarm(10) which normally shouldn't happen.
>
> This works for a minute and then both alarm clocks go off and the file is
> still locked on the server but not on the client. Wireshark NLM traffic:
[snip]
This is basically what happens:
1 Client tries to obtain a lock, server says NLM_BLOCKED and prepares
to call the client later when the conflicting lock is released.
2 When the conflicting lock is released, the server calls
nlm_async_call() via which nlm_bind_host() creates a new transport
with no knowledge about any source IP address to pick.
A GRANTED_MSG goes out with a source IP address which differs from
the destination address in the original client request.
3 Client checks IP address in nlmclnt_grant() and rejects it with
GRANTED_RES NLM_LCK_DENIED.
4 Server ignores the error in nlmsvc_grant_reply(). It always removes
the block (struct nlm_block) which is correct but forgets to
remove the POSIX lock itself in case the client rejected the lock.
IMHO #2 is incorrect and #3 is a questionable check (does it buy us
anything?). #4 definately is a bug and is fixed below.
--- a/fs/lockd/svclock.c 2007-05-12 21:28:09.000000000 +0200
+++ b/fs/lockd/svclock.c 2007-07-01 14:51:21.000000000 +0200
@@ -646,20 +646,27 @@
nlmsvc_grant_reply(struct nlm_cookie *cookie, __be32 status)
{
struct nlm_block *block;
+ struct nlm_lock *lock;
+ 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 (block) {
- if (status == nlm_lck_denied_grace_period) {
- /* Try again in a couple of seconds */
- nlmsvc_insert_block(block, 10 * HZ);
- } else {
- /* Lock is now held by client, or has been rejected.
- * In both cases, the block should be removed. */
- nlmsvc_unlink_block(block);
+ if (status == nlm_lck_denied_grace_period) {
+ /* Try again in a couple of seconds */
+ nlmsvc_insert_block(block, 10 * HZ);
+ } else {
+ /* Lock is now held by client, or has been rejected.
+ * In both cases, the block should be removed. */
+ nlmsvc_unlink_block(block);
+
+ if (status == nlm_lck_denied) {
+ lock = &block->b_call->a_args.lock;
+ lock->fl.fl_type = F_UNLCK;
+ error = posix_lock_file(block->b_file->f_file, &lock->fl);
+ dprintk("nlmsvc_grant_reply: posix_lock_file returned %d\n", error);
}
}
nlmsvc_release_block(block);
--
Frank
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
NFS maillist - NFS@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nfs
next prev parent reply other threads:[~2007-07-01 14:38 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-29 15:52 NFSv3 locking bugs (trace+testprogram included) Frank van Maarseveen
2007-07-01 14:38 ` Frank van Maarseveen [this message]
2007-07-01 14:58 ` [PATCH] lockd: unlock when client rejects GRANTED_MSG J. Bruce Fields
2007-07-01 15:11 ` Frank van Maarseveen
2007-07-03 20:43 ` J. Bruce Fields
2007-07-03 20:53 ` J. Bruce Fields
2007-07-03 22:24 ` Frank van Maarseveen
2007-07-03 22:30 ` J. Bruce Fields
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070701143801.GA22967@janus \
--to=frankvm@frankvm.com \
--cc=nfs@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox