Hi, On 8/25/24 7:16 AM, Dmitry Torokhov wrote: > 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. > > Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx> Thanks, patch looks good to me: Reviewed-by: Hans de Goede <hdegoede@xxxxxxxxxx> Regards, Hans > --- > drivers/input/keyboard/atkbd.c | 37 ++++++++++++++-------------------- > 1 file changed, 15 insertions(+), 22 deletions(-) > > diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c > index f4f2078cf501..5855d4fc6e6a 100644 > --- a/drivers/input/keyboard/atkbd.c > +++ b/drivers/input/keyboard/atkbd.c > @@ -639,7 +639,7 @@ static void atkbd_event_work(struct work_struct *work) > { > struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work); > > - mutex_lock(&atkbd->mutex); > + guard(mutex)(&atkbd->mutex); > > if (!atkbd->enabled) { > /* > @@ -657,8 +657,6 @@ static void atkbd_event_work(struct work_struct *work) > if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) > atkbd_set_repeat_rate(atkbd); > } > - > - mutex_unlock(&atkbd->mutex); > } > > /* > @@ -1361,7 +1359,7 @@ static int atkbd_reconnect(struct serio *serio) > { > struct atkbd *atkbd = atkbd_from_serio(serio); > struct serio_driver *drv = serio->drv; > - int retval = -1; > + int error; > > if (!atkbd || !drv) { > dev_dbg(&serio->dev, > @@ -1369,16 +1367,17 @@ static int atkbd_reconnect(struct serio *serio) > return -1; > } > > - mutex_lock(&atkbd->mutex); > + guard(mutex)(&atkbd->mutex); > > atkbd_disable(atkbd); > > if (atkbd->write) { > - if (atkbd_probe(atkbd)) > - goto out; > + error = atkbd_probe(atkbd); > + if (error) > + return error; > > if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) > - goto out; > + return -EIO; > > /* > * Restore LED state and repeat rate. While input core > @@ -1404,11 +1403,7 @@ static int atkbd_reconnect(struct serio *serio) > if (atkbd->write) > atkbd_activate(atkbd); > > - retval = 0; > - > - out: > - mutex_unlock(&atkbd->mutex); > - return retval; > + return 0; > } > > static const struct serio_device_id atkbd_serio_ids[] = { > @@ -1465,17 +1460,15 @@ static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t > struct atkbd *atkbd = atkbd_from_serio(serio); > int retval; > > - retval = mutex_lock_interruptible(&atkbd->mutex); > - if (retval) > - return retval; > + scoped_guard(mutex_intr, &atkbd->mutex) { > + atkbd_disable(atkbd); > + retval = handler(atkbd, buf, count); > + atkbd_enable(atkbd); > > - atkbd_disable(atkbd); > - retval = handler(atkbd, buf, count); > - atkbd_enable(atkbd); > - > - mutex_unlock(&atkbd->mutex); > + return retval; > + } > > - return retval; > + return -EINTR; > } > > static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)