Kazuya Mio ad4fb9cafe ext4: fix 32bit overflow in ext4_ext_find_goal()
ext4_ext_find_goal() returns an ideal physical block number that the block
allocator tries to allocate first. However, if a required file offset is
smaller than the existing extent's one, ext4_ext_find_goal() returns
a wrong block number because it may overflow at
"block - le32_to_cpu(ex->ee_block)". This patch fixes the problem.

ext4_ext_find_goal() will also return a wrong block number in case
a file offset of the existing extent is too big. In this case,
the ideal physical block number is fixed in ext4_mb_initialize_context(),
so it's no problem.

reproduce:
# dd if=/dev/zero of=/mnt/mp1/tmp bs=127M count=1 oflag=sync
# dd if=/dev/zero of=/mnt/mp1/file bs=512K count=1 seek=1 oflag=sync
# filefrag -v /mnt/mp1/file
Filesystem type is: ef53
File size of /mnt/mp1/file is 1048576 (256 blocks, blocksize 4096)
 ext logical physical expected length flags
   0     128    67456             128 eof
/mnt/mp1/file: 2 extents found
# rm -rf /mnt/mp1/tmp
# echo $((512*4096)) > /sys/fs/ext4/loop0/mb_stream_req
# dd if=/dev/zero of=/mnt/mp1/file bs=512K count=1 oflag=sync conv=notrunc

result (linux-2.6.37-rc2 + ext4 patch queue):
# filefrag -v /mnt/mp1/file
Filesystem type is: ef53
File size of /mnt/mp1/file is 1048576 (256 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0    33280             128 
   1     128    67456    33407    128 eof
/mnt/mp1/file: 2 extents found

result(apply this patch):
# filefrag -v /mnt/mp1/file
Filesystem type is: ef53
File size of /mnt/mp1/file is 1048576 (256 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0    66560             128 
   1     128    67456    66687    128 eof
/mnt/mp1/file: 2 extents found

Signed-off-by: Kazuya Mio <k-mio@sx.jp.nec.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2011-01-10 12:12:28 -05:00
..
2010-10-29 04:16:38 -04:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:17:13 -04:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:13 -04:00
2010-12-06 09:45:22 -08:00
2010-10-29 04:16:31 -04:00
2010-10-29 04:16:28 -04:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:28 -04:00
2010-10-29 04:16:28 -04:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:31 -04:00
2010-10-25 21:26:13 -04:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:13 -04:00
2010-11-30 16:39:27 +01:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:31 -04:00
2010-10-29 04:16:31 -04:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:13 -04:00
2010-11-01 16:34:56 -04:00
2010-10-29 04:16:13 -04:00
2010-12-10 13:01:50 -05:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:13 -04:00
2010-11-08 14:29:39 -08:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:31 -04:00
2010-10-29 04:17:08 -04:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:36 -04:00
2010-10-29 04:16:13 -04:00
2010-10-29 04:16:13 -04:00
2010-10-25 21:26:11 -04:00
2010-10-29 04:16:33 -04:00
2010-10-29 04:16:28 -04:00
2010-10-15 15:53:27 +02:00
2010-08-18 08:35:46 -04:00
2010-10-29 05:49:13 -04:00
2010-10-28 09:44:56 -07:00
2010-10-29 04:16:33 -04:00
2010-10-28 09:44:56 -07:00
2010-10-29 04:14:56 -04:00
2010-10-29 04:14:56 -04:00
2010-08-18 08:35:48 -04:00
2010-08-09 16:48:44 -04:00
2010-10-29 04:17:03 -04:00
2010-08-09 16:47:43 -04:00