diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 32b7daa41a42289f75ff714a3419ad2e3a96abe8..bab2387fba43722837b6877abfb02626943abc20 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1671,6 +1671,7 @@ extern void ext4_htree_free_dir_info(struct dir_private_info *p); /* fsync.c */ extern int ext4_sync_file(struct file *, int); +extern int ext4_flush_completed_IO(struct inode *); /* hash.c */ extern int ext4fs_dirhash(const char *name, int len, struct diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 9081d1060a5f7577663990ebf9b32f048bdfd549..627f7ae94ae5570a7de9312faa26d882eccfbee7 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -3533,6 +3533,12 @@ void ext4_ext_truncate(struct inode *inode) handle_t *handle; int err = 0; + /* + * finish any pending end_io work so we won't run the risk of + * converting any truncated blocks to initialized later + */ + ext4_flush_completed_IO(inode); + /* * probably first extent we're gonna free will be last in block */ diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c index c1a7bc923cf6084c84f32b91294ec5feecf8b92c..7829b287822a4207080c4089921e22418a855d93 100644 --- a/fs/ext4/fsync.c +++ b/fs/ext4/fsync.c @@ -75,7 +75,7 @@ static void dump_completed_IO(struct inode * inode) * to written. * The function return the number of pending IOs on success. */ -static int flush_completed_IO(struct inode *inode) +extern int ext4_flush_completed_IO(struct inode *inode) { ext4_io_end_t *io; struct ext4_inode_info *ei = EXT4_I(inode); @@ -169,7 +169,7 @@ int ext4_sync_file(struct file *file, int datasync) if (inode->i_sb->s_flags & MS_RDONLY) return 0; - ret = flush_completed_IO(inode); + ret = ext4_flush_completed_IO(inode); if (ret < 0) return ret;