diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-06-15 01:55:58 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-06-15 01:55:58 +0000 |
commit | 53b3988d474435254a3b053a68bb24ce9e439295 (patch) | |
tree | f8da8e40f01f4ad02bbd76b8c9920749b118235f /fs/lockd | |
parent | b0cb48abe83d1a4389ea938bf624f8baa82c5047 (diff) |
Merge with 2.3.99-pre9.
Diffstat (limited to 'fs/lockd')
-rw-r--r-- | fs/lockd/clntproc.c | 36 | ||||
-rw-r--r-- | fs/lockd/svclock.c | 6 |
2 files changed, 37 insertions, 5 deletions
diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c index 376eed9cc..cc3025ee3 100644 --- a/fs/lockd/clntproc.c +++ b/fs/lockd/clntproc.c @@ -233,11 +233,21 @@ nlmclnt_call(struct nlm_rqst *req, u32 proc) struct rpc_clnt *clnt; struct nlm_args *argp = &req->a_args; struct nlm_res *resp = &req->a_res; + struct file *filp = argp->lock.fl.fl_file; + struct rpc_message msg; int status; dprintk("lockd: call procedure %s on %s\n", nlm_procname(proc), host->h_name); + msg.rpc_proc = proc; + msg.rpc_argp = argp; + msg.rpc_resp = resp; + if (filp) + msg.rpc_cred = nfs_file_cred(filp); + else + msg.rpc_cred = NULL; + do { if (host->h_reclaiming && !argp->reclaim) { interruptible_sleep_on(&host->h_gracewait); @@ -249,7 +259,7 @@ nlmclnt_call(struct nlm_rqst *req, u32 proc) return -ENOLCK; /* Perform the RPC call. If an error occurs, try again */ - if ((status = rpc_call(clnt, proc, argp, resp, 0)) < 0) { + if ((status = rpc_call_sync(clnt, &msg, 0)) < 0) { dprintk("lockd: rpc_call returned error %d\n", -status); switch (status) { case -EPROTONOSUPPORT: @@ -330,11 +340,31 @@ int nlmclnt_async_call(struct nlm_rqst *req, u32 proc, rpc_action callback) { struct nlm_host *host = req->a_host; - int status; + struct rpc_clnt *clnt; + struct nlm_args *argp = &req->a_args; + struct nlm_res *resp = &req->a_res; + struct file *file = argp->lock.fl.fl_file; + struct rpc_message msg; + int status; + dprintk("lockd: call procedure %s on %s (async)\n", + nlm_procname(proc), host->h_name); + + /* If we have no RPC client yet, create one. */ + if ((clnt = nlm_bind_host(host)) == NULL) + return -ENOLCK; + + /* bootstrap and kick off the async RPC call */ + msg.rpc_proc = proc; + msg.rpc_argp = argp; + msg.rpc_resp =resp; + if (file) + msg.rpc_cred = nfs_file_cred(file); + else + msg.rpc_cred = NULL; /* Increment host refcount */ nlm_get_host(host); - status = nlmsvc_async_call(req, proc, callback); + status = rpc_call_async(clnt, &msg, RPC_TASK_ASYNC, callback, req); if (status < 0) nlm_release_host(host); return status; diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index 97a9d27ef..279fcc3c1 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c @@ -533,8 +533,10 @@ callback: nlmsvc_insert_block(block, jiffies + 30 * HZ); /* Call the client */ - nlmclnt_async_call(&block->b_call, NLMPROC_GRANTED_MSG, - nlmsvc_grant_callback); + nlm_get_host(block->b_call.a_host); + if (nlmsvc_async_call(&block->b_call, NLMPROC_GRANTED_MSG, + nlmsvc_grant_callback) < 0) + nlm_release_host(block->b_call.a_host); up(&file->f_sema); } |