From 414805bb4d7b4e4f192ba8e38cf5f15556ca2dbf Mon Sep 17 00:00:00 2001 From: Chesnokov Gleb Date: Wed, 8 Dec 2021 18:07:35 +0300 Subject: [PATCH] vdisk_fileio, async_mode: Fix scheduling while atomic This patch should fix the following bug: BUG: scheduling while atomic: ... ... Call Trace: dump_stack+0x6d/0x8b __schedule_bug.cold.94+0x4c/0x5a __schedule+0x51d/0x606 schedule+0x33/0x9a __lock_sock+0x7d/0xbc ? finish_wait+0x80/0x78 lock_sock_nested+0x64/0x66 do_tcp_setsockopt.isra.47+0x7d/0xbc4 ? scst_free_cmd+0x171/0x220 [scst] tcp_setsockopt+0x34/0x36 sock_common_setsockopt+0x1a/0x1c cmnd_tx_start+0x94/0x210 [iscsi_scst] iscsi_send+0x2cd/0x800 [iscsi_scst] iscsi_tcp_send_locally+0xe9/0x1f0 [iscsi_scst] ? iscsi_tcp_send_data_rsp+0x5a/0x90 [iscsi_scst] iscsi_xmit_response+0xfe/0x230 [iscsi_scst] scst_process_active_cmd+0x742/0x1740 [scst] ? try_to_wake_up+0x1dd/0x5ac scst_process_redirect_cmd+0x128/0x300 [scst] ? insert_work+0xa8/0xc2 scst_cmd_done_local+0x7f/0x100 [scst] ? rvmio_transfer_data+0xb0/0xb0 [scst_vdisk] fileio_async_complete+0x46/0x100 [scst_vdisk] iomap_dio_complete_work+0x29/0x2e iomap_dio_bio_end_io+0xed/0xff bio_endio+0xda/0x12e blk_update_request+0xea/0x3a1 scsi_end_request+0x30/0x111 scsi_io_completion+0x7c/0x4e1 ? virtscsi_remove+0xc0/0xc0 [virtio_scsi] scsi_finish_command+0xe7/0x11a scsi_softirq_done+0x75/0xde blk_done_softirq+0xa5/0xcd __do_softirq+0xe1/0x2e7 ? sched_clock+0x9/0xd irq_exit+0xf3/0xf8 do_IRQ+0x59/0xe0 common_interrupt+0xf/0x1d2 RIP: 0010:native_safe_halt+0x12/0x14 ... --- scst/src/dev_handlers/scst_vdisk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scst/src/dev_handlers/scst_vdisk.c b/scst/src/dev_handlers/scst_vdisk.c index 4b198ae7d..d7d36dc4f 100644 --- a/scst/src/dev_handlers/scst_vdisk.c +++ b/scst/src/dev_handlers/scst_vdisk.c @@ -3224,7 +3224,7 @@ static void fileio_async_complete(struct kiocb *iocb, long ret } } cmd->completed = 1; - cmd->scst_cmd_done(cmd, SCST_CMD_STATE_DEFAULT, SCST_CONTEXT_SAME); + cmd->scst_cmd_done(cmd, SCST_CMD_STATE_DEFAULT, scst_estimate_context()); } static enum compl_status_e fileio_exec_async(struct vdisk_cmd_params *p)