After the commit ca522482e3ea ("dm: pass NULL bdev to bio_alloc_clone"), bdev is no longer set to clone bio for ->map function. Instead, each DM targets shall set bdev to the clone bio by calling bio_set_dev() before issuing IO. Also the commit ensured that dm_zone_endio() is called from clone_endio() only when DM targets set bdev to the clone bio. However, crypt_map() of dm-crypt does not call bio_set_dev() for every clone bio. Then dm_zone_endio() is not called at completion of the bios and zone locks are not properly unlocked. This triggers a hang when blktests block/004 is run for dm-crypt on zoned block devices [1]. To avoid the hang, call bio_set_dev() for every bio in crypt_map(). [1] [ 6596.702977][T55017] run blktests block/004 at 2022-06-07 20:18:01 [ 6805.654531][ T41] INFO: task fio:55089 blocked for more than 122 seconds. [ 6805.664287][ T41] Not tainted 5.19.0-rc1+ #1 [ 6805.671040][ T41] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 6805.682059][ T41] task:fio state:D stack: 0 pid:55089 ppid: 55042 flags:0x00000002 [ 6805.693538][ T41] Call Trace: [ 6805.697563][ T41] <TASK> [ 6805.700855][ T41] __schedule+0xd5d/0x4b70 [ 6805.701035][ T41] ? lock_is_held_type+0xe3/0x140 [ 6805.701094][ T41] ? lock_release+0x365/0x730 [ 6805.701153][ T41] ? io_schedule_timeout+0x150/0x150 [ 6805.701182][ T41] ? blk_start_plug_nr_ios+0x270/0x270 [ 6805.701208][ T41] schedule+0xe0/0x200 [ 6805.701225][ T41] io_schedule+0xbf/0x130 [ 6805.701238][ T41] bit_wait_io+0x17/0xe0 [ 6805.701251][ T41] __wait_on_bit_lock+0x11e/0x1b0 [ 6805.701266][ T41] ? out_of_line_wait_on_bit_lock+0xe0/0xe0 [ 6805.701289][ T41] out_of_line_wait_on_bit_lock+0xc6/0xe0 [ 6805.701302][ T41] ? __wait_on_bit_lock+0x1b0/0x1b0 [ 6805.701311][ T41] ? lock_is_held_type+0xe3/0x140 [ 6805.701330][ T41] ? cpuacct_css_alloc+0x150/0x150 [ 6805.701355][ T41] dm_zone_map_bio+0x4e3/0x15d0 [ 6805.701423][ T41] ? dm_set_zones_restrictions+0x930/0x930 [ 6805.701443][ T41] ? bvec_alloc+0x1a0/0x1a0 [ 6805.701457][ T41] ? lockdep_init_map_type+0x169/0x7a0 [ 6805.701478][ T41] __map_bio+0x4bc/0x6f0 [ 6805.701500][ T41] dm_submit_bio+0x635/0x1440 [ 6805.701531][ T41] ? dm_dax_direct_access+0x1c0/0x1c0 [ 6805.701542][ T41] ? lock_release+0x365/0x730 [ 6805.701559][ T41] ? reacquire_held_locks+0x4e0/0x4e0 [ 6805.701609][ T41] __submit_bio+0x1c0/0x2c0 [ 6805.701638][ T41] ? __bio_queue_enter+0x5b0/0x5b0 [ 6805.701683][ T41] ? lockdep_hardirqs_on_prepare+0x17b/0x410 [ 6805.701703][ T41] submit_bio_noacct_nocheck+0x2f8/0x810 [ 6805.701727][ T41] ? should_fail_request+0x70/0x70 [ 6805.701737][ T41] ? submit_bio_noacct+0x1079/0x1650 [ 6805.701776][ T41] submit_bio+0x92/0x250 [ 6805.701829][ T41] ? submit_bio_noacct+0x1650/0x1650 [ 6805.701860][ T41] submit_bio_wait+0xf2/0x1d0 [ 6805.701873][ T41] ? submit_bio_wait_endio+0x40/0x40 [ 6805.701963][ T41] ? bio_init+0x365/0x5e0 [ 6805.701985][ T41] __blkdev_direct_IO_simple+0x326/0x550 [ 6805.702010][ T41] ? blkdev_llseek+0xd0/0xd0 [ 6805.702019][ T41] ? truncate_folio_batch_exceptionals.part.0+0x540/0x540 [ 6805.702044][ T41] ? lock_is_held_type+0xe3/0x140 [ 6805.702058][ T41] ? find_held_lock+0x2d/0x110 [ 6805.702087][ T41] ? __bio_clone+0x350/0x350 [ 6805.702124][ T41] ? generic_update_time+0x195/0x2b0 [ 6805.702156][ T41] generic_file_direct_write+0x1a9/0x490 [ 6805.702193][ T41] __generic_file_write_iter+0x161/0x430 [ 6805.702221][ T41] blkdev_write_iter+0x32c/0x5a0 [ 6805.702242][ T41] ? blkdev_open+0x240/0x240 [ 6805.702266][ T41] ? do_fault+0x4bd/0xed0 [ 6805.702278][ T41] ? restore_exclusive_pte+0x3b0/0x3b0 [ 6805.702303][ T41] new_sync_write+0x2cd/0x500 [ 6805.702320][ T41] ? new_sync_read+0x500/0x500 [ 6805.702355][ T41] ? inode_security+0x54/0xf0 [ 6805.702400][ T41] vfs_write+0x62c/0x980 [ 6805.702425][ T41] __x64_sys_pwrite64+0x17a/0x1c0 [ 6805.702439][ T41] ? vfs_write+0x980/0x980 [ 6805.702453][ T41] ? syscall_enter_from_user_mode+0x20/0x70 [ 6805.702477][ T41] do_syscall_64+0x3a/0x80 [ 6805.702493][ T41] entry_SYSCALL_64_after_hwframe+0x46/0xb0 [ 6805.702507][ T41] RIP: 0033:0x7fdec0affc6f [ 6805.702538][ T41] RSP: 002b:00007ffd9c193620 EFLAGS: 00000293 ORIG_RAX: 0000000000000012 [ 6805.702554][ T41] RAX: ffffffffffffffda RBX: 0000000001170540 RCX: 00007fdec0affc6f [ 6805.702562][ T41] RDX: 0000000000001000 RSI: 00000000011de000 RDI: 0000000000000007 [ 6805.702569][ T41] RBP: 00007fdea150a6c8 R08: 0000000000000000 R09: 0000000000000001 [ 6805.702576][ T41] R10: 0000000000c00000 R11: 0000000000000293 R12: 0000000000000001 [ 6805.702583][ T41] R13: 0000000000000000 R14: 0000000000001000 R15: 00007fdea150a6c8 [ 6805.702634][ T41] </TASK> [ 6805.702643][ T41] INFO: task fio:55091 blocked for more than 122 seconds. [ 6805.702651][ T41] Not tainted 5.19.0-rc1+ #1 [ 6805.702657][ T41] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 6805.702663][ T41] task:fio state:D stack: 0 pid:55091 ppid: 55042 flags:0x00000002 [ 6805.702679][ T41] Call Trace: [ 6805.702685][ T41] <TASK> [ 6805.702703][ T41] __schedule+0xd5d/0x4b70 [ 6805.702719][ T41] ? lock_is_held_type+0xe3/0x140 [ 6805.702747][ T41] ? lock_release+0x365/0x730 [ 6805.702777][ T41] ? io_schedule_timeout+0x150/0x150 [ 6805.702829][ T41] ? blk_start_plug_nr_ios+0x270/0x270 [ 6805.702853][ T41] schedule+0xe0/0x200 [ 6805.702870][ T41] io_schedule+0xbf/0x130 [ 6805.702925][ T41] bit_wait_io+0x17/0xe0 [ 6805.702939][ T41] __wait_on_bit_lock+0x11e/0x1b0 [ 6805.702954][ T41] ? out_of_line_wait_on_bit_lock+0xe0/0xe0 [ 6805.702977][ T41] out_of_line_wait_on_bit_lock+0xc6/0xe0 [ 6805.702990][ T41] ? __wait_on_bit_lock+0x1b0/0x1b0 [ 6805.702998][ T41] ? lock_is_held_type+0xe3/0x140 [ 6805.703018][ T41] ? cpuacct_css_alloc+0x150/0x150 [ 6805.703042][ T41] dm_zone_map_bio+0x4e3/0x15d0 [ 6805.703082][ T41] ? dm_set_zones_restrictions+0x930/0x930 [ 6805.703101][ T41] ? bvec_alloc+0x1a0/0x1a0 [ 6805.703114][ T41] ? lockdep_init_map_type+0x169/0x7a0 [ 6805.703136][ T41] __map_bio+0x4bc/0x6f0 [ 6805.703158][ T41] dm_submit_bio+0x635/0x1440 [ 6805.703188][ T41] ? dm_dax_direct_access+0x1c0/0x1c0 [ 6805.703199][ T41] ? lock_release+0x365/0x730 [ 6805.703216][ T41] ? reacquire_held_locks+0x4e0/0x4e0 [ 6805.703267][ T41] __submit_bio+0x1c0/0x2c0 [ 6805.703281][ T41] ? __bio_queue_enter+0x5b0/0x5b0 [ 6805.703300][ T41] ? lockdep_hardirqs_on_prepare+0x17b/0x410 [ 6805.703320][ T41] submit_bio_noacct_nocheck+0x2f8/0x810 [ 6805.703343][ T41] ? should_fail_request+0x70/0x70 [ 6805.703353][ T41] ? submit_bio_noacct+0x1079/0x1650 [ 6805.703392][ T41] submit_bio+0x92/0x250 [ 6805.703407][ T41] ? submit_bio_noacct+0x1650/0x1650 [ 6805.703438][ T41] submit_bio_wait+0xf2/0x1d0 [ 6805.703451][ T41] ? submit_bio_wait_endio+0x40/0x40 [ 6805.703488][ T41] ? bio_init+0x365/0x5e0 [ 6805.703509][ T41] __blkdev_direct_IO_simple+0x326/0x550 [ 6805.703534][ T41] ? blkdev_llseek+0xd0/0xd0 [ 6805.703542][ T41] ? truncate_folio_batch_exceptionals.part.0+0x540/0x540 [ 6805.703566][ T41] ? lock_is_held_type+0xe3/0x140 [ 6805.703579][ T41] ? find_held_lock+0x2d/0x110 [ 6805.703608][ T41] ? __bio_clone+0x350/0x350 [ 6805.703645][ T41] ? generic_update_time+0x195/0x2b0 [ 6805.703675][ T41] generic_file_direct_write+0x1a9/0x490 [ 6805.703711][ T41] __generic_file_write_iter+0x161/0x430 [ 6805.703738][ T41] blkdev_write_iter+0x32c/0x5a0 [ 6805.703759][ T41] ? blkdev_open+0x240/0x240 [ 6805.703822][ T41] ? do_fault+0x4bd/0xed0 [ 6805.703835][ T41] ? restore_exclusive_pte+0x3b0/0x3b0 [ 6805.703860][ T41] new_sync_write+0x2cd/0x500 [ 6805.703915][ T41] ? new_sync_read+0x500/0x500 [ 6805.703951][ T41] ? inode_security+0x54/0xf0 [ 6805.703995][ T41] vfs_write+0x62c/0x980 [ 6805.704021][ T41] __x64_sys_pwrite64+0x17a/0x1c0 [ 6805.704034][ T41] ? vfs_write+0x980/0x980 [ 6805.704048][ T41] ? syscall_enter_from_user_mode+0x20/0x70 [ 6805.704073][ T41] do_syscall_64+0x3a/0x80 [ 6805.704100][ T41] entry_SYSCALL_64_after_hwframe+0x46/0xb0 [ 6805.704111][ T41] RIP: 0033:0x7fdec0affc6f [ 6805.704120][ T41] RSP: 002b:00007ffd9c193620 EFLAGS: 00000293 ORIG_RAX: 0000000000000012 [ 6805.704133][ T41] RAX: ffffffffffffffda RBX: 0000000001170540 RCX: 00007fdec0affc6f [ 6805.704140][ T41] RDX: 0000000000001000 RSI: 00000000011de000 RDI: 0000000000000007 [ 6805.704146][ T41] RBP: 00007fdea1568318 R08: 0000000000000000 R09: 0000000000000001 [ 6805.704152][ T41] R10: 0000000000801000 R11: 0000000000000293 R12: 0000000000000001 [ 6805.704158][ T41] R13: 0000000000000000 R14: 0000000000001000 R15: 00007fdea1568318 [ 6805.704205][ T41] </TASK> [ 6805.704236][ T41] [ 6805.704236][ T41] Showing all locks held in the system: [ 6805.704262][ T41] 2 locks held by pr/ttyS0/16: [ 6805.704285][ T41] 1 lock held by khungtaskd/41: [ 6805.704292][ T41] #0: ffffffffb163b380 (rcu_read_lock){....}-{1:2}, at: debug_show_all_locks+0x53/0x260 [ 6805.704343][ T41] 3 locks held by systemd-journal/541: [ 6805.705034][ T41] 1 lock held by fio/[ 6805.705051][ T41] #0: ffff88811a04d110 (&md->io_barrier){....}-{0:0}, at: dm_get_live_table+0x5/0x110 [ 6805.705118][ T41] 1 lock held by fio/55091: [ 6805.705125][ T41] #0: ffff88811a04d110 (&md->io_barrier){....}-{0:0}, at: dm_get_live_table+0x5/0x110 [ 6805.705162][ T41] [ 6805.705191][ T41] ============================================= [ 6805.705191][ T41] Fixes: ca522482e3ea ("dm: pass NULL bdev to bio_alloc_clone") Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@xxxxxxx> --- drivers/md/dm-crypt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 159c6806c19b..c68523a89428 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -3378,6 +3378,8 @@ static int crypt_map(struct dm_target *ti, struct bio *bio) struct dm_crypt_io *io; struct crypt_config *cc = ti->private; + bio_set_dev(bio, cc->dev->bdev); + /* * If bio is REQ_PREFLUSH or REQ_OP_DISCARD, just bypass crypt queues. * - for REQ_PREFLUSH device-mapper core ensures that no IO is in-flight @@ -3385,7 +3387,6 @@ static int crypt_map(struct dm_target *ti, struct bio *bio) */ if (unlikely(bio->bi_opf & REQ_PREFLUSH || bio_op(bio) == REQ_OP_DISCARD)) { - bio_set_dev(bio, cc->dev->bdev); if (bio_sectors(bio)) bio->bi_iter.bi_sector = cc->start + dm_target_offset(ti, bio->bi_iter.bi_sector); -- 2.36.1 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/dm-devel