Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752760AbaDYWwk (ORCPT ); Fri, 25 Apr 2014 18:52:40 -0400 Received: from mailrelay010.isp.belgacom.be ([195.238.6.177]:49761 "EHLO mailrelay010.isp.belgacom.be" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751600AbaDYWwi (ORCPT ); Fri, 25 Apr 2014 18:52:38 -0400 X-Belgacom-Dynamic: yes X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtMVAOHmWlNXQASl/2dsb2JhbABZgwarVJlwAgKBEhd0glMTHCMYgQIkE4hFAcpfhVqIf4RAAQOOdooOAZJcgzM7 Date: Sat, 26 Apr 2014 00:54:24 +0200 From: Fabian Frederick To: linux-kernel Cc: jack , hch , Viro , tytso , akpm Subject: [PATCH V2 1/2] FS: Add generic data flush to fsync Message-Id: <20140426005424.9268324f9911e60a0e20cb59@skynet.be> X-Mailer: Sylpheed 3.3.0 (GTK+ 2.24.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch issues a flush in generic_file_fsync. (Modern filesystems already do it) -Behaviour can be reversed using /sys/devices/.../cache_type -Filesystems can also call __generic_file_fsync with bool flush false Suggested-by: Jan Kara Suggested-by: Christoph Hellwig Cc: Jan Kara Cc: Christoph Hellwig Cc: Alexander Viro Cc: "Theodore Ts'o" Cc: Andrew Morton Signed-off-by: Fabian Frederick --- fs/libfs.c | 36 +++++++++++++++++++++++++++++++++--- include/linux/fs.h | 1 + 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/fs/libfs.c b/fs/libfs.c index a184424..7d4711d 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -3,6 +3,7 @@ * Library for filesystems writers. */ +#include #include #include #include @@ -923,16 +924,20 @@ struct dentry *generic_fh_to_parent(struct super_block *sb, struct fid *fid, EXPORT_SYMBOL_GPL(generic_fh_to_parent); /** - * generic_file_fsync - generic fsync implementation for simple filesystems + * __generic_file_fsync - generic fsync implementation for simple filesystems + * * @file: file to synchronize + * @start: start offset in bytes + * @end: end offset in bytes (inclusive) * @datasync: only synchronize essential metadata if true + * @flush: bool to issue the flush * * This is a generic implementation of the fsync method for simple * filesystems which track all non-inode metadata in the buffers list * hanging off the address_space structure. */ -int generic_file_fsync(struct file *file, loff_t start, loff_t end, - int datasync) +int __generic_file_fsync(struct file *file, loff_t start, loff_t end, + int datasync, bool flush) { struct inode *inode = file->f_mapping->host; int err; @@ -952,10 +957,35 @@ int generic_file_fsync(struct file *file, loff_t start, loff_t end, err = sync_inode_metadata(inode, 1); if (ret == 0) ret = err; + if (flush == true) { + err = blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, + NULL); + if (ret == 0) + ret = err; + } + out: mutex_unlock(&inode->i_mutex); return ret; } +EXPORT_SYMBOL(__generic_file_fsync); + +/** + * generic_file_fsync - generic fsync implementation for simple filesystems + * @file: file to synchronize + * @start: start offset in bytes + * @end: end offset in bytes (inclusive) + * @datasync: only synchronize essential metadata if true + * + * Calls __generic_file_fsync with flush = true + */ + +int generic_file_fsync(struct file *file, loff_t start, loff_t end, + int datasync) +{ + return __generic_file_fsync(file, start, end, datasync, true); + +} EXPORT_SYMBOL(generic_file_fsync); /** diff --git a/include/linux/fs.h b/include/linux/fs.h index 7a9c5bc..ecd6adea 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2590,6 +2590,7 @@ extern ssize_t simple_read_from_buffer(void __user *to, size_t count, extern ssize_t simple_write_to_buffer(void *to, size_t available, loff_t *ppos, const void __user *from, size_t count); +extern int __generic_file_fsync(struct file *, loff_t, loff_t, int, bool); extern int generic_file_fsync(struct file *, loff_t, loff_t, int); extern int generic_check_addressable(unsigned, u64); -- 1.8.4.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/