From patchwork Mon Jun 1 21:50:27 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Eric W. Biederman" X-Patchwork-Id: 27281 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n51LpMau026591 for ; Mon, 1 Jun 2009 21:51:23 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755906AbZFAVvK (ORCPT ); Mon, 1 Jun 2009 17:51:10 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755655AbZFAVvH (ORCPT ); Mon, 1 Jun 2009 17:51:07 -0400 Received: from out01.mta.xmission.com ([166.70.13.231]:43321 "EHLO out01.mta.xmission.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751798AbZFAVu5 (ORCPT ); Mon, 1 Jun 2009 17:50:57 -0400 Received: from in02.mta.xmission.com ([166.70.13.52]) by out01.mta.xmission.com with esmtp (Exim 4.62) (envelope-from ) id 1MBFPX-0007vX-An; Mon, 01 Jun 2009 15:51:15 -0600 Received: from [76.21.114.89] (helo=fess.ebiederm.org) by in02.mta.xmission.com with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.69) (envelope-from ) id 1MBFPG-00048C-Kv; Mon, 01 Jun 2009 15:50:59 -0600 Received: from fess.ebiederm.org (localhost [127.0.0.1]) by fess.ebiederm.org (8.14.3/8.14.3/Debian-4) with ESMTP id n51Lot4x017069; Mon, 1 Jun 2009 14:50:55 -0700 Received: (from eric@localhost) by fess.ebiederm.org (8.14.3/8.14.3/Submit) id n51Lotm8017068; Mon, 1 Jun 2009 14:50:55 -0700 From: "Eric W. Biederman" To: Al Viro Cc: , , , , Hugh Dickins , Tejun Heo , Alexey Dobriyan , Linus Torvalds , Alan Cox , Greg Kroah-Hartman , Nick Piggin , Andrew Morton , Christoph Hellwig , "Eric W. Biederman" , "Eric W. Biederman" Date: Mon, 1 Jun 2009 14:50:27 -0700 Message-Id: <1243893048-17031-2-git-send-email-ebiederm@xmission.com> X-Mailer: git-send-email 1.6.3.1.54.g99dd.dirty In-Reply-To: References: X-XM-SPF: eid=; ; ; mid=; ; ; hst=in02.mta.xmission.com; ; ; ip=76.21.114.89; ; ; frm=ebiederm@xmission.com; ; ; spf=neutral X-SA-Exim-Connect-IP: 76.21.114.89 X-SA-Exim-Rcpt-To: viro@ZenIV.linux.org.uk, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, hugh@veritas.com, tj@kernel.org, adobriyan@gmail.com, torvalds@linux-foundation.org, alan@lxorguk.ukuu.org.uk, gregkh@suse.de, npiggin@suse.de, akpm@linux-foundation.org, hch@infradead.org, ebiederm@maxwell.aristanetworks.com, ebiederm@aristanetworks.com X-SA-Exim-Mail-From: ebiederm@xmission.com X-Spam-DCC: XMission; sa02 1397; Body=1 Fuz1=1 Fuz2=1 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on sa02.xmission.com X-Spam-Level: X-Spam-Status: No, score=-2.1 required=8.0 tests=ALL_TRUSTED,BAYES_00, DCC_CHECK_NEGATIVE, FVGT_m_MULTI_ODD, T_TM2_M_HEADER_IN_MSG, T_TooManySym_01, T_TooManySym_02, UNTRUSTED_Relay, XMNoVowels, XM_SPF_Neutral autolearn=disabled version=3.2.5 X-Spam-Combo: ;Al Viro X-Spam-Relay-Country: X-Spam-Report: * -1.8 ALL_TRUSTED Passed through trusted hosts only via SMTP * 1.5 XMNoVowels Alpha-numberic number with no vowels * 0.0 T_TM2_M_HEADER_IN_MSG BODY: T_TM2_M_HEADER_IN_MSG * -2.6 BAYES_00 BODY: Bayesian spam probability is 0 to 1% * [score: 0.0000] * -0.0 DCC_CHECK_NEGATIVE Not listed in DCC * [sa02 1397; Body=1 Fuz1=1 Fuz2=1] * 0.4 FVGT_m_MULTI_ODD Contains multiple odd letter combinations * 0.0 T_TooManySym_01 4+ unique symbols in subject * 0.0 XM_SPF_Neutral SPF-Neutral * 0.0 T_TooManySym_02 5+ unique symbols in subject * 0.4 UNTRUSTED_Relay Comes from a non-trusted relay Subject: [PATCH 02/23] vfs: Implement unpoll_file. X-SA-Exim-Version: 4.2.1 (built Thu, 25 Oct 2007 00:26:12 +0000) X-SA-Exim-Scanned: Yes (on in02.mta.xmission.com) Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: Eric W. Biederman During a revoke operation it is necessary to stop using all state that is managed by the underlying file operations implementation. The poll wait queue is one part of that state. unpoll_file achieves that by walking through a specified waitqueue. Finding any entries that were added by select or poll of that file descriptor and awakening them. If action was taken unpoll sleeps and repeats until the waitqueue has no entries for the spcified file. Signed-off-by: Eric W. Biederman --- fs/select.c | 31 +++++++++++++++++++++++++++++++ include/linux/poll.h | 2 ++ 2 files changed, 33 insertions(+), 0 deletions(-) diff --git a/fs/select.c b/fs/select.c index 0fe0e14..bd30fe8 100644 --- a/fs/select.c +++ b/fs/select.c @@ -941,3 +941,34 @@ SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds, return ret; } #endif /* HAVE_SET_RESTORE_SIGMASK */ + +#ifdef CONFIG_FILE_HOTPLUG +static int unpoll_file_once(wait_queue_head_t *q, struct file *file) +{ + unsigned long flags; + wait_queue_t *curr, *next; + int found = 0; + + spin_lock_irqsave(&q->lock, flags); + list_for_each_entry_safe(curr, next, &q->task_list, task_list) { + struct poll_table_entry *entry; + if (curr->func != pollwake) + continue; + entry = container_of(curr, struct poll_table_entry, wait); + if (entry->filp != file) + continue; + curr->func(curr, TASK_NORMAL, 0, NULL); + found = 1; + } + spin_unlock_irqrestore(&q->lock, flags); + + return found; +} + +void unpoll_file(wait_queue_head_t *q, struct file *file) +{ + while (unpoll_file_once(q, file)) + schedule_timeout_uninterruptible(1); +} +EXPORT_SYMBOL(unpoll_file); +#endif diff --git a/include/linux/poll.h b/include/linux/poll.h index 8c24ef8..d388620 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h @@ -131,6 +131,8 @@ extern int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp, extern int poll_select_set_timeout(struct timespec *to, long sec, long nsec); +extern void unpoll_file(wait_queue_head_t *q, struct file *file); + #endif /* KERNEL */ #endif /* _LINUX_POLL_H */