Description
In the Linux kernel, the following vulnerability has been resolved: scsi: target: tcm_loop: Drain commands in target_reset handler tcm_loop_target_reset() violates the SCSI EH contract: it returns SUCCESS without draining any in-flight commands. The SCSI EH documentation (scsi_eh.rst) requires that when a reset handler returns SUCCESS the driver has made lower layers "forget about timed out scmds" and is ready for new commands. Every other SCSI LLD (virtio_scsi, mpt3sas, ipr, scsi_debug, mpi3mr) enforces this by draining or completing outstanding commands before returning SUCCESS. Because tcm_loop_target_reset() doesn't drain, the SCSI EH reuses in-flight scsi_cmnd structures for recovery commands (e.g. TUR) while the target core still has async completion work queued for the old se_cmd. The memset in queuecommand zeroes se_lun and lun_ref_active, causing transport_lun_remove_cmd() to skip its percpu_ref_put(). The leaked LUN reference prevents transport_clear_lun_ref() from completing, hanging configfs LUN unlink forever in D-state: INFO: task rm:264 blocked for more than 122 seconds. rm D 0 264 258 0x00004000 Call Trace: __schedule+0x3d0/0x8e0 schedule+0x36/0xf0 transport_clear_lun_ref+0x78/0x90 [target_core_mod] core_tpg_remove_lun+0x28/0xb0 [target_core_mod] target_fabric_port_unlink+0x50/0x60 [target_core_mod] configfs_unlink+0x156/0x1f0 [configfs] vfs_unlink+0x109/0x290 do_unlinkat+0x1d5/0x2d0 Fix this by making tcm_loop_target_reset() actually drain commands: 1. Issue TMR_LUN_RESET via tcm_loop_issue_tmr() to drain all commands that the target core knows about (those not yet CMD_T_COMPLETE). 2. Use blk_mq_tagset_busy_iter() to iterate all started requests and flush_work() on each se_cmd — this drains any deferred completion work for commands that already had CMD_T_COMPLETE set before the TMR (which the TMR skips via __target_check_io_state()). This is the same pattern used by mpi3mr, scsi_debug, and libsas to drain outstanding commands during reset.
Mitigation
Minimal update. May introduce new vulnerabilities or breaking changes.
|
 rpm rhel9 | | - | - |
 rpm rhel10 | | - | - |
 rpm rhel6 | | - | - |
 rpm rhel9 | | - | - |
 debian 14 | | =6.12.38-1 || =6.12.41-1 || =6.12.43-1 || =6.12.43-1~bpo12+1 || =6.12.48-1 || =6.12.57-1 || =6.12.57-1~bpo12+1 || =6.12.63-1 || =6.12.63-1~bpo12+1 || =6.12.69-1 || =6.12.69-1~bpo12+1 || =6.12.73-1 || =6.12.73-1~bpo12+1 || =6.12.74-1 || =6.12.74-2 || =6.12.74-2~bpo12+1 || =6.12.85-1 || =6.12.85-1~bpo12+1 || =6.13.10-1~exp1 || =6.13.11-1~exp1 || =6.13.2-1~exp1 || =6.13.3-1~exp1 || =6.13.4-1~exp1 || =6.13.5-1~exp1 || =6.13.6-1~exp1 || =6.13.7-1~exp1 || =6.13.8-1~exp1 || =6.13.9-1~exp1 || =6.13~rc6-1~exp1 || =6.13~rc7-1~exp1 || =6.14.3-1~exp1 || =6.14.5-1~exp1 || =6.14.6-1~exp1 || =6.15-1~exp1 || =6.15.1-1~exp1 || =6.15.2-1~exp1 || =6.15.3-1~exp1 || =6.15.4-1~exp1 || =6.15.5-1~exp1 || =6.15.6-1~exp1 || =6.15~rc7-1~exp1 || =6.16-1~exp1 || =6.16.1-1~exp1 || =6.16.10-1 || =6.16.11-1 || =6.16.12-1 || =6.16.12-1~bpo13+1 || =6.16.12-2 || =6.16.3-1 || =6.16.3-1~bpo13+1 || =6.16.5-1 || =6.16.6-1 || =6.16.7-1 || =6.16.8-1 || =6.16.9-1 || =6.16~rc7-1~exp1 || =6.17.10-1 || =6.17.11-1 || =6.17.12-1 || =6.17.13-1 || =6.17.13-1~bpo13+1 || =6.17.2-1~exp1 || =6.17.5-1~exp1 || =6.17.6-1 || =6.17.7-1 || =6.17.7-2 || =6.17.8-1 || =6.17.8-1~bpo13+1 || =6.17.9-1 || =6.18.1-1~exp1 || =6.18.10-1 || =6.18.12-1 || =6.18.12-1~bpo13+1 || =6.18.13-1 || =6.18.14-1 || =6.18.15-1 || =6.18.15-1~bpo13+1 || =6.18.2-1~exp1 || =6.18.3-1 || =6.18.5-1 || =6.18.5-1~bpo13+1 || =6.18.8-1 || =6.18.9-1 || =6.18.9-1~bpo13+1 || =6.18~rc4-1~exp1 || =6.18~rc4-1~exp2 || =6.18~rc5-1~exp1 || =6.18~rc6-1~exp1 || =6.18~rc7-1~exp1 || =6.19-1~exp1 || =6.19.10-1 || =6.19.10-1~bpo13+1 || =6.19.11-1 || =6.19.11-1~bpo13+1 || =6.19.2-1~exp1 || =6.19.3-1~exp1 || =6.19.4-1~exp1 || =6.19.5-1~exp1 || =6.19.6-1 || =6.19.6-2 || =6.19.6-2~bpo13+1 || =6.19.8-1 || =6.19.8-1~bpo13+1 || =6.19~rc4-1~exp1 || =6.19~rc5-1~exp1 || =6.19~rc6-1~exp1 || =6.19~rc7-1~exp1 || =6.19~rc8-1~exp1 || >=0 <6.19.12-1 | 6.19.12-1 |
 rpm rhel8 | | - | - |
 debian 12 | | =6.1.106-1 || =6.1.106-2 || =6.1.106-3 || =6.1.112-1 || =6.1.115-1 || =6.1.119-1 || =6.1.123-1 || =6.1.124-1 || =6.1.128-1 || =6.1.129-1 || =6.1.133-1 || =6.1.135-1 || =6.1.137-1 || =6.1.139-1 || =6.1.140-1 || =6.1.147-1 || =6.1.148-1 || =6.1.153-1 || =6.1.158-1 || =6.1.159-1 || =6.1.162-1 || =6.1.164-1 || =6.1.27-1 || =6.1.37-1 || =6.1.38-1 || =6.1.38-2 || =6.1.38-2~bpo11+1 || =6.1.38-3 || =6.1.38-4 || =6.1.38-4~bpo11+1 || =6.1.52-1 || =6.1.55-1 || =6.1.55-1~bpo11+1 || =6.1.64-1 || =6.1.66-1 || =6.1.67-1 || =6.1.69-1 || =6.1.69-1~bpo11+1 || =6.1.76-1 || =6.1.76-1~bpo11+1 || =6.1.82-1 || =6.1.85-1 || =6.1.90-1 || =6.1.90-1~bpo11+1 || =6.1.94-1 || =6.1.94-1~bpo11+1 || =6.1.98-1 || =6.1.99-1 || >=0 <6.1.170-1 | 6.1.170-1 |
 debian 11 | | =6.1.106-3~deb11u1 || =6.1.106-3~deb11u2 || =6.1.106-3~deb11u3 || =6.1.112-1~deb11u1 || =6.1.119-1~deb11u1 || =6.1.128-1~deb11u1 || =6.1.129-1~deb11u1 || =6.1.137-1~deb11u1 || =6.1.140-1~deb11u1 || =6.1.147-1~deb11u1 || =6.1.148-1~deb11u1 || =6.1.153-1~deb11u1 || =6.1.158-1~deb11u1 || =6.1.159-1~deb11u1 || =6.1.162-1~deb11u1 || =6.1.164-1~deb11u1 || >=0 <6.1.170-1~deb11u1 | 6.1.170-1~deb11u1 |
 debian 13 | | =6.12.38-1 || =6.12.41-1 || =6.12.43-1 || =6.12.43-1~bpo12+1 || =6.12.48-1 || =6.12.57-1 || =6.12.57-1~bpo12+1 || =6.12.63-1 || =6.12.63-1~bpo12+1 || =6.12.69-1 || =6.12.69-1~bpo12+1 || =6.12.73-1 || =6.12.73-1~bpo12+1 || =6.12.74-1 || =6.12.74-2 || =6.12.74-2~bpo12+1 || =6.12.85-1~bpo12+1 || >=0 <6.12.85-1 | 6.12.85-1 |
 rpm rhel8 | | - | - |