Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=9706501e43a80ce48b319214a0a9e562deded35b
Commit:     9706501e43a80ce48b319214a0a9e562deded35b
Parent:     90bd17c87821fe0e055e0f9a7446c2875f31eb4c
Author:     Jeff Layton <[EMAIL PROTECTED]>
AuthorDate: Wed Feb 6 11:34:12 2008 -0500
Committer:  J. Bruce Fields <[EMAIL PROTECTED]>
CommitDate: Sun Feb 10 18:09:36 2008 -0500

    NLM: don't reattempt GRANT_MSG when there is already an RPC in flight
    
    With the current scheme in nlmsvc_grant_blocked, we can end up with more
    than one GRANT_MSG callback for a block in flight. Right now, we requeue
    the block unconditionally so that a GRANT_MSG callback is done again in
    30s. If the client is unresponsive, it can take more than 30s for the
    call already in flight to time out.
    
    There's no benefit to having more than one GRANT_MSG RPC queued up at a
    time, so put it on the list with a timeout of NLM_NEVER before doing the
    RPC call. If the RPC call submission fails, we requeue it with a short
    timeout. If it works, then nlmsvc_grant_callback will end up requeueing
    it with a shorter timeout after it completes.
    
    Signed-off-by: Jeff Layton <[EMAIL PROTECTED]>
    Signed-off-by: J. Bruce Fields <[EMAIL PROTECTED]>
---
 fs/lockd/svclock.c |   17 +++++++++++++----
 1 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c
index 2f4d8fa..82db7b3 100644
--- a/fs/lockd/svclock.c
+++ b/fs/lockd/svclock.c
@@ -763,11 +763,20 @@ callback:
        dprintk("lockd: GRANTing blocked lock.\n");
        block->b_granted = 1;
 
-       /* Schedule next grant callback in 30 seconds */
-       nlmsvc_insert_block(block, 30 * HZ);
+       /* keep block on the list, but don't reattempt until the RPC
+        * completes or the submission fails
+        */
+       nlmsvc_insert_block(block, NLM_NEVER);
 
-       /* Call the client */
-       nlm_async_call(block->b_call, NLMPROC_GRANTED_MSG, &nlmsvc_grant_ops);
+       /* Call the client -- use a soft RPC task since nlmsvc_retry_blocked
+        * will queue up a new one if this one times out
+        */
+       error = nlm_async_call(block->b_call, NLMPROC_GRANTED_MSG,
+                               &nlmsvc_grant_ops);
+
+       /* RPC submission failed, wait a bit and retry */
+       if (error < 0)
+               nlmsvc_insert_block(block, 10 * HZ);
 }
 
 /*
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to