diff options
Diffstat (limited to 'net/sunrpc/sched.c')
-rw-r--r-- | net/sunrpc/sched.c | 23 |
1 files changed, 6 insertions, 17 deletions
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index 6eab9bf94baf..385f427bedad 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c | |||
@@ -576,9 +576,7 @@ EXPORT_SYMBOL_GPL(rpc_delay); | |||
576 | */ | 576 | */ |
577 | static void rpc_prepare_task(struct rpc_task *task) | 577 | static void rpc_prepare_task(struct rpc_task *task) |
578 | { | 578 | { |
579 | lock_kernel(); | ||
580 | task->tk_ops->rpc_call_prepare(task, task->tk_calldata); | 579 | task->tk_ops->rpc_call_prepare(task, task->tk_calldata); |
581 | unlock_kernel(); | ||
582 | } | 580 | } |
583 | 581 | ||
584 | /* | 582 | /* |
@@ -588,9 +586,7 @@ void rpc_exit_task(struct rpc_task *task) | |||
588 | { | 586 | { |
589 | task->tk_action = NULL; | 587 | task->tk_action = NULL; |
590 | if (task->tk_ops->rpc_call_done != NULL) { | 588 | if (task->tk_ops->rpc_call_done != NULL) { |
591 | lock_kernel(); | ||
592 | task->tk_ops->rpc_call_done(task, task->tk_calldata); | 589 | task->tk_ops->rpc_call_done(task, task->tk_calldata); |
593 | unlock_kernel(); | ||
594 | if (task->tk_action != NULL) { | 590 | if (task->tk_action != NULL) { |
595 | WARN_ON(RPC_ASSASSINATED(task)); | 591 | WARN_ON(RPC_ASSASSINATED(task)); |
596 | /* Always release the RPC slot and buffer memory */ | 592 | /* Always release the RPC slot and buffer memory */ |
@@ -602,11 +598,8 @@ EXPORT_SYMBOL_GPL(rpc_exit_task); | |||
602 | 598 | ||
603 | void rpc_release_calldata(const struct rpc_call_ops *ops, void *calldata) | 599 | void rpc_release_calldata(const struct rpc_call_ops *ops, void *calldata) |
604 | { | 600 | { |
605 | if (ops->rpc_release != NULL) { | 601 | if (ops->rpc_release != NULL) |
606 | lock_kernel(); | ||
607 | ops->rpc_release(calldata); | 602 | ops->rpc_release(calldata); |
608 | unlock_kernel(); | ||
609 | } | ||
610 | } | 603 | } |
611 | 604 | ||
612 | /* | 605 | /* |
@@ -626,19 +619,15 @@ static void __rpc_execute(struct rpc_task *task) | |||
626 | /* | 619 | /* |
627 | * Execute any pending callback. | 620 | * Execute any pending callback. |
628 | */ | 621 | */ |
629 | if (RPC_DO_CALLBACK(task)) { | 622 | if (task->tk_callback) { |
630 | /* Define a callback save pointer */ | ||
631 | void (*save_callback)(struct rpc_task *); | 623 | void (*save_callback)(struct rpc_task *); |
632 | 624 | ||
633 | /* | 625 | /* |
634 | * If a callback exists, save it, reset it, | 626 | * We set tk_callback to NULL before calling it, |
635 | * call it. | 627 | * in case it sets the tk_callback field itself: |
636 | * The save is needed to stop from resetting | ||
637 | * another callback set within the callback handler | ||
638 | * - Dave | ||
639 | */ | 628 | */ |
640 | save_callback=task->tk_callback; | 629 | save_callback = task->tk_callback; |
641 | task->tk_callback=NULL; | 630 | task->tk_callback = NULL; |
642 | save_callback(task); | 631 | save_callback(task); |
643 | } | 632 | } |
644 | 633 | ||