diff options
author | Christoph Hellwig <hch@lst.de> | 2009-09-05 21:42:42 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2009-09-05 21:42:42 -0400 |
commit | 5f3481e9a80c240f169b36ea886e2325b9aeb745 (patch) | |
tree | 435a8cf2be9c81a545f42d5af881450f8d121e74 /fs/ext4/fsync.c | |
parent | d0646f7b636d067d715fab52a2ba9c6f0f46b0d7 (diff) | |
download | linux-stable-5f3481e9a80c240f169b36ea886e2325b9aeb745.tar.gz linux-stable-5f3481e9a80c240f169b36ea886e2325b9aeb745.tar.bz2 linux-stable-5f3481e9a80c240f169b36ea886e2325b9aeb745.zip |
ext4: fix cache flush in ext4_sync_file
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>
Diffstat (limited to 'fs/ext4/fsync.c')
-rw-r--r-- | fs/ext4/fsync.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c index 83cf6415f599..ab418c0f502d 100644 --- a/fs/ext4/fsync.c +++ b/fs/ext4/fsync.c @@ -92,9 +92,9 @@ int ext4_sync_file(struct file *file, struct dentry *dentry, int datasync) .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; } |