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:
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user