Input: psmouse-smbus - use guard notation when acquiring mutex
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Sun, 25 Aug 2024 05:26:03 +0000 (22:26 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 3 Oct 2024 15:39:21 +0000 (08:39 -0700)
This makes the code more compact and error handling more robust
by ensuring that mutexes are released in all code paths when control
leaves critical section.

Link: https://lore.kernel.org/r/ZsrAa9XcDvHeIs9T@google.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/mouse/psmouse-smbus.c

index 2a2459b..93420f0 100644 (file)
@@ -35,7 +35,7 @@ static void psmouse_smbus_check_adapter(struct i2c_adapter *adapter)
        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_HOST_NOTIFY))
                return;
 
-       mutex_lock(&psmouse_smbus_mutex);
+       guard(mutex)(&psmouse_smbus_mutex);
 
        list_for_each_entry(smbdev, &psmouse_smbus_list, node) {
                if (smbdev->dead)
@@ -55,15 +55,13 @@ static void psmouse_smbus_check_adapter(struct i2c_adapter *adapter)
                            "SMBus candidate adapter appeared, triggering rescan\n");
                serio_rescan(smbdev->psmouse->ps2dev.serio);
        }
-
-       mutex_unlock(&psmouse_smbus_mutex);
 }
 
 static void psmouse_smbus_detach_i2c_client(struct i2c_client *client)
 {
        struct psmouse_smbus_dev *smbdev, *tmp;
 
-       mutex_lock(&psmouse_smbus_mutex);
+       guard(mutex)(&psmouse_smbus_mutex);
 
        list_for_each_entry_safe(smbdev, tmp, &psmouse_smbus_list, node) {
                if (smbdev->client != client)
@@ -85,8 +83,6 @@ static void psmouse_smbus_detach_i2c_client(struct i2c_client *client)
                        kfree(smbdev);
                }
        }
-
-       mutex_unlock(&psmouse_smbus_mutex);
 }
 
 static int psmouse_smbus_notifier_call(struct notifier_block *nb,
@@ -171,7 +167,7 @@ static void psmouse_smbus_disconnect(struct psmouse *psmouse)
 {
        struct psmouse_smbus_dev *smbdev = psmouse->private;
 
-       mutex_lock(&psmouse_smbus_mutex);
+       guard(mutex)(&psmouse_smbus_mutex);
 
        if (smbdev->dead) {
                list_del(&smbdev->node);
@@ -186,8 +182,6 @@ static void psmouse_smbus_disconnect(struct psmouse *psmouse)
                psmouse_smbus_schedule_remove(smbdev->client);
        }
 
-       mutex_unlock(&psmouse_smbus_mutex);
-
        psmouse->private = NULL;
 }
 
@@ -219,7 +213,7 @@ void psmouse_smbus_cleanup(struct psmouse *psmouse)
 {
        struct psmouse_smbus_dev *smbdev, *tmp;
 
-       mutex_lock(&psmouse_smbus_mutex);
+       guard(mutex)(&psmouse_smbus_mutex);
 
        list_for_each_entry_safe(smbdev, tmp, &psmouse_smbus_list, node) {
                if (psmouse == smbdev->psmouse) {
@@ -227,8 +221,6 @@ void psmouse_smbus_cleanup(struct psmouse *psmouse)
                        kfree(smbdev);
                }
        }
-
-       mutex_unlock(&psmouse_smbus_mutex);
 }
 
 int psmouse_smbus_init(struct psmouse *psmouse,
@@ -267,9 +259,9 @@ int psmouse_smbus_init(struct psmouse *psmouse,
        psmouse->disconnect = psmouse_smbus_disconnect;
        psmouse->resync_time = 0;
 
-       mutex_lock(&psmouse_smbus_mutex);
-       list_add_tail(&smbdev->node, &psmouse_smbus_list);
-       mutex_unlock(&psmouse_smbus_mutex);
+       scoped_guard(mutex, &psmouse_smbus_mutex) {
+               list_add_tail(&smbdev->node, &psmouse_smbus_list);
+       }
 
        /* Bind to already existing adapters right away */
        error = i2c_for_each_dev(smbdev, psmouse_smbus_create_companion);
@@ -293,9 +285,9 @@ int psmouse_smbus_init(struct psmouse *psmouse,
        smbdev->board.platform_data = NULL;
 
        if (error < 0 || !leave_breadcrumbs) {
-               mutex_lock(&psmouse_smbus_mutex);
-               list_del(&smbdev->node);
-               mutex_unlock(&psmouse_smbus_mutex);
+               scoped_guard(mutex, &psmouse_smbus_mutex) {
+                       list_del(&smbdev->node);
+               }
 
                kfree(smbdev);
        }