| From 889c3508467677a534209736351f028a5b925cc2 Mon Sep 17 00:00:00 2001 |
| From: Christoph Hellwig <hch@lst.de> |
| Date: Sat, 5 Sep 2009 21:42:42 -0400 |
| Subject: [PATCH 16/85] ext4: fix cache flush in ext4_sync_file |
| |
| (cherry picked from commit 5f3481e9a80c240f169b36ea886e2325b9aeb745) |
| |
| We need to flush the write cache unconditionally in ->fsync, otherwise |
| writes into already allocated blocks can get lost. Writes into fully |
| allocated files are very common when using disk images for |
| virtualization, and without this fix can easily lose data after |
| an fdatasync, which is the typical implementation for a cache flush on |
| the virtual drive. |
| |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Acked-by: Eric Sandeen <sandeen@redhat.com> |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| --- |
| fs/ext4/fsync.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/fs/ext4/fsync.c |
| +++ b/fs/ext4/fsync.c |
| @@ -92,9 +92,9 @@ int ext4_sync_file(struct file *file, st |
| .nr_to_write = 0, /* sys_fsync did this */ |
| }; |
| ret = sync_inode(inode, &wbc); |
| - if (journal && (journal->j_flags & JBD2_BARRIER)) |
| - blkdev_issue_flush(inode->i_sb->s_bdev, NULL); |
| } |
| out: |
| + if (journal && (journal->j_flags & JBD2_BARRIER)) |
| + blkdev_issue_flush(inode->i_sb->s_bdev, NULL); |
| return ret; |
| } |