lockd: shift grabbing a reference to nlm_host into nlm_alloc_call()

It's used both for client and server hosts; we can't do nlmclnt_release_host()
on failure exits, since the host might need nlmsvc_release_host(), with BUG_ON()
for calling the wrong one.  Makes life simpler for callers, actually...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro
2012-07-26 00:39:50 +04:00
parent a51d9eaa41
commit 446945ab9a
4 changed files with 4 additions and 8 deletions

View File

@@ -156,7 +156,6 @@ int nlmclnt_proc(struct nlm_host *host, int cmd, struct file_lock *fl)
struct nlm_rqst *call; struct nlm_rqst *call;
int status; int status;
nlm_get_host(host);
call = nlm_alloc_call(host); call = nlm_alloc_call(host);
if (call == NULL) if (call == NULL)
return -ENOMEM; return -ENOMEM;
@@ -185,9 +184,6 @@ EXPORT_SYMBOL_GPL(nlmclnt_proc);
/* /*
* Allocate an NLM RPC call struct * Allocate an NLM RPC call struct
*
* Note: the caller must hold a reference to host. In case of failure,
* this reference will be released.
*/ */
struct nlm_rqst *nlm_alloc_call(struct nlm_host *host) struct nlm_rqst *nlm_alloc_call(struct nlm_host *host)
{ {
@@ -199,7 +195,7 @@ struct nlm_rqst *nlm_alloc_call(struct nlm_host *host)
atomic_set(&call->a_count, 1); atomic_set(&call->a_count, 1);
locks_init_lock(&call->a_args.lock.fl); locks_init_lock(&call->a_args.lock.fl);
locks_init_lock(&call->a_res.lock.fl); locks_init_lock(&call->a_res.lock.fl);
call->a_host = host; call->a_host = nlm_get_host(host);
return call; return call;
} }
if (signalled()) if (signalled())
@@ -207,7 +203,6 @@ struct nlm_rqst *nlm_alloc_call(struct nlm_host *host)
printk("nlm_alloc_call: failed, waiting for memory\n"); printk("nlm_alloc_call: failed, waiting for memory\n");
schedule_timeout_interruptible(5*HZ); schedule_timeout_interruptible(5*HZ);
} }
nlmclnt_release_host(host);
return NULL; return NULL;
} }
@@ -750,7 +745,7 @@ static int nlmclnt_cancel(struct nlm_host *host, int block, struct file_lock *fl
dprintk("lockd: blocking lock attempt was interrupted by a signal.\n" dprintk("lockd: blocking lock attempt was interrupted by a signal.\n"
" Attempting to cancel lock.\n"); " Attempting to cancel lock.\n");
req = nlm_alloc_call(nlm_get_host(host)); req = nlm_alloc_call(host);
if (!req) if (!req)
return -ENOMEM; return -ENOMEM;
req->a_flags = RPC_TASK_ASYNC; req->a_flags = RPC_TASK_ASYNC;

View File

@@ -256,6 +256,7 @@ static __be32 nlm4svc_callback(struct svc_rqst *rqstp, u32 proc, struct nlm_args
return rpc_system_err; return rpc_system_err;
call = nlm_alloc_call(host); call = nlm_alloc_call(host);
nlmsvc_release_host(host);
if (call == NULL) if (call == NULL)
return rpc_system_err; return rpc_system_err;

View File

@@ -219,7 +219,6 @@ nlmsvc_create_block(struct svc_rqst *rqstp, struct nlm_host *host,
struct nlm_block *block; struct nlm_block *block;
struct nlm_rqst *call = NULL; struct nlm_rqst *call = NULL;
nlm_get_host(host);
call = nlm_alloc_call(host); call = nlm_alloc_call(host);
if (call == NULL) if (call == NULL)
return NULL; return NULL;

View File

@@ -294,6 +294,7 @@ static __be32 nlmsvc_callback(struct svc_rqst *rqstp, u32 proc, struct nlm_args
return rpc_system_err; return rpc_system_err;
call = nlm_alloc_call(host); call = nlm_alloc_call(host);
nlmsvc_release_host(host);
if (call == NULL) if (call == NULL)
return rpc_system_err; return rpc_system_err;