Merge branch 'for-linus' of git://linux-nfs.org/~bfields/linux
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 11 Feb 2008 17:19:47 +0000 (09:19 -0800)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 11 Feb 2008 17:19:47 +0000 (09:19 -0800)
* 'for-linus' of git://linux-nfs.org/~bfields/linux:
  SUNPRC: Fix printk format warning
  nfsd: clean up svc_reserve_auth()
  NLM: don't requeue block if it was invalidated while GRANT_MSG was in flight
  NLM: don't reattempt GRANT_MSG when there is already an RPC in flight
  NLM: have server-side RPC clients default to soft RPC tasks
  NLM: set RPC_CLNT_CREATE_NOPING for NLM RPC clients

fs/lockd/host.c
fs/lockd/svclock.c
include/linux/sunrpc/svc.h
net/sunrpc/xprtrdma/svc_rdma_sendto.c

index ca6b16fc3101a3df88d60350060eae56d6528535..f1ef49fff118ea8aa8322dd4404e0ca65ea3e518 100644 (file)
@@ -243,10 +243,18 @@ nlm_bind_host(struct nlm_host *host)
                        .program        = &nlm_program,
                        .version        = host->h_version,
                        .authflavor     = RPC_AUTH_UNIX,
-                       .flags          = (RPC_CLNT_CREATE_HARDRTRY |
+                       .flags          = (RPC_CLNT_CREATE_NOPING |
                                           RPC_CLNT_CREATE_AUTOBIND),
                };
 
+               /*
+                * lockd retries server side blocks automatically so we want
+                * those to be soft RPC calls. Client side calls need to be
+                * hard RPC tasks.
+                */
+               if (!host->h_server)
+                       args.flags |= RPC_CLNT_CREATE_HARDRTRY;
+
                clnt = rpc_create(&args);
                if (!IS_ERR(clnt))
                        host->h_rpcclnt = clnt;
index 2f4d8fa666892b9fa8b41266a627608c55c1e8a0..fe9bdb4a220cd32827c5818001651cabb5f1966d 100644 (file)
@@ -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 -- 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);
 
-       /* Call the client */
-       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);
 }
 
 /*
@@ -786,6 +795,17 @@ static void nlmsvc_grant_callback(struct rpc_task *task, void *data)
 
        dprintk("lockd: GRANT_MSG RPC callback\n");
 
+       /* if the block is not on a list at this point then it has
+        * been invalidated. Don't try to requeue it.
+        *
+        * FIXME: it's possible that the block is removed from the list
+        * after this check but before the nlmsvc_insert_block. In that
+        * case it will be added back. Perhaps we need better locking
+        * for nlm_blocked?
+        */
+       if (list_empty(&block->b_list))
+               return;
+
        /* Technically, we should down the file semaphore here. Since we
         * move the block towards the head of the queue only, no harm
         * can be done, though. */
index 64c771056187a3957c70ce3c212e0db82db49ff9..64c97552964a42f523b5c3dcba8a149f5edd4b3e 100644 (file)
@@ -409,16 +409,13 @@ char *               svc_print_addr(struct svc_rqst *, char *, size_t);
  * for all cases without actually generating the checksum, so we just use a
  * static value.
  */
-static inline void
-svc_reserve_auth(struct svc_rqst *rqstp, int space)
+static inline void svc_reserve_auth(struct svc_rqst *rqstp, int space)
 {
-       int                     added_space = 0;
+       int added_space = 0;
 
-       switch(rqstp->rq_authop->flavour) {
-               case RPC_AUTH_GSS:
-                       added_space = RPC_MAX_AUTH_SIZE;
-       }
-       return svc_reserve(rqstp, space + added_space);
+       if (rqstp->rq_authop->flavour)
+               added_space = RPC_MAX_AUTH_SIZE;
+       svc_reserve(rqstp, space + added_space);
 }
 
 #endif /* SUNRPC_SVC_H */
index 3e321949e1dc55cbd89db97a857e6fe70512f6c3..0598b229c11d326720a6c56b9bce66cfaa66e6b7 100644 (file)
@@ -159,7 +159,8 @@ static int send_write(struct svcxprt_rdma *xprt, struct svc_rqst *rqstp,
        BUG_ON(sge_count >= 32);
        dprintk("svcrdma: RDMA_WRITE rmr=%x, to=%llx, xdr_off=%d, "
                "write_len=%d, xdr_sge=%p, sge_count=%d\n",
-               rmr, to, xdr_off, write_len, xdr_sge, sge_count);
+               rmr, (unsigned long long)to, xdr_off,
+               write_len, xdr_sge, sge_count);
 
        ctxt = svc_rdma_get_context(xprt);
        ctxt->count = 0;