The patch titled introduce write_begin write_end aops important fix has been removed from the -mm tree. Its filename was introduce-write_begin-write_end-aops-important-fix.patch This patch was dropped because it was folded into fs-introduce-write_begin-write_end-and-perform_write-aops.patch ------------------------------------------------------ Subject: introduce write_begin write_end aops important fix From: Nick Piggin <npiggin@xxxxxxx> Credit for these next 4 patches goes to Hugh. He found and fixed the problem, I just split them up and added a bit of a changelog and hopefully no new bugs. When running kbuild stress testing, it data corruptions on ext2 were noticed occasionally. The page being written to by write(2) was being unlocked in generic_write_end before updating i_size, and that renders an extending-write vulnerable to have its newly written data zeroed out if writepage comes at the wrong time and finds the page unlocked but i_size is not yet updated. Fortunately ext3 wasn't affected by this bug, but ext2 and others using generic_write_end would be. Signed-off-by: Hugh Dickins <hugh@xxxxxxxxxxx> Signed-off-by: Nick Piggin <npiggin@xxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- fs/buffer.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff -puN fs/buffer.c~introduce-write_begin-write_end-aops-important-fix fs/buffer.c --- a/fs/buffer.c~introduce-write_begin-write_end-aops-important-fix +++ a/fs/buffer.c @@ -2039,19 +2039,22 @@ int generic_write_end(struct file *file, copied = block_write_end(file, mapping, pos, len, copied, page, fsdata); - unlock_page(page); - mark_page_accessed(page); /* XXX: put this in caller? */ - page_cache_release(page); - /* * No need to use i_size_read() here, the i_size * cannot change under us because we hold i_mutex. + * + * But it's important to update i_size while still holding page lock: + * page writeout could otherwise come in and zero beyond i_size. */ if (pos+copied > inode->i_size) { i_size_write(inode, pos+copied); mark_inode_dirty(inode); } + unlock_page(page); + mark_page_accessed(page); + page_cache_release(page); + return copied; } EXPORT_SYMBOL(generic_write_end); _ Patches currently in -mm which might be from npiggin@xxxxxxx are origin.patch remove-zero_page.patch mm-use-lockless-radix-tree-probe.patch mm-improve-find_lock_page.patch mm-clarify-__add_to_swap_cache-locking.patch radix-tree-use-indirect-bit.patch calculation-of-pgoff-in-do_linear_fault-uses-mixed.patch fs-fix-nobh-error-handling.patch mm-revert-kernel_ds-buffered-write-optimisation.patch revert-81b0c8713385ce1b1b9058e916edcf9561ad76d6.patch revert-6527c2bdf1f833cc18e8f42bd97973d583e4aa83.patch mm-clean-up-buffered-write-code.patch mm-debug-write-deadlocks.patch mm-trim-more-holes.patch mm-buffered-write-cleanup.patch mm-write-iovec-cleanup.patch mm-fix-pagecache-write-deadlocks.patch mm-buffered-write-iterator.patch fs-fix-data-loss-on-error.patch fs-introduce-write_begin-write_end-and-perform_write-aops.patch introduce-write_begin-write_end-aops-important-fix.patch introduce-write_begin-write_end-aops-fix2.patch mm-restore-kernel_ds-optimisations.patch implement-simple-fs-aops.patch implement-simple-fs-aops-fix.patch block_dev-convert-to-new-aops.patch ext2-convert-to-new-aops.patch ext2-convert-to-new-aops-fix.patch ext2-convert-to-new-aops-fix2.patch ext3-convert-to-new-aops.patch ext3-convert-to-new-aops-fix.patch ext3-convert-to-new-aops-fix-fix.patch ext4-convert-to-new-aops.patch ext4-convert-to-new-aops-fix.patch ext4-convert-to-new-aops-fix-fix.patch xfs-convert-to-new-aops.patch gfs2-convert-to-new-aops-fix.patch fs-new-cont-helpers.patch fat-convert-to-new-aops.patch hfs-convert-to-new-aops.patch hfsplus-convert-to-new-aops.patch hpfs-convert-to-new-aops.patch bfs-convert-to-new-aops.patch qnx4-convert-to-new-aops.patch reiserfs-use-generic-write.patch reiserfs-convert-to-new-aops.patch reiserfs-convert-to-new-aops-fix.patch reiserfs-convert-to-new-aops-fix2.patch reiserfs-use-generic_cont_expand_simple.patch with-reiserfs-no-longer-using-the-weird-generic_cont_expand-remove-it-completely.patch nfs-convert-to-new-aops.patch smb-convert-to-new-aops.patch fuse-convert-to-new-aops.patch hostfs-convert-to-new-aops.patch hostfs-convert-to-new-aops-fix.patch hostfs-convert-to-new-aops-fix-fix.patch jffs2-convert-to-new-aops.patch ufs-convert-to-new-aops.patch ufs-convert-to-new-aops-fix.patch ufs-convert-to-new-aops-fix2.patch udf-convert-to-new-aops.patch udf-convert-to-new-aops-fix.patch sysv-convert-to-new-aops.patch sysv-convert-to-new-aops-fix.patch sysv-convert-to-new-aops-fix2.patch minix-convert-to-new-aops.patch minix-convert-to-new-aops-fix.patch minix-convert-to-new-aops-fix2.patch jfs-convert-to-new-aops.patch fs-adfs-convert-to-new-aops.patch fs-affs-convert-to-new-aops.patch affs-convert-to-new-aops-fix.patch affs-convert-to-new-aops-fix-fix.patch ocfs2-convert-to-new-aops.patch fs-restore-nobh.patch fs-restore-nobh-checkpatch-fixes.patch fs-remove-some-aop_truncated_page.patch make-swappiness-safer-to-use.patch mm-document-tree_lock-zonelock-lockorder.patch fs-reiserfs-cleanups.patch atomic_opstxt-has-incorrect-misleading-and-insufficient-information.patch fs-introduce-write_begin-write_end-and-perform_write-aops-revoke.patch fs-introduce-write_begin-write_end-and-perform_write-aops-revoke-fix.patch bitops-introduce-lock-ops.patch alpha-fix-bitops.patch alpha-lock-bitops.patch alpha-lock-bitops-fix.patch ia64-lock-bitops.patch mips-fix-bitops.patch mips-lock-bitops.patch powerpc-lock-bitops.patch powerpc-lock-bitops-fix.patch bit_spin_lock-use-lock-bitops.patch reiser4-fix-for-new-aops-patches.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html