Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: serport - use guard notation when acquiring spinlock

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.

Link: https://lore.kernel.org/r/20240905041732.2034348-19-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

+8 -19
+8 -19
drivers/input/serio/serport.c
··· 50 50 static int serport_serio_open(struct serio *serio) 51 51 { 52 52 struct serport *serport = serio->port_data; 53 - unsigned long flags; 54 53 55 - spin_lock_irqsave(&serport->lock, flags); 54 + guard(spinlock_irqsave)(&serport->lock); 56 55 set_bit(SERPORT_ACTIVE, &serport->flags); 57 - spin_unlock_irqrestore(&serport->lock, flags); 58 56 59 57 return 0; 60 58 } ··· 61 63 static void serport_serio_close(struct serio *serio) 62 64 { 63 65 struct serport *serport = serio->port_data; 64 - unsigned long flags; 65 66 66 - spin_lock_irqsave(&serport->lock, flags); 67 + guard(spinlock_irqsave)(&serport->lock); 67 68 clear_bit(SERPORT_ACTIVE, &serport->flags); 68 - spin_unlock_irqrestore(&serport->lock, flags); 69 69 } 70 70 71 71 /* ··· 114 118 const u8 *fp, size_t count) 115 119 { 116 120 struct serport *serport = tty->disc_data; 117 - unsigned long flags; 118 121 unsigned int ch_flags = 0; 119 122 int i; 120 123 121 - spin_lock_irqsave(&serport->lock, flags); 124 + guard(spinlock_irqsave)(&serport->lock); 122 125 123 126 if (!test_bit(SERPORT_ACTIVE, &serport->flags)) 124 - goto out; 127 + return; 125 128 126 129 for (i = 0; i < count; i++) { 127 130 if (fp) { ··· 141 146 142 147 serio_interrupt(serport->serio, cp[i], ch_flags); 143 148 } 144 - 145 - out: 146 - spin_unlock_irqrestore(&serport->lock, flags); 147 149 } 148 150 149 151 /* ··· 238 246 static void serport_ldisc_hangup(struct tty_struct *tty) 239 247 { 240 248 struct serport *serport = tty->disc_data; 241 - unsigned long flags; 242 249 243 - spin_lock_irqsave(&serport->lock, flags); 244 - set_bit(SERPORT_DEAD, &serport->flags); 245 - spin_unlock_irqrestore(&serport->lock, flags); 250 + scoped_guard(spinlock_irqsave, &serport->lock) 251 + set_bit(SERPORT_DEAD, &serport->flags); 246 252 247 253 wake_up_interruptible(&serport->wait); 248 254 } ··· 248 258 static void serport_ldisc_write_wakeup(struct tty_struct * tty) 249 259 { 250 260 struct serport *serport = tty->disc_data; 251 - unsigned long flags; 252 261 253 - spin_lock_irqsave(&serport->lock, flags); 262 + guard(spinlock_irqsave)(&serport->lock); 263 + 254 264 if (test_bit(SERPORT_ACTIVE, &serport->flags)) 255 265 serio_drv_write_wakeup(serport->serio); 256 - spin_unlock_irqrestore(&serport->lock, flags); 257 266 } 258 267 259 268 /*