[dm-devel] [PATCH] dm crypt: set bdev to clone bio

Shin'ichiro Kawasaki shinichiro.kawasaki at wdc.com
Thu Jun 9 11:43:00 UTC 2022


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 at wdc.com>
---
 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



More information about the dm-devel mailing list