aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2012-07-03 10:45:33 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-07-22 15:58:53 -0400
commitd0e91b13eb34d449922124c34f8a05e498daa089 (patch)
tree59124b824744aaf0657c57c986ed77c42d6fc748
parenta8c7176b6ded413d5044a00f1d05477b95a6d7ad (diff)
vfs: Remove unnecessary flushing of block devices
It is not necessary to write block devices twice. The reason why we first did flush and then proper sync is that for_each_bdev() { write_bdev() wait_for_completion() } is much slower than for_each_bdev() write_bdev() for_each_bdev() wait_for_completion() when there is bigger amount of data. But as is seen in the above, there's no real need to scan pages and submit them twice. We just need to separate the submission and waiting part. This patch does that. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/sync.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/fs/sync.c b/fs/sync.c
index 0b166f26362d..131ddae87a1d 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -85,14 +85,14 @@ static void sync_fs_one_sb(struct super_block *sb, void *arg)
85 sb->s_op->sync_fs(sb, *(int *)arg); 85 sb->s_op->sync_fs(sb, *(int *)arg);
86} 86}
87 87
88static void flush_one_bdev(struct block_device *bdev, void *arg) 88static void fdatawrite_one_bdev(struct block_device *bdev, void *arg)
89{ 89{
90 __sync_blockdev(bdev, 0); 90 filemap_fdatawrite(bdev->bd_inode->i_mapping);
91} 91}
92 92
93static void sync_one_bdev(struct block_device *bdev, void *arg) 93static void fdatawait_one_bdev(struct block_device *bdev, void *arg)
94{ 94{
95 sync_blockdev(bdev); 95 filemap_fdatawait(bdev->bd_inode->i_mapping);
96} 96}
97 97
98/* 98/*
@@ -106,10 +106,10 @@ SYSCALL_DEFINE0(sync)
106 wakeup_flusher_threads(0, WB_REASON_SYNC); 106 wakeup_flusher_threads(0, WB_REASON_SYNC);
107 iterate_supers(writeback_inodes_one_sb, NULL); 107 iterate_supers(writeback_inodes_one_sb, NULL);
108 iterate_supers(sync_fs_one_sb, &nowait); 108 iterate_supers(sync_fs_one_sb, &nowait);
109 iterate_bdevs(flush_one_bdev, NULL);
110 iterate_supers(sync_inodes_one_sb, NULL); 109 iterate_supers(sync_inodes_one_sb, NULL);
111 iterate_supers(sync_fs_one_sb, &wait); 110 iterate_supers(sync_fs_one_sb, &wait);
112 iterate_bdevs(sync_one_bdev, NULL); 111 iterate_bdevs(fdatawrite_one_bdev, NULL);
112 iterate_bdevs(fdatawait_one_bdev, NULL);
113 if (unlikely(laptop_mode)) 113 if (unlikely(laptop_mode))
114 laptop_sync_completion(); 114 laptop_sync_completion();
115 return 0; 115 return 0;
@@ -125,10 +125,10 @@ static void do_sync_work(struct work_struct *work)
125 */ 125 */
126 iterate_supers(sync_inodes_one_sb, &nowait); 126 iterate_supers(sync_inodes_one_sb, &nowait);
127 iterate_supers(sync_fs_one_sb, &nowait); 127 iterate_supers(sync_fs_one_sb, &nowait);
128 iterate_bdevs(flush_one_bdev, NULL); 128 iterate_bdevs(fdatawrite_one_bdev, NULL);
129 iterate_supers(sync_inodes_one_sb, &nowait); 129 iterate_supers(sync_inodes_one_sb, &nowait);
130 iterate_supers(sync_fs_one_sb, &nowait); 130 iterate_supers(sync_fs_one_sb, &nowait);
131 iterate_bdevs(flush_one_bdev, NULL); 131 iterate_bdevs(fdatawrite_one_bdev, NULL);
132 printk("Emergency Sync complete\n"); 132 printk("Emergency Sync complete\n");
133 kfree(work); 133 kfree(work);
134} 134}