diff options
| author | Bryan Schumaker <bjschuma@netapp.com> | 2010-09-21 16:38:12 -0400 |
|---|---|---|
| committer | J. Bruce Fields <bfields@redhat.com> | 2010-09-22 15:32:58 -0400 |
| commit | f904be9cc77f361d37d71468b13ff3d1a1823dea (patch) | |
| tree | 0c4b82a971b3240bb1f78a9428a911c450a35c08 | |
| parent | e7f483eabea8ef6d2b5ce1b74c8184cc06819f15 (diff) | |
lockd: Mostly remove BKL from the server
This patch removes all but one call to lock_kernel() from the server.
Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
| -rw-r--r-- | fs/lockd/svc4proc.c | 2 | ||||
| -rw-r--r-- | fs/lockd/svclock.c | 31 | ||||
| -rw-r--r-- | fs/lockd/svcproc.c | 2 |
3 files changed, 21 insertions, 14 deletions
diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c index 031c6569a13..a336e832475 100644 --- a/fs/lockd/svc4proc.c +++ b/fs/lockd/svc4proc.c | |||
| @@ -230,9 +230,7 @@ static void nlm4svc_callback_exit(struct rpc_task *task, void *data) | |||
| 230 | 230 | ||
| 231 | static void nlm4svc_callback_release(void *data) | 231 | static void nlm4svc_callback_release(void *data) |
| 232 | { | 232 | { |
| 233 | lock_kernel(); | ||
| 234 | nlm_release_call(data); | 233 | nlm_release_call(data); |
| 235 | unlock_kernel(); | ||
| 236 | } | 234 | } |
| 237 | 235 | ||
| 238 | static const struct rpc_call_ops nlm4svc_callback_ops = { | 236 | static const struct rpc_call_ops nlm4svc_callback_ops = { |
diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index 84055d31bfc..6f1ef000975 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c | |||
| @@ -52,12 +52,13 @@ static const struct rpc_call_ops nlmsvc_grant_ops; | |||
| 52 | * The list of blocked locks to retry | 52 | * The list of blocked locks to retry |
| 53 | */ | 53 | */ |
| 54 | static LIST_HEAD(nlm_blocked); | 54 | static LIST_HEAD(nlm_blocked); |
| 55 | static DEFINE_SPINLOCK(nlm_blocked_lock); | ||
| 55 | 56 | ||
| 56 | /* | 57 | /* |
| 57 | * Insert a blocked lock into the global list | 58 | * Insert a blocked lock into the global list |
| 58 | */ | 59 | */ |
| 59 | static void | 60 | static void |
| 60 | nlmsvc_insert_block(struct nlm_block *block, unsigned long when) | 61 | nlmsvc_insert_block_locked(struct nlm_block *block, unsigned long when) |
| 61 | { | 62 | { |
| 62 | struct nlm_block *b; | 63 | struct nlm_block *b; |
| 63 | struct list_head *pos; | 64 | struct list_head *pos; |
| @@ -87,6 +88,13 @@ nlmsvc_insert_block(struct nlm_block *block, unsigned long when) | |||
| 87 | block->b_when = when; | 88 | block->b_when = when; |
| 88 | } | 89 | } |
| 89 | 90 | ||
| 91 | static void nlmsvc_insert_block(struct nlm_block *block, unsigned long when) | ||
| 92 | { | ||
| 93 | spin_lock(&nlm_blocked_lock); | ||
| 94 | nlmsvc_insert_block_locked(block, when); | ||
| 95 | spin_unlock(&nlm_blocked_lock); | ||
| 96 | } | ||
| 97 | |||
| 90 | /* | 98 | /* |
| 91 | * Remove a block from the global list | 99 | * Remove a block from the global list |
| 92 | */ | 100 | */ |
| @@ -94,7 +102,9 @@ static inline void | |||
| 94 | nlmsvc_remove_block(struct nlm_block *block) | 102 | nlmsvc_remove_block(struct nlm_block *block) |
| 95 | { | 103 | { |
| 96 | if (!list_empty(&block->b_list)) { | 104 | if (!list_empty(&block->b_list)) { |
| 105 | spin_lock(&nlm_blocked_lock); | ||
| 97 | list_del_init(&block->b_list); | 106 | list_del_init(&block->b_list); |
| 107 | spin_unlock(&nlm_blocked_lock); | ||
| 98 | nlmsvc_release_block(block); | 108 | nlmsvc_release_block(block); |
| 99 | } | 109 | } |
| 100 | } | 110 | } |
| @@ -651,7 +661,7 @@ static int nlmsvc_grant_deferred(struct file_lock *fl, struct file_lock *conf, | |||
| 651 | struct nlm_block *block; | 661 | struct nlm_block *block; |
| 652 | int rc = -ENOENT; | 662 | int rc = -ENOENT; |
| 653 | 663 | ||
| 654 | lock_kernel(); | 664 | spin_lock(&nlm_blocked_lock); |
| 655 | list_for_each_entry(block, &nlm_blocked, b_list) { | 665 | list_for_each_entry(block, &nlm_blocked, b_list) { |
| 656 | if (nlm_compare_locks(&block->b_call->a_args.lock.fl, fl)) { | 666 | if (nlm_compare_locks(&block->b_call->a_args.lock.fl, fl)) { |
| 657 | dprintk("lockd: nlmsvc_notify_blocked block %p flags %d\n", | 667 | dprintk("lockd: nlmsvc_notify_blocked block %p flags %d\n", |
| @@ -665,13 +675,13 @@ static int nlmsvc_grant_deferred(struct file_lock *fl, struct file_lock *conf, | |||
| 665 | } else if (result == 0) | 675 | } else if (result == 0) |
| 666 | block->b_granted = 1; | 676 | block->b_granted = 1; |
| 667 | 677 | ||
| 668 | nlmsvc_insert_block(block, 0); | 678 | nlmsvc_insert_block_locked(block, 0); |
| 669 | svc_wake_up(block->b_daemon); | 679 | svc_wake_up(block->b_daemon); |
| 670 | rc = 0; | 680 | rc = 0; |
| 671 | break; | 681 | break; |
| 672 | } | 682 | } |
| 673 | } | 683 | } |
| 674 | unlock_kernel(); | 684 | spin_unlock(&nlm_blocked_lock); |
| 675 | if (rc == -ENOENT) | 685 | if (rc == -ENOENT) |
| 676 | printk(KERN_WARNING "lockd: grant for unknown block\n"); | 686 | printk(KERN_WARNING "lockd: grant for unknown block\n"); |
| 677 | return rc; | 687 | return rc; |
| @@ -803,7 +813,7 @@ static void nlmsvc_grant_callback(struct rpc_task *task, void *data) | |||
| 803 | 813 | ||
| 804 | dprintk("lockd: GRANT_MSG RPC callback\n"); | 814 | dprintk("lockd: GRANT_MSG RPC callback\n"); |
| 805 | 815 | ||
| 806 | lock_kernel(); | 816 | spin_lock(&nlm_blocked_lock); |
| 807 | /* if the block is not on a list at this point then it has | 817 | /* if the block is not on a list at this point then it has |
| 808 | * been invalidated. Don't try to requeue it. | 818 | * been invalidated. Don't try to requeue it. |
| 809 | * | 819 | * |
| @@ -825,19 +835,20 @@ static void nlmsvc_grant_callback(struct rpc_task *task, void *data) | |||
| 825 | /* Call was successful, now wait for client callback */ | 835 | /* Call was successful, now wait for client callback */ |
| 826 | timeout = 60 * HZ; | 836 | timeout = 60 * HZ; |
| 827 | } | 837 | } |
| 828 | nlmsvc_insert_block(block, timeout); | 838 | nlmsvc_insert_block_locked(block, timeout); |
| 829 | svc_wake_up(block->b_daemon); | 839 | svc_wake_up(block->b_daemon); |
| 830 | out: | 840 | out: |
| 831 | unlock_kernel(); | 841 | spin_unlock(&nlm_blocked_lock); |
| 832 | } | 842 | } |
| 833 | 843 | ||
| 844 | /* | ||
| 845 | * FIXME: nlmsvc_release_block() grabs a mutex. This is not allowed for an | ||
| 846 | * .rpc_release rpc_call_op | ||
| 847 | */ | ||
| 834 | static void nlmsvc_grant_release(void *data) | 848 | static void nlmsvc_grant_release(void *data) |
| 835 | { | 849 | { |
| 836 | struct nlm_rqst *call = data; | 850 | struct nlm_rqst *call = data; |
| 837 | |||
| 838 | lock_kernel(); | ||
| 839 | nlmsvc_release_block(call->a_block); | 851 | nlmsvc_release_block(call->a_block); |
| 840 | unlock_kernel(); | ||
| 841 | } | 852 | } |
| 842 | 853 | ||
| 843 | static const struct rpc_call_ops nlmsvc_grant_ops = { | 854 | static const struct rpc_call_ops nlmsvc_grant_ops = { |
diff --git a/fs/lockd/svcproc.c b/fs/lockd/svcproc.c index 0f2ab741ae7..c3069f38d60 100644 --- a/fs/lockd/svcproc.c +++ b/fs/lockd/svcproc.c | |||
| @@ -260,9 +260,7 @@ static void nlmsvc_callback_exit(struct rpc_task *task, void *data) | |||
| 260 | 260 | ||
| 261 | static void nlmsvc_callback_release(void *data) | 261 | static void nlmsvc_callback_release(void *data) |
| 262 | { | 262 | { |
| 263 | lock_kernel(); | ||
| 264 | nlm_release_call(data); | 263 | nlm_release_call(data); |
| 265 | unlock_kernel(); | ||
| 266 | } | 264 | } |
| 267 | 265 | ||
| 268 | static const struct rpc_call_ops nlmsvc_callback_ops = { | 266 | static const struct rpc_call_ops nlmsvc_callback_ops = { |
