[PATCHv2 2/5] ata: pata_mpc52xx: switch to non-devm request_irq for proper ordering
From: Rosen Penev
Date: Tue Jun 09 2026 - 15:47:50 EST
Use non-devm request_irq/free_irq to ensure proper ordering in
error/remove paths: free_irq() before bcom_ata_release(), preventing
a use-after-free where the IRQ handler accesses freed BestComm
resources.
Assisted-by: opencode:big-pickle
Fixes: d01159dffa15 ("drivers/ata/pata_mpc52xx.c: clean up error handling code")
Signed-off-by: Rosen Penev <rosenp@xxxxxxxxx>
---
drivers/ata/pata_mpc52xx.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/ata/pata_mpc52xx.c b/drivers/ata/pata_mpc52xx.c
index fe445d6aaff6..b46b83df03d1 100644
--- a/drivers/ata/pata_mpc52xx.c
+++ b/drivers/ata/pata_mpc52xx.c
@@ -769,18 +769,18 @@ static int mpc52xx_ata_probe(struct platform_device *op)
priv->dmatsk = dmatsk;
task_irq = bcom_get_task_irq(dmatsk);
- rv = devm_request_irq(&op->dev, task_irq, &mpc52xx_ata_task_irq, 0,
- "ATA task", priv);
+ rv = request_irq(task_irq, &mpc52xx_ata_task_irq, 0,
+ "ATA task", priv);
if (rv) {
dev_err(&op->dev, "error requesting DMA IRQ\n");
- goto err2;
+ goto err_free_task;
}
/* Init the hw */
rv = mpc52xx_ata_hw_init(priv);
if (rv) {
dev_err(&op->dev, "error initializing hardware\n");
- goto err2;
+ goto err_free_irq;
}
/* Register ourselves to libata */
@@ -788,13 +788,15 @@ static int mpc52xx_ata_probe(struct platform_device *op)
mwdma_mask, udma_mask);
if (rv) {
dev_err(&op->dev, "error registering with ATA layer\n");
- goto err2;
+ goto err_free_irq;
}
return 0;
- err2:
+ err_free_irq:
+ free_irq(task_irq, priv);
irq_dispose_mapping(task_irq);
+ err_free_task:
bcom_ata_release(dmatsk);
err1:
irq_dispose_mapping(ata_irq);
@@ -812,6 +814,7 @@ static void mpc52xx_ata_remove(struct platform_device *op)
/* Clean up DMA */
task_irq = bcom_get_task_irq(priv->dmatsk);
+ free_irq(task_irq, priv);
irq_dispose_mapping(task_irq);
bcom_ata_release(priv->dmatsk);
irq_dispose_mapping(priv->ata_irq);
--
2.54.0