FAILED: patch "[PATCH] mfd: ab8500: Fix child device leaks on probe failure" failed to apply to 6.1-stable tree
Sasha Levin
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 5bf2ae8b131d4ae9c0ed5f7aa02532645f512022
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '[email protected]' --subject-prefix 'PATCH 6.1.y' 'HEAD^..'
Thanks,
Sasha
------------------ original commit in Linus's tree ------------------
From 5bf2ae8b131d4ae9c0ed5f7aa02532645f512022 Mon Sep 17 00:00:00 2001
From: Guangshuo Li <[email protected]>
Date: Thu, 24 Sep 2026 22:43:55 +0800
Subject: [PATCH] mfd: ab8500: Fix child device leaks on probe failure
ab8500_probe() registers MFD child devices before completing the remaining device initialization. If a later MFD registration or sysfs group creation fails, previously registered child devices are not removed.
Use devm_mfd_add_devices() so registered MFD child devices are removed when probe fails.
The issue was identified by a static analysis tool I developed and confirmed by manual review.
--- drivers/mfd/ab8500-core.c | 44 ++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 21 deletions(-)
drivers/mfd/ab8500-core.c +23 -21
@@ -1194,39 +1194,41 @@ static int ab8500_probe(struct platform_device *pdev)return ret;if (is_ab9540 (ab8500)) - ret =mfd_add_devices (ab8500->dev,0 , ab9540_devs, -ARRAY_SIZE (ab9540_devs),NULL , -0 , ab8500->domain); + ret =devm_mfd_add_devices (ab8500->dev,0 , ab9540_devs, +ARRAY_SIZE (ab9540_devs),NULL , +0 , ab8500->domain);else if (is_ab8540 (ab8500)) { - ret =mfd_add_devices (ab8500->dev,0 , ab8540_devs, -ARRAY_SIZE (ab8540_devs),NULL , -0 , ab8500->domain); + ret =devm_mfd_add_devices (ab8500->dev,0 , ab8540_devs, +ARRAY_SIZE (ab8540_devs),NULL , +0 , ab8500->domain);if (ret)return ret;if (is_ab8540_1p2_or_earlier (ab8500)) - ret =mfd_add_devices (ab8500->dev,0 , ab8540_cut1_devs, -ARRAY_SIZE (ab8540_cut1_devs),NULL , -0 , ab8500->domain); + ret =devm_mfd_add_devices (ab8500->dev,0 , + ab8540_cut1_devs, +ARRAY_SIZE (ab8540_cut1_devs), +NULL ,0 , ab8500->domain);else /* ab8540 >= cut2 */ - ret =mfd_add_devices (ab8500->dev,0 , ab8540_cut2_devs, -ARRAY_SIZE (ab8540_cut2_devs),NULL , -0 , ab8500->domain); + ret =devm_mfd_add_devices (ab8500->dev,0 , + ab8540_cut2_devs, +ARRAY_SIZE (ab8540_cut2_devs), +NULL ,0 , ab8500->domain); }else if (is_ab8505 (ab8500)) - ret =mfd_add_devices (ab8500->dev,0 , ab8505_devs, -ARRAY_SIZE (ab8505_devs),NULL , -0 , ab8500->domain); + ret =devm_mfd_add_devices (ab8500->dev,0 , ab8505_devs, +ARRAY_SIZE (ab8505_devs),NULL , +0 , ab8500->domain);else - ret =mfd_add_devices (ab8500->dev,0 , ab8500_devs, -ARRAY_SIZE (ab8500_devs),NULL , -0 , ab8500->domain); + ret =devm_mfd_add_devices (ab8500->dev,0 , ab8500_devs, +ARRAY_SIZE (ab8500_devs),NULL , +0 , ab8500->domain);if (ret)return ret;/* Add battery management devices */ - ret =mfd_add_devices (ab8500->dev,0 , ab8500_bm_devs, -ARRAY_SIZE (ab8500_bm_devs),NULL , -0 , ab8500->domain); + ret =devm_mfd_add_devices (ab8500->dev,0 , ab8500_bm_devs, +ARRAY_SIZE (ab8500_bm_devs),NULL , +0 , ab8500->domain);if (ret)dev_err (ab8500->dev,"error adding bm devices\n" );
Signature · 1 line
2.53.0