diff options
| author | Jiri Kosina <[email protected]> | 2020-04-01 12:26:12 +0200 |
|---|---|---|
| committer | Jiri Kosina <[email protected]> | 2020-04-01 12:26:12 +0200 |
| commit | c9f289701540baeef9ac7c9977d67a7259f404db (patch) | |
| tree | ac3c29d41da02ac735c9a12da78905842fbccd2f /virt/lib/irqbypass.c | |
| parent | 0aac6f9aaae5fba08963651d2ce49930145e118f (diff) | |
| parent | 910a7e89cec65efad254c947ce2bf8bf5b370962 (diff) | |
Merge branch 'for-5.7/appleir' into for-linus
- small code cleanups in hid-appleir from Lucas Tanure
Diffstat (limited to 'virt/lib/irqbypass.c')
| -rw-r--r-- | virt/lib/irqbypass.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/virt/lib/irqbypass.c b/virt/lib/irqbypass.c index 43de8ae78fa1..28fda42e471b 100644 --- a/virt/lib/irqbypass.c +++ b/virt/lib/irqbypass.c @@ -85,6 +85,7 @@ int irq_bypass_register_producer(struct irq_bypass_producer *producer) { struct irq_bypass_producer *tmp; struct irq_bypass_consumer *consumer; + int ret; if (!producer->token) return -EINVAL; @@ -98,20 +99,16 @@ int irq_bypass_register_producer(struct irq_bypass_producer *producer) list_for_each_entry(tmp, &producers, node) { if (tmp->token == producer->token) { - mutex_unlock(&lock); - module_put(THIS_MODULE); - return -EBUSY; + ret = -EBUSY; + goto out_err; } } list_for_each_entry(consumer, &consumers, node) { if (consumer->token == producer->token) { - int ret = __connect(producer, consumer); - if (ret) { - mutex_unlock(&lock); - module_put(THIS_MODULE); - return ret; - } + ret = __connect(producer, consumer); + if (ret) + goto out_err; break; } } @@ -121,6 +118,10 @@ int irq_bypass_register_producer(struct irq_bypass_producer *producer) mutex_unlock(&lock); return 0; +out_err: + mutex_unlock(&lock); + module_put(THIS_MODULE); + return ret; } EXPORT_SYMBOL_GPL(irq_bypass_register_producer); @@ -179,6 +180,7 @@ int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer) { struct irq_bypass_consumer *tmp; struct irq_bypass_producer *producer; + int ret; if (!consumer->token || !consumer->add_producer || !consumer->del_producer) @@ -193,20 +195,16 @@ int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer) list_for_each_entry(tmp, &consumers, node) { if (tmp->token == consumer->token || tmp == consumer) { - mutex_unlock(&lock); - module_put(THIS_MODULE); - return -EBUSY; + ret = -EBUSY; + goto out_err; } } list_for_each_entry(producer, &producers, node) { if (producer->token == consumer->token) { - int ret = __connect(producer, consumer); - if (ret) { - mutex_unlock(&lock); - module_put(THIS_MODULE); - return ret; - } + ret = __connect(producer, consumer); + if (ret) + goto out_err; break; } } @@ -216,6 +214,10 @@ int irq_bypass_register_consumer(struct irq_bypass_consumer *consumer) mutex_unlock(&lock); return 0; +out_err: + mutex_unlock(&lock); + module_put(THIS_MODULE); + return ret; } EXPORT_SYMBOL_GPL(irq_bypass_register_consumer); |