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

Input: gamecon - use guard notation when acquiring mutex

Using guard notation 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.

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

+10 -12
+10 -12
drivers/input/joystick/gamecon.c
··· 765 765 static int gc_open(struct input_dev *dev) 766 766 { 767 767 struct gc *gc = input_get_drvdata(dev); 768 - int err; 769 768 770 - err = mutex_lock_interruptible(&gc->mutex); 771 - if (err) 772 - return err; 769 + scoped_guard(mutex_intr, &gc->mutex) { 770 + if (!gc->used++) { 771 + parport_claim(gc->pd); 772 + parport_write_control(gc->pd->port, 0x04); 773 + mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); 774 + } 773 775 774 - if (!gc->used++) { 775 - parport_claim(gc->pd); 776 - parport_write_control(gc->pd->port, 0x04); 777 - mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); 776 + return 0; 778 777 } 779 778 780 - mutex_unlock(&gc->mutex); 781 - return 0; 779 + return -EINTR; 782 780 } 783 781 784 782 static void gc_close(struct input_dev *dev) 785 783 { 786 784 struct gc *gc = input_get_drvdata(dev); 787 785 788 - mutex_lock(&gc->mutex); 786 + guard(mutex)(&gc->mutex); 787 + 789 788 if (!--gc->used) { 790 789 del_timer_sync(&gc->timer); 791 790 parport_write_control(gc->pd->port, 0x00); 792 791 parport_release(gc->pd); 793 792 } 794 - mutex_unlock(&gc->mutex); 795 793 } 796 794 797 795 static int gc_setup_pad(struct gc *gc, int idx, int pad_type)