|
@@ -28,6 +28,7 @@ static int nlmclnt_lock(struct nlm_rqst *, struct file_lock *);
|
|
static int nlmclnt_unlock(struct nlm_rqst *, struct file_lock *);
|
|
static int nlmclnt_unlock(struct nlm_rqst *, struct file_lock *);
|
|
static int nlm_stat_to_errno(u32 stat);
|
|
static int nlm_stat_to_errno(u32 stat);
|
|
static void nlmclnt_locks_init_private(struct file_lock *fl, struct nlm_host *host);
|
|
static void nlmclnt_locks_init_private(struct file_lock *fl, struct nlm_host *host);
|
|
|
|
+static int nlmclnt_cancel(struct nlm_host *, int , struct file_lock *);
|
|
|
|
|
|
static const struct rpc_call_ops nlmclnt_unlock_ops;
|
|
static const struct rpc_call_ops nlmclnt_unlock_ops;
|
|
static const struct rpc_call_ops nlmclnt_cancel_ops;
|
|
static const struct rpc_call_ops nlmclnt_cancel_ops;
|
|
@@ -598,7 +599,7 @@ out_unblock:
|
|
nlmclnt_finish_block(req);
|
|
nlmclnt_finish_block(req);
|
|
/* Cancel the blocked request if it is still pending */
|
|
/* Cancel the blocked request if it is still pending */
|
|
if (resp->status == NLM_LCK_BLOCKED)
|
|
if (resp->status == NLM_LCK_BLOCKED)
|
|
- nlmclnt_cancel(host, fl);
|
|
|
|
|
|
+ nlmclnt_cancel(host, req->a_args.block, fl);
|
|
out:
|
|
out:
|
|
nlmclnt_release_lockargs(req);
|
|
nlmclnt_release_lockargs(req);
|
|
return status;
|
|
return status;
|
|
@@ -728,8 +729,7 @@ static const struct rpc_call_ops nlmclnt_unlock_ops = {
|
|
* We always use an async RPC call for this in order not to hang a
|
|
* We always use an async RPC call for this in order not to hang a
|
|
* process that has been Ctrl-C'ed.
|
|
* process that has been Ctrl-C'ed.
|
|
*/
|
|
*/
|
|
-int
|
|
|
|
-nlmclnt_cancel(struct nlm_host *host, struct file_lock *fl)
|
|
|
|
|
|
+static int nlmclnt_cancel(struct nlm_host *host, int block, struct file_lock *fl)
|
|
{
|
|
{
|
|
struct nlm_rqst *req;
|
|
struct nlm_rqst *req;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
@@ -750,6 +750,7 @@ nlmclnt_cancel(struct nlm_host *host, struct file_lock *fl)
|
|
req->a_flags = RPC_TASK_ASYNC;
|
|
req->a_flags = RPC_TASK_ASYNC;
|
|
|
|
|
|
nlmclnt_setlockargs(req, fl);
|
|
nlmclnt_setlockargs(req, fl);
|
|
|
|
+ req->a_args.block = block;
|
|
|
|
|
|
status = nlmclnt_async_call(req, NLMPROC_CANCEL, &nlmclnt_cancel_ops);
|
|
status = nlmclnt_async_call(req, NLMPROC_CANCEL, &nlmclnt_cancel_ops);
|
|
if (status < 0) {
|
|
if (status < 0) {
|