| From 02a9c6ee4183af2e438454c55098b828a96085fb Mon Sep 17 00:00:00 2001 |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| Date: Fri, 13 Nov 2020 13:12:41 +0300 |
| Subject: ALSA: firewire: Clean up a locking issue in copy_resp_to_buf() |
| |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| |
| commit 02a9c6ee4183af2e438454c55098b828a96085fb upstream. |
| |
| The spin_lock/unlock_irq() functions cannot be nested. The problem is |
| that presumably we would want the IRQs to be re-enabled on the second |
| call the spin_unlock_irq() but instead it will be enabled at the first |
| call so IRQs will be enabled earlier than expected. |
| |
| In this situation the copy_resp_to_buf() function is only called from |
| one function and it is called with IRQs disabled. We can just use |
| the regular spin_lock/unlock() functions. |
| |
| Fixes: 555e8a8f7f14 ("ALSA: fireworks: Add command/response functionality into hwdep interface") |
| Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Acked-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> |
| Cc: <stable@vger.kernel.org> |
| Link: https://lore.kernel.org/r/20201113101241.GB168908@mwanda |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/firewire/fireworks/fireworks_transaction.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/sound/firewire/fireworks/fireworks_transaction.c |
| +++ b/sound/firewire/fireworks/fireworks_transaction.c |
| @@ -124,7 +124,7 @@ copy_resp_to_buf(struct snd_efw *efw, vo |
| t = (struct snd_efw_transaction *)data; |
| length = min_t(size_t, be32_to_cpu(t->length) * sizeof(u32), length); |
| |
| - spin_lock_irq(&efw->lock); |
| + spin_lock(&efw->lock); |
| |
| if (efw->push_ptr < efw->pull_ptr) |
| capacity = (unsigned int)(efw->pull_ptr - efw->push_ptr); |
| @@ -191,7 +191,7 @@ handle_resp_for_user(struct fw_card *car |
| |
| copy_resp_to_buf(efw, data, length, rcode); |
| end: |
| - spin_unlock_irq(&instances_lock); |
| + spin_unlock(&instances_lock); |
| } |
| |
| static void |