]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
power: sequencing: fix missing state_lock in pwrseq_power_on() error path
authorZiyi Guo <n7l8m4@u.northwestern.edu>
Fri, 30 Jan 2026 18:26:51 +0000 (18:26 +0000)
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Wed, 4 Feb 2026 10:26:14 +0000 (11:26 +0100)
pwrseq_power_on() calls pwrseq_unit_disable() when the
post_enable callback fails. However, this call is outside the
scoped_guard(mutex, &pwrseq->state_lock) block that ends.

pwrseq_unit_disable() has lockdep_assert_held(&pwrseq->state_lock),
which will fail when called from this error path.

Add the scoped_guard block to cover the post_enable callback and its
error handling to ensure the lock is held when pwrseq_unit_disable() is
called.

Signed-off-by: Ziyi Guo <n7l8m4@u.northwestern.edu>
Link: https://patch.msgid.link/20260130182651.1576579-1-n7l8m4@u.northwestern.edu
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
drivers/power/sequencing/core.c

index 190564e55988557940206b059fef52981bd49e5b..1fcf0af7cc0bbcc788fcac12fc4d97bfc6004d81 100644 (file)
@@ -914,8 +914,10 @@ int pwrseq_power_on(struct pwrseq_desc *desc)
        if (target->post_enable) {
                ret = target->post_enable(pwrseq);
                if (ret) {
-                       pwrseq_unit_disable(pwrseq, unit);
-                       desc->powered_on = false;
+                       scoped_guard(mutex, &pwrseq->state_lock) {
+                               pwrseq_unit_disable(pwrseq, unit);
+                               desc->powered_on = false;
+                       }
                }
        }