]> Git Repo - linux.git/commitdiff
Revert "pinctrl: avoid unsafe code pattern in find_pinctrl()"
authorAndy Shevchenko <[email protected]>
Tue, 17 Oct 2023 14:18:06 +0000 (17:18 +0300)
committerLinus Walleij <[email protected]>
Thu, 19 Oct 2023 08:12:48 +0000 (10:12 +0200)
The commit breaks MMC enumeration on the Intel Merrifield
plaform.

Before:
[   36.439057] mmc0: SDHCI controller on PCI [0000:00:01.0] using ADMA
[   36.450924] mmc2: SDHCI controller on PCI [0000:00:01.3] using ADMA
[   36.459355] mmc1: SDHCI controller on PCI [0000:00:01.2] using ADMA
[   36.706399] mmc0: new DDR MMC card at address 0001
[   37.058972] mmc2: new ultra high speed DDR50 SDIO card at address 0001
[   37.278977] mmcblk0: mmc0:0001 H4G1d 3.64 GiB
[   37.297300]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10

After:
[   36.436704] mmc2: SDHCI controller on PCI [0000:00:01.3] using ADMA
[   36.436720] mmc1: SDHCI controller on PCI [0000:00:01.0] using ADMA
[   36.463685] mmc0: SDHCI controller on PCI [0000:00:01.2] using ADMA
[   36.720627] mmc1: new DDR MMC card at address 0001
[   37.068181] mmc2: new ultra high speed DDR50 SDIO card at address 0001
[   37.279998] mmcblk1: mmc1:0001 H4G1d 3.64 GiB
[   37.302670]  mmcblk1: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10

This reverts commit c153a4edff6ab01370fcac8e46f9c89cca1060c2.

Signed-off-by: Andy Shevchenko <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Linus Walleij <[email protected]>
drivers/pinctrl/core.c

index e2f7519bef048a1f0d5e8739c0ebc6eec3682d22..e9dc9638120a52fd986e3f00bd7731a8b4902731 100644 (file)
@@ -1022,20 +1022,17 @@ static int add_setting(struct pinctrl *p, struct pinctrl_dev *pctldev,
 
 static struct pinctrl *find_pinctrl(struct device *dev)
 {
-       struct pinctrl *entry, *p = NULL;
+       struct pinctrl *p;
 
        mutex_lock(&pinctrl_list_mutex);
-
-       list_for_each_entry(entry, &pinctrl_list, node) {
-               if (entry->dev == dev) {
-                       p = entry;
-                       kref_get(&p->users);
-                       break;
+       list_for_each_entry(p, &pinctrl_list, node)
+               if (p->dev == dev) {
+                       mutex_unlock(&pinctrl_list_mutex);
+                       return p;
                }
-       }
 
        mutex_unlock(&pinctrl_list_mutex);
-       return p;
+       return NULL;
 }
 
 static void pinctrl_free(struct pinctrl *p, bool inlist);
@@ -1143,6 +1140,7 @@ struct pinctrl *pinctrl_get(struct device *dev)
        p = find_pinctrl(dev);
        if (p) {
                dev_dbg(dev, "obtain a copy of previously claimed pinctrl\n");
+               kref_get(&p->users);
                return p;
        }
 
This page took 0.051387 seconds and 4 git commands to generate.