mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 03:10:12 +00:00
[PATCH] NLM: cleanup for blocked locks.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
80fec4c62e
commit
4f15e2b1f4
1 changed files with 6 additions and 12 deletions
|
@ -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 = █
|
|
||||||
|
|
||||||
/* 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);
|
||||||
|
|
Loading…
Reference in a new issue