>From 3627f07f280e519db66056f39a23abd267400218 Mon Sep 17 00:00:00 2001 From: Hans Reiser Date: Wed, 7 May 2008 21:04:39 +0300 Subject: [PATCH] VFS: introduce sync_inodes superblock operation This patch adds new operation to struct super_operations - sync_inodes, generic implementaion and changes fs-writeback.c:sync_sb_inodes() to call filesystem's sync_inodes if it is defined or generic implementaion otherwise. This new operation allows filesystem to decide itself what to flush. Reiser4 flushes dirty pages on basic of atoms, not of inodes. sync_sb_inodes used to call address space flushing method (writepages) for every dirty inode. For reiser4 it caused having to commit atoms unnecessarily often. This turned into substantial slowdown. Having this method helped to fix that problem. Signed-off-by: Artem Bityutskiy --- fs/fs-writeback.c | 5 ++++- include/linux/fs.h | 2 ++ 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 25adfc3..495214d 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -531,7 +531,10 @@ EXPORT_SYMBOL_GPL(generic_sync_sb_inodes); static void sync_sb_inodes(struct super_block *sb, struct writeback_control *wbc) { - generic_sync_sb_inodes(sb, wbc); + if (sb->s_op->sync_inodes) + sb->s_op->sync_inodes(sb, wbc); + else + generic_sync_sb_inodes(sb, wbc); } /* diff --git a/include/linux/fs.h b/include/linux/fs.h index 85ee6cf..777494b 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1307,6 +1307,8 @@ struct super_operations { void (*clear_inode) (struct inode *); void (*umount_begin) (struct super_block *); + void (*sync_inodes)(struct super_block *sb, + struct writeback_control *wbc); int (*show_options)(struct seq_file *, struct vfsmount *); int (*show_stats)(struct seq_file *, struct vfsmount *); #ifdef CONFIG_QUOTA -- 1.5.4.1