Skip to content

Commit

Permalink
vfs: Remove unnecessary flushing of block devices
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jan Kara authored and Al Viro committed Jul 22, 2012
1 parent a8c7176 commit d0e91b1
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions fs/sync.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/*
Expand All @@ -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;
Expand All @@ -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);
}
Expand Down

0 comments on commit d0e91b1

Please sign in to comment.