On Fri 27-09-13 19:54:03, Maxim Patlasov wrote: > While handling punch-hole fallocate, it's useless to truncate page cache > before removing the range from extent tree (or block map in indirect case) > because page cache can be re-populated (by read-ahead or read(2) or mmap-ed > read) immediately after truncating page cache, but before updating extent > tree (or block map). In that case the user will see stale data even after > fallocate is completed. > > Changed in v2 (Thanks to Jan Kara): > - Until the problem of data corruption resulting from pages backed by > already freed blocks is fully resolved, the simple thing we can do now > is to add another truncation of pagecache after punch hole is done. The patch looks good. You can add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > Signed-off-by: Maxim Patlasov <mpatlasov@xxxxxxxxxxxxx> > --- > fs/ext4/inode.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 0d424d7..2984ddf 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -3621,6 +3621,12 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) > up_write(&EXT4_I(inode)->i_data_sem); > if (IS_SYNC(inode)) > ext4_handle_sync(handle); > + > + /* Now release the pages again to reduce race window */ > + if (last_block_offset > first_block_offset) > + truncate_pagecache_range(inode, first_block_offset, > + last_block_offset); > + > inode->i_mtime = inode->i_ctime = ext4_current_time(inode); > ext4_mark_inode_dirty(handle, inode); > out_stop: > -- Jan Kara <jack@xxxxxxx> SUSE Labs, CR -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html