aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2005-06-22 13:16:31 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2005-06-22 16:07:41 -0400
commit4f15e2b1f4f3a56e46201714b39436c32218d547 (patch)
treedb694827826cc80b27958f8b6eda99be44953a2c /fs
parent80fec4c62e2cf544ac26e53f3e0d2f73df6820b9 (diff)
[PATCH] NLM: cleanup for blocked locks.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/lockd/clntlock.c18
1 files changed, 6 insertions, 12 deletions
diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c
index ef7103b8c5bd..44adb84183b6 100644
--- a/fs/lockd/clntlock.c
+++ b/fs/lockd/clntlock.c
@@ -31,7 +31,7 @@ static int reclaimer(void *ptr);
31 * This is the representation of a blocked client lock. 31 * This is the representation of a blocked client lock.
32 */ 32 */
33struct nlm_wait { 33struct nlm_wait {
34 struct nlm_wait * b_next; /* linked list */ 34 struct list_head b_list; /* linked list */
35 wait_queue_head_t b_wait; /* where to wait on */ 35 wait_queue_head_t b_wait; /* where to wait on */
36 struct nlm_host * b_host; 36 struct nlm_host * b_host;
37 struct file_lock * b_lock; /* local file lock */ 37 struct file_lock * b_lock; /* local file lock */
@@ -39,7 +39,7 @@ struct nlm_wait {
39 u32 b_status; /* grant callback status */ 39 u32 b_status; /* grant callback status */
40}; 40};
41 41
42static struct nlm_wait * nlm_blocked; 42static LIST_HEAD(nlm_blocked);
43 43
44/* 44/*
45 * Block on a lock 45 * Block on a lock
@@ -55,8 +55,7 @@ nlmclnt_block(struct nlm_host *host, struct file_lock *fl, u32 *statp)
55 block.b_lock = fl; 55 block.b_lock = fl;
56 init_waitqueue_head(&block.b_wait); 56 init_waitqueue_head(&block.b_wait);
57 block.b_status = NLM_LCK_BLOCKED; 57 block.b_status = NLM_LCK_BLOCKED;
58 block.b_next = nlm_blocked; 58 list_add(&block.b_list, &nlm_blocked);
59 nlm_blocked = &block;
60 59
61 /* Remember pseudo nsm state */ 60 /* Remember pseudo nsm state */
62 pstate = host->h_state; 61 pstate = host->h_state;
@@ -71,12 +70,7 @@ nlmclnt_block(struct nlm_host *host, struct file_lock *fl, u32 *statp)
71 */ 70 */
72 sleep_on_timeout(&block.b_wait, 30*HZ); 71 sleep_on_timeout(&block.b_wait, 30*HZ);
73 72
74 for (head = &nlm_blocked; *head; head = &(*head)->b_next) { 73 list_del(&block.b_list);
75 if (*head == &block) {
76 *head = block.b_next;
77 break;
78 }
79 }
80 74
81 if (!signalled()) { 75 if (!signalled()) {
82 *statp = block.b_status; 76 *statp = block.b_status;
@@ -105,7 +99,7 @@ nlmclnt_grant(struct nlm_lock *lock)
105 * Look up blocked request based on arguments. 99 * Look up blocked request based on arguments.
106 * Warning: must not use cookie to match it! 100 * Warning: must not use cookie to match it!
107 */ 101 */
108 for (block = nlm_blocked; block; block = block->b_next) { 102 list_for_each_entry(block, &nlm_blocked, b_list) {
109 if (nlm_compare_locks(block->b_lock, &lock->fl)) 103 if (nlm_compare_locks(block->b_lock, &lock->fl))
110 break; 104 break;
111 } 105 }
@@ -230,7 +224,7 @@ restart:
230 host->h_reclaiming = 0; 224 host->h_reclaiming = 0;
231 225
232 /* Now, wake up all processes that sleep on a blocked lock */ 226 /* Now, wake up all processes that sleep on a blocked lock */
233 for (block = nlm_blocked; block; block = block->b_next) { 227 list_for_each_entry(block, &nlm_blocked, b_list) {
234 if (block->b_host == host) { 228 if (block->b_host == host) {
235 block->b_status = NLM_LCK_DENIED_GRACE_PERIOD; 229 block->b_status = NLM_LCK_DENIED_GRACE_PERIOD;
236 wake_up(&block->b_wait); 230 wake_up(&block->b_wait);