[PATCH] NLM: cleanup for blocked locks.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Trond Myklebust 2005-06-22 17:16:31 +00:00
parent 80fec4c62e
commit 4f15e2b1f4

View file

@ -31,7 +31,7 @@ static int reclaimer(void *ptr);
* This is the representation of a blocked client lock. * This is the representation of a blocked client lock.
*/ */
struct nlm_wait { struct nlm_wait {
struct nlm_wait * b_next; /* linked list */ struct list_head b_list; /* linked list */
wait_queue_head_t b_wait; /* where to wait on */ wait_queue_head_t b_wait; /* where to wait on */
struct nlm_host * b_host; struct nlm_host * b_host;
struct file_lock * b_lock; /* local file lock */ struct file_lock * b_lock; /* local file lock */
@ -39,7 +39,7 @@ struct nlm_wait {
u32 b_status; /* grant callback status */ u32 b_status; /* grant callback status */
}; };
static struct nlm_wait * nlm_blocked; static LIST_HEAD(nlm_blocked);
/* /*
* Block on a lock * Block on a lock
@ -55,8 +55,7 @@ nlmclnt_block(struct nlm_host *host, struct file_lock *fl, u32 *statp)
block.b_lock = fl; block.b_lock = fl;
init_waitqueue_head(&block.b_wait); init_waitqueue_head(&block.b_wait);
block.b_status = NLM_LCK_BLOCKED; block.b_status = NLM_LCK_BLOCKED;
block.b_next = nlm_blocked; list_add(&block.b_list, &nlm_blocked);
nlm_blocked = &block;
/* Remember pseudo nsm state */ /* Remember pseudo nsm state */
pstate = host->h_state; pstate = host->h_state;
@ -71,12 +70,7 @@ nlmclnt_block(struct nlm_host *host, struct file_lock *fl, u32 *statp)
*/ */
sleep_on_timeout(&block.b_wait, 30*HZ); sleep_on_timeout(&block.b_wait, 30*HZ);
for (head = &nlm_blocked; *head; head = &(*head)->b_next) { list_del(&block.b_list);
if (*head == &block) {
*head = block.b_next;
break;
}
}
if (!signalled()) { if (!signalled()) {
*statp = block.b_status; *statp = block.b_status;
@ -105,7 +99,7 @@ nlmclnt_grant(struct nlm_lock *lock)
* Look up blocked request based on arguments. * Look up blocked request based on arguments.
* Warning: must not use cookie to match it! * Warning: must not use cookie to match it!
*/ */
for (block = nlm_blocked; block; block = block->b_next) { list_for_each_entry(block, &nlm_blocked, b_list) {
if (nlm_compare_locks(block->b_lock, &lock->fl)) if (nlm_compare_locks(block->b_lock, &lock->fl))
break; break;
} }
@ -230,7 +224,7 @@ reclaimer(void *ptr)
host->h_reclaiming = 0; host->h_reclaiming = 0;
/* Now, wake up all processes that sleep on a blocked lock */ /* Now, wake up all processes that sleep on a blocked lock */
for (block = nlm_blocked; block; block = block->b_next) { list_for_each_entry(block, &nlm_blocked, b_list) {
if (block->b_host == host) { if (block->b_host == host) {
block->b_status = NLM_LCK_DENIED_GRACE_PERIOD; block->b_status = NLM_LCK_DENIED_GRACE_PERIOD;
wake_up(&block->b_wait); wake_up(&block->b_wait);