aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2012-07-03 16:45:33 +0200
committerAl Viro <viro@zeniv.linux.org.uk>2012-07-22 23:58:53 +0400
commitd0e91b13eb34d449922124c34f8a05e498daa089 (patch)
tree59124b824744aaf0657c57c986ed77c42d6fc748
parentvfs: Make sys_sync writeout also block device inodes (diff)
downloadlinux-dev-d0e91b13eb34d449922124c34f8a05e498daa089.tar.xz
linux-dev-d0e91b13eb34d449922124c34f8a05e498daa089.zip
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)
sb->s_op->sync_fs(sb, *(int *)arg);
}
-static void flush_one_bdev(struct block_device *bdev, void *arg)
+static void fdatawrite_one_bdev(struct block_device *bdev, void *arg)
{
- __sync_blockdev(bdev, 0);
+ filemap_fdatawrite(bdev->bd_inode->i_mapping);
}
-static void sync_one_bdev(struct block_device *bdev, void *arg)
+static void fdatawait_one_bdev(struct block_device *bdev, void *arg)
{
- sync_blockdev(bdev);
+ filemap_fdatawait(bdev->bd_inode->i_mapping);
}
/*
@@ -106,10 +106,10 @@ SYSCALL_DEFINE0(sync)
wakeup_flusher_threads(0, WB_REASON_SYNC);
iterate_supers(writeback_inodes_one_sb, NULL);
iterate_supers(sync_fs_one_sb, &nowait);
- iterate_bdevs(flush_one_bdev, NULL);
iterate_supers(sync_inodes_one_sb, NULL);
iterate_supers(sync_fs_one_sb, &wait);
- iterate_bdevs(sync_one_bdev, NULL);
+ iterate_bdevs(fdatawrite_one_bdev, NULL);
+ iterate_bdevs(fdatawait_one_bdev, NULL);
if (unlikely(laptop_mode))
laptop_sync_completion();
return 0;
@@ -125,10 +125,10 @@ static void do_sync_work(struct work_struct *work)
*/
iterate_supers(sync_inodes_one_sb, &nowait);
iterate_supers(sync_fs_one_sb, &nowait);
- iterate_bdevs(flush_one_bdev, NULL);
+ iterate_bdevs(fdatawrite_one_bdev, NULL);
iterate_supers(sync_inodes_one_sb, &nowait);
iterate_supers(sync_fs_one_sb, &nowait);
- iterate_bdevs(flush_one_bdev, NULL);
+ iterate_bdevs(fdatawrite_one_bdev, NULL);
printk("Emergency Sync complete\n");
kfree(work);
}