genirq: Unlock irq descriptor after errors

In irq_set_irqchip_state(), the irq descriptor is not unlocked after an
error is encountered. While that should never happen in practice, a buggy
driver may trigger it. This would result in a lockup, so fix it.

Fixes: 1d0326f352bb ("genirq: Check irq_data_get_irq_chip() return value before use")
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20200811180012.80269-1-linux@roeck-us.net

authored by Guenter Roeck and committed by Thomas Gleixner f107cee9 e27b1636

Changed files
+5 -2
kernel
irq
+5 -2
kernel/irq/manage.c
··· 2731 2731 2732 2732 do { 2733 2733 chip = irq_data_get_irq_chip(data); 2734 - if (WARN_ON_ONCE(!chip)) 2735 - return -ENODEV; 2734 + if (WARN_ON_ONCE(!chip)) { 2735 + err = -ENODEV; 2736 + goto out_unlock; 2737 + } 2736 2738 if (chip->irq_set_irqchip_state) 2737 2739 break; 2738 2740 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY ··· 2747 2745 if (data) 2748 2746 err = chip->irq_set_irqchip_state(data, which, val); 2749 2747 2748 + out_unlock: 2750 2749 irq_put_desc_busunlock(desc, flags); 2751 2750 return err; 2752 2751 }