Skip to content

Commit 92b914e

Browse files
kawasakiMike Snitzer
authored andcommitted
dm: fix bio length of empty flush
The commit 92986f6 ("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: 92986f6 ("dm: use bio_clone_fast in alloc_io/alloc_tio") Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com> Signed-off-by: Mike Snitzer <snitzer@kernel.org>
1 parent 7dd06a2 commit 92b914e

1 file changed

Lines changed: 1 addition & 0 deletions

File tree

drivers/md/dm.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,6 +1391,7 @@ static void __send_empty_flush(struct clone_info *ci)
13911391

13921392
ci->bio = &flush_bio;
13931393
ci->sector_count = 0;
1394+
ci->io->tio.clone.bi_iter.bi_size = 0;
13941395

13951396
while ((ti = dm_table_get_target(ci->map, target_nr++)))
13961397
__send_duplicate_bios(ci, ti, ti->num_flush_bios, NULL);

0 commit comments

Comments
 (0)