mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:46:16 +00:00
Input: atkbd - use guard notation when acquiring mutex
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. Reviewed-by: Hans de Goede <hdegoede@redhat.com> Link: https://lore.kernel.org/r/20240825051627.2848495-4-dmitry.torokhov@gmail.com Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
d5322d537c
commit
934976f61e
@ -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)
|
||||
scoped_guard(mutex_intr, &atkbd->mutex) {
|
||||
atkbd_disable(atkbd);
|
||||
retval = handler(atkbd, buf, count);
|
||||
atkbd_enable(atkbd);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
atkbd_disable(atkbd);
|
||||
retval = handler(atkbd, buf, count);
|
||||
atkbd_enable(atkbd);
|
||||
|
||||
mutex_unlock(&atkbd->mutex);
|
||||
|
||||
return retval;
|
||||
return -EINTR;
|
||||
}
|
||||
|
||||
static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)
|
||||
|
Loading…
Reference in New Issue
Block a user