• Damien Le Moal's avatar
    block: Fix __blkdev_direct_IO() for bio fragments · 0eb6ddfb
    Damien Le Moal authored
    The recent fix to properly handle IOCB_NOWAIT for async O_DIRECT IO
    (patch 6a43074e) introduced two problems with BIO fragment handling
    for direct IOs:
    1) The dio size processed is calculated by incrementing the ret variable
    by the size of the bio fragment issued for the dio. However, this size
    is obtained directly from bio->bi_iter.bi_size AFTER the bio submission
    which may result in referencing the bi_size value after the bio
    completed, resulting in an incorrect value use.
    2) The ret variable is not incremented by the size of the last bio
    fragment issued for the bio, leading to an invalid IO size being
    returned to the user.
    
    Fix both problem by using dio->size (which is incremented before the bio
    submission) to update the value of ret after bio submissions, including
    for the last bio fragment issued.
    
    Fixes: 6a43074e ("block: properly handle IOCB_NOWAIT for async O_DIRECT IO")
    Reported-by: default avatarMasato Suzuki <masato.suzuki@wdc.com>
    Signed-off-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    0eb6ddfb
block_dev.c 56.5 KB