Commit a9034ac9 authored by Trond Myklebust's avatar Trond Myklebust

NFSv2/v3 locking: Patch by Patrice Dumas to ensure that the server index blocks uniquely

    by using the client address in addition to the value of the NLM cookie field.
parent b9c88d40
...@@ -464,7 +464,7 @@ nlm4svc_proc_granted_res(struct svc_rqst *rqstp, struct nlm_res *argp, ...@@ -464,7 +464,7 @@ nlm4svc_proc_granted_res(struct svc_rqst *rqstp, struct nlm_res *argp,
dprintk("lockd: GRANTED_RES called\n"); dprintk("lockd: GRANTED_RES called\n");
nlmsvc_grant_reply(&argp->cookie, argp->status); nlmsvc_grant_reply(rqstp, &argp->cookie, argp->status);
return rpc_success; return rpc_success;
} }
......
...@@ -143,14 +143,15 @@ static inline int nlm_cookie_match(struct nlm_cookie *a, struct nlm_cookie *b) ...@@ -143,14 +143,15 @@ static inline int nlm_cookie_match(struct nlm_cookie *a, struct nlm_cookie *b)
* Find a block with a given NLM cookie. * Find a block with a given NLM cookie.
*/ */
static inline struct nlm_block * static inline struct nlm_block *
nlmsvc_find_block(struct nlm_cookie *cookie) nlmsvc_find_block(struct nlm_cookie *cookie, struct sockaddr_in *sin)
{ {
struct nlm_block *block; struct nlm_block *block;
for (block = nlm_blocked; block; block = block->b_next) { for (block = nlm_blocked; block; block = block->b_next) {
dprintk("cookie: head of blocked queue %p, block %p\n", dprintk("cookie: head of blocked queue %p, block %p\n",
nlm_blocked, block); nlm_blocked, block);
if (nlm_cookie_match(&block->b_call.a_args.cookie,cookie)) if (nlm_cookie_match(&block->b_call.a_args.cookie,cookie)
&& nlm_cmp_addr(sin, &block->b_host->h_addr))
break; break;
} }
...@@ -566,12 +567,16 @@ nlmsvc_grant_callback(struct rpc_task *task) ...@@ -566,12 +567,16 @@ nlmsvc_grant_callback(struct rpc_task *task)
struct nlm_rqst *call = (struct nlm_rqst *) task->tk_calldata; struct nlm_rqst *call = (struct nlm_rqst *) task->tk_calldata;
struct nlm_block *block; struct nlm_block *block;
unsigned long timeout; unsigned long timeout;
struct sockaddr_in *peer_addr = RPC_PEERADDR(task->tk_client);
dprintk("lockd: GRANT_MSG RPC callback\n"); dprintk("lockd: GRANT_MSG RPC callback\n");
dprintk("callback: looking for cookie %x \n", dprintk("callback: looking for cookie %x, host (%08x)\n",
*(unsigned int *)(call->a_args.cookie.data)); *(unsigned int *)(call->a_args.cookie.data),
if (!(block = nlmsvc_find_block(&call->a_args.cookie))) { ntohl(peer_addr->sin_addr.s_addr));
dprintk("lockd: no block for cookie %x\n", *(u32 *)(call->a_args.cookie.data)); if (!(block = nlmsvc_find_block(&call->a_args.cookie, peer_addr))) {
dprintk("lockd: no block for cookie %x, host (%08x)\n",
*(u32 *)(call->a_args.cookie.data),
ntohl(peer_addr->sin_addr.s_addr));
return; return;
} }
...@@ -600,18 +605,21 @@ nlmsvc_grant_callback(struct rpc_task *task) ...@@ -600,18 +605,21 @@ nlmsvc_grant_callback(struct rpc_task *task)
* block. * block.
*/ */
void void
nlmsvc_grant_reply(struct nlm_cookie *cookie, u32 status) nlmsvc_grant_reply(struct svc_rqst *rqstp, struct nlm_cookie *cookie, u32 status)
{ {
struct nlm_block *block; struct nlm_block *block;
struct nlm_file *file; struct nlm_file *file;
if (!(block = nlmsvc_find_block(cookie))) dprintk("grant_reply: looking for cookie %x, host (%08x), s=%d \n",
*(unsigned int *)(cookie->data),
ntohl(rqstp->rq_addr.sin_addr.s_addr), status);
if (!(block = nlmsvc_find_block(cookie, &rqstp->rq_addr)))
return; return;
file = block->b_file; file = block->b_file;
file->f_count++; file->f_count++;
down(&file->f_sema); down(&file->f_sema);
if ((block = nlmsvc_find_block(cookie)) != NULL) { if ((block = nlmsvc_find_block(cookie,&rqstp->rq_addr)) != NULL) {
if (status == NLM_LCK_DENIED_GRACE_PERIOD) { if (status == NLM_LCK_DENIED_GRACE_PERIOD) {
/* Try again in a couple of seconds */ /* Try again in a couple of seconds */
nlmsvc_insert_block(block, 10 * HZ); nlmsvc_insert_block(block, 10 * HZ);
......
...@@ -490,7 +490,7 @@ nlmsvc_proc_granted_res(struct svc_rqst *rqstp, struct nlm_res *argp, ...@@ -490,7 +490,7 @@ nlmsvc_proc_granted_res(struct svc_rqst *rqstp, struct nlm_res *argp,
dprintk("lockd: GRANTED_RES called\n"); dprintk("lockd: GRANTED_RES called\n");
nlmsvc_grant_reply(&argp->cookie, argp->status); nlmsvc_grant_reply(rqstp, &argp->cookie, argp->status);
return rpc_success; return rpc_success;
} }
......
...@@ -165,7 +165,7 @@ u32 nlmsvc_cancel_blocked(struct nlm_file *, struct nlm_lock *); ...@@ -165,7 +165,7 @@ u32 nlmsvc_cancel_blocked(struct nlm_file *, struct nlm_lock *);
unsigned long nlmsvc_retry_blocked(void); unsigned long nlmsvc_retry_blocked(void);
int nlmsvc_traverse_blocks(struct nlm_host *, struct nlm_file *, int nlmsvc_traverse_blocks(struct nlm_host *, struct nlm_file *,
int action); int action);
void nlmsvc_grant_reply(struct nlm_cookie *cookie, u32 status); void nlmsvc_grant_reply(struct svc_rqst *, struct nlm_cookie *, u32);
/* /*
* File handling for the server personality * File handling for the server personality
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment