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
History
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
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

back to top