• Kazuya Mio's avatar
    ext4: fix 32bit overflow in ext4_ext_find_goal() · ad4fb9ca
    Kazuya Mio authored
    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: default avatarKazuya Mio <k-mio@sx.jp.nec.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    ad4fb9ca
extents.c 104 KB