https://github.com/torvalds/linux
Revision 914ee295af418e936ec20a08c1663eaabe4cd07a authored by Xin Zhong on 09 December 2010, 09:30:14 UTC, committed by Chris Mason on 10 December 2010, 21:29:10 UTC
This problem is found in meego testing: http://bugs.meego.com/show_bug.cgi?id=6672 A file in btrfs is mmaped and the mmaped buffer is passed to pwrite to write to the same page of the same file. In btrfs_file_aio_write(), the pages is locked by prepare_pages(). So when btrfs_copy_from_user() is called, page fault happens and the same page needs to be locked again in filemap_fault(). The fix is to move iov_iter_fault_in_readable() before prepage_pages() to make page fault happen before pages are locked. And also disable page fault in critical region in btrfs_copy_from_user(). Reviewed-by: Yan, Zheng<zheng.z.yan@intel.com> Signed-off-by: Zhong, Xin <xin.zhong@intel.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
1 parent f106e82
Tip revision: 914ee295af418e936ec20a08c1663eaabe4cd07a authored by Xin Zhong on 09 December 2010, 09:30:14 UTC
Btrfs: pwrite blocked when writing from the mmaped buffer of the same page
Btrfs: pwrite blocked when writing from the mmaped buffer of the same page
Tip revision: 914ee29
File | Mode | Size |
---|---|---|
Kconfig | -rw-r--r-- | 1.6 KB |
Makefile | -rw-r--r-- | 440 bytes |
acl.c | -rw-r--r-- | 4.6 KB |
endian24.h | -rw-r--r-- | 1.5 KB |
file.c | -rw-r--r-- | 4.1 KB |
inode.c | -rw-r--r-- | 10.0 KB |
ioctl.c | -rw-r--r-- | 3.2 KB |
jfs_acl.h | -rw-r--r-- | 1.2 KB |
jfs_btree.h | -rw-r--r-- | 4.0 KB |
jfs_debug.c | -rw-r--r-- | 2.8 KB |
jfs_debug.h | -rw-r--r-- | 3.4 KB |
jfs_dinode.h | -rw-r--r-- | 5.6 KB |
jfs_dmap.c | -rw-r--r-- | 109.0 KB |
jfs_dmap.h | -rw-r--r-- | 11.2 KB |
jfs_dtree.c | -rw-r--r-- | 100.2 KB |
jfs_dtree.h | -rw-r--r-- | 6.6 KB |
jfs_extent.c | -rw-r--r-- | 17.3 KB |
jfs_extent.h | -rw-r--r-- | 1.3 KB |
jfs_filsys.h | -rw-r--r-- | 8.8 KB |
jfs_imap.c | -rw-r--r-- | 84.3 KB |
jfs_imap.h | -rw-r--r-- | 6.4 KB |
jfs_incore.h | -rw-r--r-- | 7.3 KB |
jfs_inode.c | -rw-r--r-- | 4.0 KB |
jfs_inode.h | -rw-r--r-- | 2.5 KB |
jfs_lock.h | -rw-r--r-- | 1.5 KB |
jfs_logmgr.c | -rw-r--r-- | 59.4 KB |
jfs_logmgr.h | -rw-r--r-- | 14.7 KB |
jfs_metapage.c | -rw-r--r-- | 19.6 KB |
jfs_metapage.h | -rw-r--r-- | 4.2 KB |
jfs_mount.c | -rw-r--r-- | 12.7 KB |
jfs_superblock.h | -rw-r--r-- | 4.1 KB |
jfs_txnmgr.c | -rw-r--r-- | 75.5 KB |
jfs_txnmgr.h | -rw-r--r-- | 8.2 KB |
jfs_types.h | -rw-r--r-- | 4.0 KB |
jfs_umount.c | -rw-r--r-- | 4.0 KB |
jfs_unicode.c | -rw-r--r-- | 3.3 KB |
jfs_unicode.h | -rw-r--r-- | 3.7 KB |
jfs_uniupr.c | -rw-r--r-- | 7.5 KB |
jfs_xattr.h | -rw-r--r-- | 2.6 KB |
jfs_xtree.c | -rw-r--r-- | 92.1 KB |
jfs_xtree.h | -rw-r--r-- | 4.0 KB |
namei.c | -rw-r--r-- | 37.2 KB |
resize.c | -rw-r--r-- | 14.7 KB |
super.c | -rw-r--r-- | 21.1 KB |
symlink.c | -rw-r--r-- | 1.6 KB |
xattr.c | -rw-r--r-- | 27.1 KB |
Computing file changes ...