{"id":"CVE-2026-99202","state":"PUBLISHED","title":"scsi: libsas: Fix SMP IO deadlock during HA resume","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nscsi: libsas: Fix SMP IO deadlock during HA resume\n\nsmp_execute_task_sg() calls pm_runtime_get_sync() on the host before\nissuing an SMP command. When that command is itself issued from the HA\nresume path, the get_sync() deadlocks: it waits for the ongoing resume\n(the device is RPM_RESUMING), while the resume is blocked in\nsas_drain_work() waiting for that same SMP IO to complete.\n\nThe deadlock needs an expander-attached SATA disk. During\nsas_resume_ha() -> sas_drain_work(), DISCE_RESUME -> sas_resume_sata()\n-> ata_sas_port_resume() requests ATA_EH_RESET, and the hard reset for\nsuch a disk is done via SMP PHY CONTROL (sas_ata_hard_reset() ->\nsas_phy_reset() -> sas_smp_phy_control() ->\nsmp_execute_task_sg()). Direct-attached SATA resets through\nlldd_control_phy() and SSP devices use TMFs, so neither hits this.\n\nReplace the get_sync()/put_sync() pair with\npm_runtime_get_noresume()/pm_runtime_put(). smp_execute_task_sg() only\nneeds to hold off autosuspend while the SMP is in flight, and it must\nnot try to resume the host: a sync resume issued from the HA resume path\nitself is what deadlocks, and by the time sas_resume_ha() runs, hw_init\nhas already reinitialized the hardware, so the device is accessible\nwithout one.\n\nThe usage reference is still required. Discovery work normally runs\ninside an event worker's PM reference, taken at sas_notify_port_event()\nnotify time and held until the handler has flushed the disco\nqueue. sas_rediscover_ex_phy() however requeues DISCE_REVALIDATE_DOMAIN\nfrom within the revalidation worker itself, and flush_workqueue() does\nnot wait for work items queued during execution, so that chained\nrevalidation runs with no outer PM reference - without the\nget_noresume(), its SMP could race autosuspend.\n\nFor the BSG path, sas_smp_handler() is the only caller which may find\nthe host autosuspended: expander SMP requests do not go through any SCSI\ndevice request queue, so nothing else in that path holds the host\nawake. Resume it there with pm_runtime_resume_and_get() and check the\nresult.","publishedAt":"2026-10-28T10:35:56.827Z","updatedAt":"2026-10-30T12:42:52.198Z","severity":null,"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"09357f067122e2e28ec52e27013a1660a1571618","status":"affected","lessThan":"ab91a558084fdb8cca4919ffb769ca4328e91bbd","versionType":"git"},{"version":"e50a6523a603594a6d92cdecfe11997d639410a3","status":"affected","lessThan":"6078a5369f9e8d22bb03b8890cb0bb47c91a5017","versionType":"git"},{"version":"c391b5899dd46485a5893696c12ae3e95a3a7325","status":"affected","lessThan":"7004c18c38aaa2b87164b54dd77c320b4c63b89b","versionType":"git"},{"version":"9e24b47ef81d43b3fb1b14294f09991640c79fcc","status":"affected","lessThan":"c9fb89246d9922ac0a45d504adb03e0bb971310c","versionType":"git"},{"version":"3dbbbf656b850c9c8de05df6ad4a1dfc6ff02845","status":"affected","lessThan":"08b95ef36a64c3ae4490794bed3c35d0c3354e85","versionType":"git"},{"version":"3dbbbf656b850c9c8de05df6ad4a1dfc6ff02845","status":"affected","lessThan":"81e097a064b28b4a1f6ca1a8b433e659c1bd64c0","versionType":"git"},{"version":"b9c44a14062093e9fc2d6bddc696cfceadb482d7","status":"affected","versionType":"git"},{"version":"6.1.183","status":"affected","lessThan":"6.1.191","versionType":"semver"},{"version":"6.6.151","status":"affected","lessThan":"6.6.161","versionType":"semver"},{"version":"6.12.103","status":"affected","lessThan":"6.12.115","versionType":"semver"},{"version":"6.18.44","status":"affected","lessThan":"6.18.59","versionType":"semver"},{"version":"7.1.8","status":"affected","lessThan":"7.2","versionType":"semver"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/scsi/libsas/sas_expander.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"7.2","status":"affected"},{"version":"0","status":"unaffected","lessThan":"7.2","versionType":"semver"},{"version":"6.1.191","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.161","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.115","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.59","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.13","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/scsi/libsas/sas_expander.c"]}],"references":["https://git.kernel.org/stable/c/ab91a558084fdb8cca4919ffb769ca4328e91bbd","https://git.kernel.org/stable/c/6078a5369f9e8d22bb03b8890cb0bb47c91a5017","https://git.kernel.org/stable/c/7004c18c38aaa2b87164b54dd77c320b4c63b89b","https://git.kernel.org/stable/c/c9fb89246d9922ac0a45d504adb03e0bb971310c","https://git.kernel.org/stable/c/08b95ef36a64c3ae4490794bed3c35d0c3354e85","https://git.kernel.org/stable/c/81e097a064b28b4a1f6ca1a8b433e659c1bd64c0"],"weaknesses":[],"ingestedAt":"2026-10-30T13:02:04.640Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/99xxx/CVE-2026-99202.json","commit":"cb14bf1b43b0c9f05f7f40eae2246263fd430780","baselineCommit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-99202","state":"PUBLISHED","datePublished":"2026-10-28T10:35:56.827Z","dateUpdated":"2026-10-30T12:42:52.198Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2026-09-25T10:25:14.400Z"},"containers":{"cna":{"title":"scsi: libsas: Fix SMP IO deadlock during HA resume","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nscsi: libsas: Fix SMP IO deadlock during HA resume\n\nsmp_execute_task_sg() calls pm_runtime_get_sync() on the host before\nissuing an SMP command. When that command is itself issued from the HA\nresume path, the get_sync() deadlocks: it waits for the ongoing resume\n(the device is RPM_RESUMING), while the resume is blocked in\nsas_drain_work() waiting for that same SMP IO to complete.\n\nThe deadlock needs an expander-attached SATA disk. During\nsas_resume_ha() -> sas_drain_work(), DISCE_RESUME -> sas_resume_sata()\n-> ata_sas_port_resume() requests ATA_EH_RESET, and the hard reset for\nsuch a disk is done via SMP PHY CONTROL (sas_ata_hard_reset() ->\nsas_phy_reset() -> sas_smp_phy_control() ->\nsmp_execute_task_sg()). Direct-attached SATA resets through\nlldd_control_phy() and SSP devices use TMFs, so neither hits this.\n\nReplace the get_sync()/put_sync() pair with\npm_runtime_get_noresume()/pm_runtime_put(). smp_execute_task_sg() only\nneeds to hold off autosuspend while the SMP is in flight, and it must\nnot try to resume the host: a sync resume issued from the HA resume path\nitself is what deadlocks, and by the time sas_resume_ha() runs, hw_init\nhas already reinitialized the hardware, so the device is accessible\nwithout one.\n\nThe usage reference is still required. Discovery work normally runs\ninside an event worker's PM reference, taken at sas_notify_port_event()\nnotify time and held until the handler has flushed the disco\nqueue. sas_rediscover_ex_phy() however requeues DISCE_REVALIDATE_DOMAIN\nfrom within the revalidation worker itself, and flush_workqueue() does\nnot wait for work items queued during execution, so that chained\nrevalidation runs with no outer PM reference - without the\nget_noresume(), its SMP could race autosuspend.\n\nFor the BSG path, sas_smp_handler() is the only caller which may find\nthe host autosuspended: expander SMP requests do not go through any SCSI\ndevice request queue, so nothing else in that path holds the host\nawake. Resume it there with pm_runtime_resume_and_get() and check the\nresult."}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"09357f067122e2e28ec52e27013a1660a1571618","status":"affected","lessThan":"ab91a558084fdb8cca4919ffb769ca4328e91bbd","versionType":"git"},{"version":"e50a6523a603594a6d92cdecfe11997d639410a3","status":"affected","lessThan":"6078a5369f9e8d22bb03b8890cb0bb47c91a5017","versionType":"git"},{"version":"c391b5899dd46485a5893696c12ae3e95a3a7325","status":"affected","lessThan":"7004c18c38aaa2b87164b54dd77c320b4c63b89b","versionType":"git"},{"version":"9e24b47ef81d43b3fb1b14294f09991640c79fcc","status":"affected","lessThan":"c9fb89246d9922ac0a45d504adb03e0bb971310c","versionType":"git"},{"version":"3dbbbf656b850c9c8de05df6ad4a1dfc6ff02845","status":"affected","lessThan":"08b95ef36a64c3ae4490794bed3c35d0c3354e85","versionType":"git"},{"version":"3dbbbf656b850c9c8de05df6ad4a1dfc6ff02845","status":"affected","lessThan":"81e097a064b28b4a1f6ca1a8b433e659c1bd64c0","versionType":"git"},{"version":"b9c44a14062093e9fc2d6bddc696cfceadb482d7","status":"affected","versionType":"git"},{"version":"6.1.183","status":"affected","lessThan":"6.1.191","versionType":"semver"},{"version":"6.6.151","status":"affected","lessThan":"6.6.161","versionType":"semver"},{"version":"6.12.103","status":"affected","lessThan":"6.12.115","versionType":"semver"},{"version":"6.18.44","status":"affected","lessThan":"6.18.59","versionType":"semver"},{"version":"7.1.8","status":"affected","lessThan":"7.2","versionType":"semver"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/scsi/libsas/sas_expander.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"7.2","status":"affected"},{"version":"0","status":"unaffected","lessThan":"7.2","versionType":"semver"},{"version":"6.1.191","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.161","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.115","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.59","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.13","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/scsi/libsas/sas_expander.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/ab91a558084fdb8cca4919ffb769ca4328e91bbd"},{"url":"https://git.kernel.org/stable/c/6078a5369f9e8d22bb03b8890cb0bb47c91a5017"},{"url":"https://git.kernel.org/stable/c/7004c18c38aaa2b87164b54dd77c320b4c63b89b"},{"url":"https://git.kernel.org/stable/c/c9fb89246d9922ac0a45d504adb03e0bb971310c"},{"url":"https://git.kernel.org/stable/c/08b95ef36a64c3ae4490794bed3c35d0c3354e85"},{"url":"https://git.kernel.org/stable/c/81e097a064b28b4a1f6ca1a8b433e659c1bd64c0"}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-10-30T12:42:52.198Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.1.183","versionEndExcluding":"6.1.191"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.6.151","versionEndExcluding":"6.6.161"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.12.103","versionEndExcluding":"6.12.115"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"6.18.44","versionEndExcluding":"6.18.59"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"7.2","versionEndExcluding":"7.2.13"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"7.2","versionEndExcluding":"7.3"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"7.1.8"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}}}}}