From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S270406AbUJUG0O (ORCPT ); Thu, 21 Oct 2004 02:26:14 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S270397AbUJTT03 (ORCPT ); Wed, 20 Oct 2004 15:26:29 -0400 Received: from 213-239-205-147.clients.your-server.de ([213.239.205.147]:51362 "EHLO debian.tglx.de") by vger.kernel.org with ESMTP id S270346AbUJTTXo (ORCPT ); Wed, 20 Oct 2004 15:23:44 -0400 Subject: [PATCH] lockd: replace semaphore, sleep_on From: Thomas Gleixner Reply-To: tglx@linutronix.de To: Andrew Morton Cc: Ingo Molnar , LKML , Al Viro , Matthew Wilcox Content-Type: text/plain Organization: linutronix Message-Id: <1098299743.20821.54.camel@thomas> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 Date: Wed, 20 Oct 2004 21:15:43 +0200 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Use wait_event, completion instead of the obsolete sleep_on functions and the abused semaphore Signed-off-by: Thomas Gleixner Acked-by: Ingo Molnar --- 2.6.9-bk-041020-thomas/fs/lockd/clntlock.c | 12 +++++++----- 2.6.9-bk-041020-thomas/fs/lockd/svc.c | 23 +++++++++++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) diff -puN fs/lockd/svc.c~lockd fs/lockd/svc.c --- 2.6.9-bk-041020/fs/lockd/svc.c~lockd 2004-10-20 15:56:52.000000000 +0200 +++ 2.6.9-bk-041020-thomas/fs/lockd/svc.c 2004-10-20 15:56:52.000000000 +0200 @@ -46,7 +46,7 @@ static pid_t nlmsvc_pid; int nlmsvc_grace_period; unsigned long nlmsvc_timeout; -static DECLARE_MUTEX_LOCKED(lockd_start); +static DECLARE_WAIT_QUEUE_HEAD(lockd_start); static DECLARE_WAIT_QUEUE_HEAD(lockd_exit); /* @@ -109,7 +109,7 @@ lockd(struct svc_rqst *rqstp) * Let our maker know we're running. */ nlmsvc_pid = current->pid; - up(&lockd_start); + wake_up(&lockd_start); daemonize("lockd"); @@ -258,8 +258,15 @@ lockd_up(void) "lockd_up: create thread failed, error=%d\n", error); goto destroy_and_out; } - down(&lockd_start); - + /* + * Wait for the lockd process to start, but since we're holding + * the lockd semaphore, we can't wait around forever ... + */ + if (wait_event_interruptible_timeout(lockd_start, + nlmsvc_pid != 0, HZ) <= 0) { + printk(KERN_WARNING + "lockd_down: lockd failed to start\n"); + } /* * Note: svc_serv structures have an initial use count of 1, * so we exit through here on both success and failure. @@ -298,16 +305,12 @@ lockd_down(void) * Wait for the lockd process to exit, but since we're holding * the lockd semaphore, we can't wait around forever ... */ - clear_thread_flag(TIF_SIGPENDING); - interruptible_sleep_on_timeout(&lockd_exit, HZ); - if (nlmsvc_pid) { + if (wait_event_interruptible_timeout(lockd_exit, + nlmsvc_pid == 0, HZ) <= 0) { printk(KERN_WARNING "lockd_down: lockd failed to exit, clearing pid\n"); nlmsvc_pid = 0; } - spin_lock_irq(¤t->sighand->siglock); - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); out: up(&nlmsvc_sema); } diff -puN fs/lockd/clntlock.c~lockd fs/lockd/clntlock.c --- 2.6.9-bk-041020/fs/lockd/clntlock.c~lockd 2004-10-20 15:56:52.000000000 +0200 +++ 2.6.9-bk-041020-thomas/fs/lockd/clntlock.c 2004-10-20 15:56:52.000000000 +0200 @@ -6,6 +6,7 @@ * Copyright (C) 1996, Olaf Kirch */ +#include #include #include #include @@ -32,7 +33,7 @@ static int reclaimer(void *ptr); */ struct nlm_wait { struct nlm_wait * b_next; /* linked list */ - wait_queue_head_t b_wait; /* where to wait on */ + struct completion b_wait; /* where to wait on */ struct nlm_host * b_host; struct file_lock * b_lock; /* local file lock */ unsigned short b_reclaim; /* got to reclaim lock */ @@ -53,7 +54,7 @@ nlmclnt_block(struct nlm_host *host, str block.b_host = host; block.b_lock = fl; - init_waitqueue_head(&block.b_wait); + init_completion(&block.b_wait); block.b_status = NLM_LCK_BLOCKED; block.b_next = nlm_blocked; nlm_blocked = █ @@ -69,7 +70,8 @@ nlmclnt_block(struct nlm_host *host, str * a 1 minute timeout would do. See the comment before * nlmclnt_lock for an explanation. */ - sleep_on_timeout(&block.b_wait, 30*HZ); + + wait_for_completion_timeout(&block.b_wait, 30*HZ); for (head = &nlm_blocked; *head; head = &(*head)->b_next) { if (*head == &block) { @@ -118,7 +120,7 @@ nlmclnt_grant(struct nlm_lock *lock) * wake up the caller. */ block->b_status = NLM_LCK_GRANTED; - wake_up(&block->b_wait); + complete(&block->b_wait); return nlm_granted; } @@ -233,7 +235,7 @@ restart: for (block = nlm_blocked; block; block = block->b_next) { if (block->b_host == host) { block->b_status = NLM_LCK_DENIED_GRACE_PERIOD; - wake_up(&block->b_wait); + complete(&block->b_wait); } } _