Input: alps - use guard notation when acquiring mutex
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Sun, 25 Aug 2024 05:30:57 +0000 (22:30 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 6 Sep 2024 05:52:37 +0000 (22:52 -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.

Acked-by: Pali Rohár <pali@kernel.org>
Link: https://lore.kernel.org/r/ZsrBkWIpyEqzClUG@google.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/mouse/alps.c

index d5ef5a112d6f034928b3dd327b0c4e9629a487ab..4e37fc3f1a9e97e0cc5cf298ca3778ca25841055 100644 (file)
@@ -1396,24 +1396,16 @@ static bool alps_is_valid_package_ss4_v2(struct psmouse *psmouse)
 
 static DEFINE_MUTEX(alps_mutex);
 
-static void alps_register_bare_ps2_mouse(struct work_struct *work)
+static int alps_do_register_bare_ps2_mouse(struct alps_data *priv)
 {
-       struct alps_data *priv =
-               container_of(work, struct alps_data, dev3_register_work.work);
        struct psmouse *psmouse = priv->psmouse;
        struct input_dev *dev3;
-       int error = 0;
-
-       mutex_lock(&alps_mutex);
-
-       if (priv->dev3)
-               goto out;
+       int error;
 
        dev3 = input_allocate_device();
        if (!dev3) {
                psmouse_err(psmouse, "failed to allocate secondary device\n");
-               error = -ENOMEM;
-               goto out;
+               return -ENOMEM;
        }
 
        snprintf(priv->phys3, sizeof(priv->phys3), "%s/%s",
@@ -1446,21 +1438,35 @@ static void alps_register_bare_ps2_mouse(struct work_struct *work)
                psmouse_err(psmouse,
                            "failed to register secondary device: %d\n",
                            error);
-               input_free_device(dev3);
-               goto out;
+               goto err_free_input;
        }
 
        priv->dev3 = dev3;
+       return 0;
 
-out:
-       /*
-        * Save the error code so that we can detect that we
-        * already tried to create the device.
-        */
-       if (error)
-               priv->dev3 = ERR_PTR(error);
+err_free_input:
+       input_free_device(dev3);
+       return error;
+}
 
-       mutex_unlock(&alps_mutex);
+static void alps_register_bare_ps2_mouse(struct work_struct *work)
+{
+       struct alps_data *priv = container_of(work, struct alps_data,
+                                             dev3_register_work.work);
+       int error;
+
+       guard(mutex)(&alps_mutex);
+
+       if (!priv->dev3) {
+               error = alps_do_register_bare_ps2_mouse(priv);
+               if (error) {
+                       /*
+                        * Save the error code so that we can detect that we
+                        * already tried to create the device.
+                        */
+                       priv->dev3 = ERR_PTR(error);
+               }
+       }
 }
 
 static void alps_report_bare_ps2_packet(struct psmouse *psmouse,
This page took 0.054094 seconds and 4 git commands to generate.