• Chao Yu's avatar
    f2fs: preallocate fallocated blocks for direct IO · df6136ef
    Chao Yu authored
    Normally, due to DIO_SKIP_HOLES flag is set by default, blockdev_direct_IO in
    f2fs_direct_IO tries to skip DIO in holes when writing inside i_size, this
    makes us falling back to buffered IO which shows lower performance.
    
    So in commit 59b802e5 ("f2fs: allocate data blocks in advance for
    f2fs_direct_IO"), we improve perfromance by allocating data blocks in advance
    if we meet holes no matter in i_size or not, since with it we can avoid falling
    back to buffered IO.
    
    But we forget to consider for unwritten fallocated block in this commit.
    This patch tries to fix it for fallocate case, this helps to improve
    performance.
    
    Test result:
    Storage info: sandisk ultra 64G micro sd card.
    
    touch /mnt/f2fs/file
    truncate -s 67108864 /mnt/f2fs/file
    fallocate -o 0 -l 67108864 /mnt/f2fs/file
    time dd if=/dev/zero of=/mnt/f2fs/file bs=1M count=64 conv=notrunc oflag=direct
    
    Time before applying the patch:
    67108864 bytes (67 MB) copied, 36.16 s, 1.9 MB/s
    real    0m36.162s
    user    0m0.000s
    sys     0m0.180s
    
    Time after applying the patch:
    67108864 bytes (67 MB) copied, 27.7776 s, 2.4 MB/s
    real    0m27.780s
    user    0m0.000s
    sys     0m0.036s
    Signed-off-by: default avatarChao Yu <chao2.yu@samsung.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    df6136ef
data.c 43.6 KB