From patchwork Wed Dec 19 17:32:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Theodore Ts'o X-Patchwork-Id: 1016211 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ext4-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=mit.edu Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43Khlv6ZT5z9s8J for ; Thu, 20 Dec 2018 04:32:11 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729560AbeLSRcL (ORCPT ); Wed, 19 Dec 2018 12:32:11 -0500 Received: from dmz-mailsec-scanner-1.mit.edu ([18.9.25.12]:52576 "EHLO dmz-mailsec-scanner-1.mit.edu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728697AbeLSRcL (ORCPT ); Wed, 19 Dec 2018 12:32:11 -0500 X-AuditID: 1209190c-7c5ff700000014b1-3e-5c1a80994738 Received: from mailhub-auth-1.mit.edu ( [18.9.21.35]) (using TLS with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by dmz-mailsec-scanner-1.mit.edu (Symantec Messaging Gateway) with SMTP id 0B.81.05297.9908A1C5; Wed, 19 Dec 2018 12:32:09 -0500 (EST) Received: from outgoing.mit.edu (OUTGOING-AUTH-1.MIT.EDU [18.9.28.11]) by mailhub-auth-1.mit.edu (8.14.7/8.9.2) with ESMTP id wBJHW8jQ006262; Wed, 19 Dec 2018 12:32:09 -0500 Received: from callcc.thunk.org (guestnat-104-133-0-101.corp.google.com [104.133.0.101] (may be forged)) (authenticated bits=0) (User authenticated as tytso@ATHENA.MIT.EDU) by outgoing.mit.edu (8.14.7/8.12.4) with ESMTP id wBJHW7di003129 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 19 Dec 2018 12:32:08 -0500 Received: by callcc.thunk.org (Postfix, from userid 15806) id 96F0F7A51B5; Wed, 19 Dec 2018 12:32:07 -0500 (EST) From: "Theodore Ts'o" To: Ext4 Developers List Cc: "Theodore Ts'o" Subject: [PATCH] ext4: force inode writes when nfsd calls commit_metadata() Date: Wed, 19 Dec 2018 12:32:04 -0500 Message-Id: <20181219173204.716-1-tytso@mit.edu> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrCIsWRmVeSWpSXmKPExsUixCmqrDuzQSrG4PRtU4uZ8+6wWdzv6mJ2 YPJo2X+NzePzJrkApigum5TUnMyy1CJ9uwSujFsXrzEV7BOuWDzlHXsD43/+LkZODgkBE4kz XfNYuhi5OIQE1jBJXNy3iR3C2cgo0fNsLyNIlZDAKyaJ5iYjCLtI4kVjC1ARBwebgKrErjnR IGERAVOJi4eWsICEmQWUJU5+1wcJCwt4S/zvuskKEmYBqr733xkkzCtgIHFu504miBPkJRp2 bWaHiAtKnJz5hAXEZgaKN2+dzTyBkW8WktQsJKkFjEyrGGVTcqt0cxMzc4pTk3WLkxPz8lKL dA31cjNL9FJTSjcxggNLkmcH45k3XocYBTgYlXh4Z0RJxQixJpYVV+YeYpTkYFIS5WW3BArx JeWnVGYkFmfEF5XmpBYfYpTgYFYS4b1hApTjTUmsrEotyodJSXOwKInz/hZ5HC0kkJ5Ykpqd mlqQWgSTleHgUJLgXVgP1ChYlJqeWpGWmVOCkGbi4AQZzgM0PAukhre4IDG3ODMdIn+KUVFK nPcrSEIAJJFRmgfXC4r8jFaG1FeM4kCvCPNWgFTxAJMGXPcroMFMQINztjCBDC5JREhJNTCW 7Hxlsjbgl6pes6DMyho+9/8xT5c7fVr26pDx1/LwPSqfN66WX8TMJuat8qhSJPl49I0JN7YG XKwyZDzl6uLxVZ7b8+CyCdN+enrbPeyXlObcbLRIknP92mfsYhlfOo87L9jPNuNP0TfBEB8n q8sPfYJ2Wb35onuQda0183Nd1eR/JwMPv4pSYinOSDTUYi4qTgQAEvm2otcCAAA= Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Some time back, nfsd switched from calling vfs_fsync() to using a new commit_metadata() hook in export_operations(). If the file system did not provide a commit_metadata() hook, it fell back to using sync_inode_metadata(). Unfortunately doesn't work on all file systems. In particular, it doesn't work on ext4 due to how the inode gets journalled --- the VFS writeback code never ends up calling ext4_write_inode(). So we need to provide our own ext4_nfs_commit_metdata() method which calls ext4_write_inode() directly. Google-Bug-Id: 121195940 Signed-off-by: Theodore Ts'o --- fs/ext4/super.c | 12 ++++++++++++ include/trace/events/ext4.h | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index fc9071081600..378977cf8c19 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1202,6 +1202,17 @@ static struct dentry *ext4_fh_to_parent(struct super_block *sb, struct fid *fid, ext4_nfs_get_inode); } +static int ext4_nfs_commit_metadata(struct inode *inode) +{ + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL + }; + + trace_ext4_nfs_commit_metadata(inode); + ext4_write_inode(inode, &wbc); + return 0; +} + /* * Try to release metadata pages (indirect blocks, directories) which are * mapped via the block device. Since these pages could have journal heads @@ -1406,6 +1417,7 @@ static const struct export_operations ext4_export_ops = { .fh_to_dentry = ext4_fh_to_dentry, .fh_to_parent = ext4_fh_to_parent, .get_parent = ext4_get_parent, + .commit_metadata = ext4_nfs_commit_metadata, }; enum { diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 698e0d8a5ca4..d68e9e536814 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -226,6 +226,26 @@ TRACE_EVENT(ext4_drop_inode, (unsigned long) __entry->ino, __entry->drop) ); +TRACE_EVENT(ext4_nfs_commit_metadata, + TP_PROTO(struct inode *inode), + + TP_ARGS(inode), + + TP_STRUCT__entry( + __field( dev_t, dev ) + __field( ino_t, ino ) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + ), + + TP_printk("dev %d,%d ino %lu", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->ino) +); + TRACE_EVENT(ext4_mark_inode_dirty, TP_PROTO(struct inode *inode, unsigned long IP),