• Shin'ichiro Kawasaki's avatar
    dm: fix bio length of empty flush · 92b914e2
    Shin'ichiro Kawasaki authored
    The commit 92986f6b ("dm: use bio_clone_fast in alloc_io/alloc_tio")
    removed bio_clone_fast() call from alloc_tio() when ci->io->tio is
    available. In this case, ci->bio is not copied to ci->io->tio.clone.
    This is fine since init_clone_info() sets same values to ci->bio and
    ci->io->tio.clone.
    
    However, when incoming bios have REQ_PREFLUSH flag, __send_empty_flush()
    prepares a zero length bio on stack and set it to ci->bio. At this time,
    ci->io->tio.clone still keeps non-zero length. When alloc_tio() chooses
    this ci->io->tio.clone as the bio to map, it is passed to targets as
    non-empty flush bio. It causes bio length check failure in dm-zoned and
    unexpected operation such as dm_accept_partial_bio() call.
    
    To avoid the non-empty flush bio, set zero length to ci->io->tio.clone
    in __send_empty_flush().
    
    Fixes: 92986f6b ("dm: use bio_clone_fast in alloc_io/alloc_tio")
    Signed-off-by: default avatarShin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
    92b914e2
dm.c 73.3 KB