CVE-2026-46304
Description
Linux kernel nvmet subsystem vulnerable to recursive locking, potentially causing system instability.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
Linux kernel nvmet subsystem vulnerable to recursive locking, potentially causing system instability.
Vulnerability
The Linux kernel's nvmet subsystem contains a vulnerability where the nvmet_tcp_release_queue_work function, running on the nvmet-wq workqueue, can trigger a recursive flush of ctrl->async_event_work on the same workqueue. This occurs when nvmet_ctrl_free() is called during the teardown path, leading to a potential recursive locking condition detected by lockdep. This affects versions of the Linux kernel where this specific call chain exists.
Exploitation
An attacker would need to trigger a specific sequence of events within the nvmet subsystem, likely involving the removal of a network transport queue while asynchronous events are still being processed. This could be initiated by operations that lead to nvmet_tcp_schedule_release_queue() being called, which in turn schedules nvmet_tcp_release_queue_work() on nvmet_wq. If this work item causes nvmet_ctrl_free() to be invoked, it attempts to flush ctrl->async_event_work on the same nvmet_wq, leading to the recursive lock.
Impact
The primary impact of this vulnerability is a potential system instability due to the detected recursive locking. While the provided references do not explicitly detail information disclosure or arbitrary code execution, the recursive locking condition can lead to deadlocks or kernel panics, rendering the system unresponsive or requiring a reboot.
Mitigation
This vulnerability has been resolved in the Linux kernel. The fix involves ensuring that nvmet_ctrl_free() does not recursively flush ctrl->async_event_work on the nvmet-wq when nvmet_tcp_release_queue_work() is already executing on it. Users should update to a patched version of the Linux kernel. Specific patched versions are not detailed in the provided references, but the commit is available in the Linux kernel git repository [1].
AI Insight generated on Jun 8, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected products
1Patches
16ee6e20c4bc9envmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index be9a7e8b547ac..9dcca9d03c28a 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1505,7 +1505,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
ae5b0cad1638nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index a04bb02c1251b..ddcfc51fc05c6 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1440,7 +1440,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); ida_simple_remove(&cntlid_ida, ctrl->cntlid); -- cgit 1.3-korg
aade8abd8b86nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 33db6c5534e21..a87567f40c915 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1749,7 +1749,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
551f445a56a1nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 9238e13bd480a..ba4e1a5e0d4c8 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1743,7 +1743,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
781f47d64143nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 1c5b6bab47791..1567b35f96e37 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1746,7 +1746,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
9a4d7222c095nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 1cf6dfac18361..5a2adfc7c796a 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1497,7 +1497,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
a696fbbd5240nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index a68e7b1606da5..d2389918b1e86 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1496,7 +1496,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
8d66ba89480fnvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 65bc1efa33d66..30177f42a2aa7 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1471,7 +1471,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); ida_simple_remove(&cntlid_ida, ctrl->cntlid); -- cgit 1.3-korg
ee6e20c4bc9envmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index be9a7e8b547ac..9dcca9d03c28a 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1505,7 +1505,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
a696fbbd5240nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index a68e7b1606da5..d2389918b1e86 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1496,7 +1496,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
ae5b0cad1638nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index a04bb02c1251b..ddcfc51fc05c6 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1440,7 +1440,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); ida_simple_remove(&cntlid_ida, ctrl->cntlid); -- cgit 1.3-korg
aade8abd8b86nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 33db6c5534e21..a87567f40c915 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1749,7 +1749,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
781f47d64143nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 1c5b6bab47791..1567b35f96e37 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1746,7 +1746,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
8d66ba89480fnvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 65bc1efa33d66..30177f42a2aa7 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1471,7 +1471,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); ida_simple_remove(&cntlid_ida, ctrl->cntlid); -- cgit 1.3-korg
551f445a56a1nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 9238e13bd480a..ba4e1a5e0d4c8 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1743,7 +1743,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
9a4d7222c095nvmet: avoid recursive nvmet-wq flush in nvmet_ctrl_free
1 file changed · +1 −2
drivers/nvme/target/core.c+1 −2 modifieddiff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 1cf6dfac18361..5a2adfc7c796a 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -1497,7 +1497,7 @@ static void nvmet_ctrl_free(struct kref *ref) nvmet_stop_keep_alive_timer(ctrl); - flush_work(&ctrl->async_event_work); + cancel_work_sync(&ctrl->async_event_work); cancel_work_sync(&ctrl->fatal_err_work); nvmet_destroy_auth(ctrl); -- cgit 1.3-korg
Vulnerability mechanics
Synthesis attempt was rejected by the grounding validator. Re-run pending.
References
8- git.kernel.org/stable/c/551f445a56a11a6457550cddcf39c9ebb8bcacc6nvd
- git.kernel.org/stable/c/781f47d641432c26c19625b2cdd7f40825097592nvd
- git.kernel.org/stable/c/8d66ba89480ff098a58d79003a505f383aa4e920nvd
- git.kernel.org/stable/c/9a4d7222c0955b221e38bb66d10e6bccb672c8a1nvd
- git.kernel.org/stable/c/a696fbbd5240b4ac9b166f7bd4c550882ff543f1nvd
- git.kernel.org/stable/c/aade8abd8b868b6ffa9697aadaea28ec7f65bee6nvd
- git.kernel.org/stable/c/ae5b0cad163833e10b271e9becc05d81dae56e5fnvd
- git.kernel.org/stable/c/ee6e20c4bc9eae542a0954a368449532383169d4nvd
News mentions
1- Linux Kernel: 25 Vulnerabilities Disclosed in Single Batch on June 8, 2026Vypr Intelligence · Jun 8, 2026