Skip to content

Commit 934976f

Browse files
committed
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>
1 parent d5322d5 commit 934976f

1 file changed

Lines changed: 15 additions & 22 deletions

File tree

drivers/input/keyboard/atkbd.c

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ static void atkbd_event_work(struct work_struct *work)
639639
{
640640
struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work);
641641

642-
mutex_lock(&atkbd->mutex);
642+
guard(mutex)(&atkbd->mutex);
643643

644644
if (!atkbd->enabled) {
645645
/*
@@ -657,8 +657,6 @@ static void atkbd_event_work(struct work_struct *work)
657657
if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask))
658658
atkbd_set_repeat_rate(atkbd);
659659
}
660-
661-
mutex_unlock(&atkbd->mutex);
662660
}
663661

664662
/*
@@ -1361,24 +1359,25 @@ static int atkbd_reconnect(struct serio *serio)
13611359
{
13621360
struct atkbd *atkbd = atkbd_from_serio(serio);
13631361
struct serio_driver *drv = serio->drv;
1364-
int retval = -1;
1362+
int error;
13651363

13661364
if (!atkbd || !drv) {
13671365
dev_dbg(&serio->dev,
13681366
"reconnect request, but serio is disconnected, ignoring...\n");
13691367
return -1;
13701368
}
13711369

1372-
mutex_lock(&atkbd->mutex);
1370+
guard(mutex)(&atkbd->mutex);
13731371

13741372
atkbd_disable(atkbd);
13751373

13761374
if (atkbd->write) {
1377-
if (atkbd_probe(atkbd))
1378-
goto out;
1375+
error = atkbd_probe(atkbd);
1376+
if (error)
1377+
return error;
13791378

13801379
if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra))
1381-
goto out;
1380+
return -EIO;
13821381

13831382
/*
13841383
* Restore LED state and repeat rate. While input core
@@ -1404,11 +1403,7 @@ static int atkbd_reconnect(struct serio *serio)
14041403
if (atkbd->write)
14051404
atkbd_activate(atkbd);
14061405

1407-
retval = 0;
1408-
1409-
out:
1410-
mutex_unlock(&atkbd->mutex);
1411-
return retval;
1406+
return 0;
14121407
}
14131408

14141409
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
14651460
struct atkbd *atkbd = atkbd_from_serio(serio);
14661461
int retval;
14671462

1468-
retval = mutex_lock_interruptible(&atkbd->mutex);
1469-
if (retval)
1470-
return retval;
1463+
scoped_guard(mutex_intr, &atkbd->mutex) {
1464+
atkbd_disable(atkbd);
1465+
retval = handler(atkbd, buf, count);
1466+
atkbd_enable(atkbd);
14711467

1472-
atkbd_disable(atkbd);
1473-
retval = handler(atkbd, buf, count);
1474-
atkbd_enable(atkbd);
1475-
1476-
mutex_unlock(&atkbd->mutex);
1468+
return retval;
1469+
}
14771470

1478-
return retval;
1471+
return -EINTR;
14791472
}
14801473

14811474
static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf)

0 commit comments

Comments
 (0)