Skip to content

Commit

Permalink
Merge branch 'for-linus' of git://linux-nfs.org/~bfields/linux
Browse files Browse the repository at this point in the history
* '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
  • Loading branch information
Linus Torvalds committed Feb 11, 2008
2 parents eedcdef + bb50c80 commit 0c0d61c
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 14 deletions.
10 changes: 9 additions & 1 deletion fs/lockd/host.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
28 changes: 24 additions & 4 deletions fs/lockd/svclock.c
Original file line number Diff line number Diff line change
Expand Up @@ -763,11 +763,20 @@ nlmsvc_grant_blocked(struct nlm_block *block)
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);
}

/*
Expand All @@ -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. */
Expand Down
13 changes: 5 additions & 8 deletions include/linux/sunrpc/svc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
3 changes: 2 additions & 1 deletion net/sunrpc/xprtrdma/svc_rdma_sendto.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 0c0d61c

Please sign in to comment.