linux/include/target
Shuangpeng Bai c1f359d9a5 usb: gadget: f_tcm: keep port count until LUN teardown completes
commit c39d0916da upstream.

tcm_usbg_drop_nexus() permits session removal once tpg_port_count
reaches zero. However, usbg_port_unlink() currently decrements that
count from the fabric_pre_unlink() callback, before core_dev_del_lun()
waits for active se_lun references to drain.

If removal of the last LUN races a nexus removal, the latter can observe
a zero port count and call target_remove_session(). This frees
sess_cmd_map while an in-flight struct usbg_cmd, including its work item,
can still be accessed.

Overlapping the last-LUN unlink with nexus removal reproduces this
lifetime violation as a DEBUG_OBJECTS "free active" warning for
usbg_cmd_work, followed by a target-core BUG/Oops.

The generic target-core unlink path has no callback after
core_dev_del_lun() completes. Add an optional fabric_post_unlink()
callback and use it for the f_tcm port count. The count now remains
nonzero until core_dev_del_lun() has finished draining active LUN
references, preventing nexus removal from freeing the session during
command completion.

Fixes: c52661d60f ("usb-gadget: Initial merge of target module for UASP + BOT")
Cc: stable@vger.kernel.org
Signed-off-by: Shuangpeng Bai <shuangpeng.kernel@gmail.com>
Link: https://patch.msgid.link/20260807060733.3186624-1-shuangpeng.kernel@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-09-02 14:27:28 +02:00
..
iscsi scsi: target: Make iscsit_register_transport() return void 2020-08-04 20:56:56 -04:00
target_core_backend.h scsi: target: Allows backend drivers to fail with specific sense codes 2021-08-17 22:28:40 -04:00
target_core_base.h scsi: target: Fix multiple LUN_RESET handling 2023-05-11 23:00:26 +09:00
target_core_fabric.h usb: gadget: f_tcm: keep port count until LUN teardown completes 2026-09-02 14:27:28 +02:00