Using guard notation makes the code more compact and error handling
more robust by ensuring that locks are released in all code paths
when control leaves critical section.

Signed-off-by: Dmitry Torokhov <dmitry.torok...@gmail.com>
---
 drivers/input/serio/serport.c | 27 ++++++++-------------------
 1 file changed, 8 insertions(+), 19 deletions(-)

diff --git a/drivers/input/serio/serport.c b/drivers/input/serio/serport.c
index 5a2b5404ffc2..74ac88796187 100644
--- a/drivers/input/serio/serport.c
+++ b/drivers/input/serio/serport.c
@@ -50,11 +50,9 @@ static int serport_serio_write(struct serio *serio, unsigned 
char data)
 static int serport_serio_open(struct serio *serio)
 {
        struct serport *serport = serio->port_data;
-       unsigned long flags;
 
-       spin_lock_irqsave(&serport->lock, flags);
+       guard(spinlock_irqsave)(&serport->lock);
        set_bit(SERPORT_ACTIVE, &serport->flags);
-       spin_unlock_irqrestore(&serport->lock, flags);
 
        return 0;
 }
@@ -63,11 +61,9 @@ static int serport_serio_open(struct serio *serio)
 static void serport_serio_close(struct serio *serio)
 {
        struct serport *serport = serio->port_data;
-       unsigned long flags;
 
-       spin_lock_irqsave(&serport->lock, flags);
+       guard(spinlock_irqsave)(&serport->lock);
        clear_bit(SERPORT_ACTIVE, &serport->flags);
-       spin_unlock_irqrestore(&serport->lock, flags);
 }
 
 /*
@@ -118,14 +114,13 @@ static void serport_ldisc_receive(struct tty_struct *tty, 
const u8 *cp,
                                  const u8 *fp, size_t count)
 {
        struct serport *serport = tty->disc_data;
-       unsigned long flags;
        unsigned int ch_flags = 0;
        int i;
 
-       spin_lock_irqsave(&serport->lock, flags);
+       guard(spinlock_irqsave)(&serport->lock);
 
        if (!test_bit(SERPORT_ACTIVE, &serport->flags))
-               goto out;
+               return;
 
        for (i = 0; i < count; i++) {
                if (fp) {
@@ -146,9 +141,6 @@ static void serport_ldisc_receive(struct tty_struct *tty, 
const u8 *cp,
 
                serio_interrupt(serport->serio, cp[i], ch_flags);
        }
-
-out:
-       spin_unlock_irqrestore(&serport->lock, flags);
 }
 
 /*
@@ -246,11 +238,9 @@ static int serport_ldisc_compat_ioctl(struct tty_struct 
*tty,
 static void serport_ldisc_hangup(struct tty_struct *tty)
 {
        struct serport *serport = tty->disc_data;
-       unsigned long flags;
 
-       spin_lock_irqsave(&serport->lock, flags);
-       set_bit(SERPORT_DEAD, &serport->flags);
-       spin_unlock_irqrestore(&serport->lock, flags);
+       scoped_guard(spinlock_irqsave, &serport->lock)
+               set_bit(SERPORT_DEAD, &serport->flags);
 
        wake_up_interruptible(&serport->wait);
 }
@@ -258,12 +248,11 @@ static void serport_ldisc_hangup(struct tty_struct *tty)
 static void serport_ldisc_write_wakeup(struct tty_struct * tty)
 {
        struct serport *serport = tty->disc_data;
-       unsigned long flags;
 
-       spin_lock_irqsave(&serport->lock, flags);
+       guard(spinlock_irqsave)(&serport->lock);
+
        if (test_bit(SERPORT_ACTIVE, &serport->flags))
                serio_drv_write_wakeup(serport->serio);
-       spin_unlock_irqrestore(&serport->lock, flags);
 }
 
 /*
-- 
2.46.0.469.g59c65b2a67-goog


Reply via email to