From patchwork Tue Oct 20 17:33:40 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 7449271 Return-Path: X-Original-To: patchwork-linux-fsdevel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 2B2B49F1C3 for ; Tue, 20 Oct 2015 17:34:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2DDE42083B for ; Tue, 20 Oct 2015 17:34:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4827120842 for ; Tue, 20 Oct 2015 17:34:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753092AbbJTReN (ORCPT ); Tue, 20 Oct 2015 13:34:13 -0400 Received: from mail-qk0-f178.google.com ([209.85.220.178]:35481 "EHLO mail-qk0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753024AbbJTReG (ORCPT ); Tue, 20 Oct 2015 13:34:06 -0400 Received: by qkbl190 with SMTP id l190so10888008qkb.2 for ; Tue, 20 Oct 2015 10:34:04 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ODLvvnPPpWWIVe5iTg5eRdjXbd+OvPJFRTUC3bzixvo=; b=G5DdNduL1ZhyasKoLFLEhw/gtyi7oumHpM+zX0PbfsFgx62xP+M15CIFKd5EZQhvT2 GItuBIjZhKqB+zGU0kU9d0y7dTXepiwdJrCk3cEoK/B4ZUAa4Im6DYWJbQf4Kcept9eU eXiCowq6FVHPa+IIENZlWDSi83FMyRbBXulUKxk84L94g+UqUnOPz/kkB0dD70glpOsA XojVJWYbe3hO74jJ/uyrWAYSaOZ1DFf1fCWVEpBaZFyLYn1PhSTNrUZldjy6mYEac8WN bouWjHJAmoLm8ieJKbYm16EfeVih5fRZWAQRZckkPPX1p3nxZGMLVwsnJvVHrll6816g KjgA== X-Gm-Message-State: ALoCoQllGYYT7X7aSoPmjGlCRTOtyvQuOY8mEQalI1HjAkKY0yPojqQ33R6Bfox1Ykt4L8WWcwHA X-Received: by 10.55.19.14 with SMTP id d14mr5319125qkh.54.1445362444585; Tue, 20 Oct 2015 10:34:04 -0700 (PDT) Received: from tlielax.poochiereds.net ([2606:a000:1125:6079::d5a]) by smtp.googlemail.com with ESMTPSA id m26sm1640925qki.28.2015.10.20.10.34.03 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Oct 2015 10:34:04 -0700 (PDT) From: Jeff Layton X-Google-Original-From: Jeff Layton To: bfields@fieldses.org Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, Al Viro Subject: [PATCH v6 07/19] locks: create a new notifier chain for lease attempts Date: Tue, 20 Oct 2015 13:33:40 -0400 Message-Id: <1445362432-18869-8-git-send-email-jeff.layton@primarydata.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1445362432-18869-1-git-send-email-jeff.layton@primarydata.com> References: <1445362432-18869-1-git-send-email-jeff.layton@primarydata.com> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP With the new file caching infrastructure in nfsd, we can end up holding files open for an indefinite period of time, even when they are still idle. This may prevent the kernel from handing out leases on the file, which is something we don't want to block. Fix this by running a SRCU notifier call chain whenever any lease attempt is made. nfsd can then purge the nfsd_file cache of any entries associated with that inode, and use the fput_global infrastructure to make sure the final __fput is done. Since SRCU is only conditionally compiled in, we must only define the new chain if it's enabled, and users of the chain must ensure that SRCU is enabled. Signed-off-by: Jeff Layton --- fs/locks.c | 37 +++++++++++++++++++++++++++++++++++++ include/linux/fs.h | 1 + 2 files changed, 38 insertions(+) diff --git a/fs/locks.c b/fs/locks.c index 2a54c800a223..add3eeb79ace 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1780,6 +1780,40 @@ int generic_setlease(struct file *filp, long arg, struct file_lock **flp, } EXPORT_SYMBOL(generic_setlease); +#if IS_ENABLED(CONFIG_SRCU) +/* + * Kernel subsystems can register to be notified on any attempt to set + * a new lease with the lease_notifier_chain. This is used by (e.g.) nfsd + * to close files that it may have cached when there is an attempt to set a + * conflicting lease. + */ +struct srcu_notifier_head lease_notifier_chain; +EXPORT_SYMBOL_GPL(lease_notifier_chain); + +static inline void +lease_notifier_chain_init(void) +{ + srcu_init_notifier_head(&lease_notifier_chain); +} + +static inline void +setlease_notifier(long arg, struct file_lock *lease) +{ + if (arg != F_UNLCK) + srcu_notifier_call_chain(&lease_notifier_chain, arg, lease); +} +#else /* !IS_ENABLED(CONFIG_SRCU) */ +static inline void +lease_notifier_chain_init(void) +{ +} + +static inline void +setlease_notifier(long arg, struct file_lock *lease) +{ +} +#endif /* IS_ENABLED(CONFIG_SRCU) */ + /** * vfs_setlease - sets a lease on an open file * @filp: file pointer @@ -1800,6 +1834,8 @@ EXPORT_SYMBOL(generic_setlease); int vfs_setlease(struct file *filp, long arg, struct file_lock **lease, void **priv) { + if (lease) + setlease_notifier(arg, *lease); if (filp->f_op->setlease) return filp->f_op->setlease(filp, arg, lease, priv); else @@ -2696,6 +2732,7 @@ static int __init filelock_init(void) for_each_possible_cpu(i) INIT_HLIST_HEAD(per_cpu_ptr(&file_lock_list, i)); + lease_notifier_chain_init(); return 0; } diff --git a/include/linux/fs.h b/include/linux/fs.h index 72d8a844c692..c0df75909dd4 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1042,6 +1042,7 @@ extern int fcntl_setlease(unsigned int fd, struct file *filp, long arg); extern int fcntl_getlease(struct file *filp); /* fs/locks.c */ +extern struct srcu_notifier_head lease_notifier_chain; void locks_free_lock_context(struct file_lock_context *ctx); void locks_free_lock(struct file_lock *fl); extern void locks_init_lock(struct file_lock *);