diff options
author | Otavio Salvador <otavio@ossystems.com.br> | 2017-07-10 18:34:42 -0300 |
---|---|---|
committer | Otavio Salvador <otavio@ossystems.com.br> | 2017-07-10 18:34:42 -0300 |
commit | 0ce648e52352feb10fcf8a64aa4bebae68394a63 (patch) | |
tree | 8c7afba7e8cd07f83e1442c464312986a55e60d3 /sound | |
parent | b5ff530fd1e6a125b85e359f85955d60b0e4cd68 (diff) | |
parent | 2ac51e21d8c50ca37fc9b5b9a9b4937c810b0d0a (diff) |
Merge tag 'v4.1.42' into 4.1-2.0.x-imx
Linux 4.1.42
* tag 'v4.1.42': (146 commits)
Linux 4.1.42
mm: fix new crash in unmapped_area_topdown()
mm: larger stack guard gap, between vmas
alarmtimer: Rate limit periodic intervals
MIPS: Fix bnezc/jialc return address calculation
usb: dwc3: exynos fix axius clock error path to do cleanup
genirq: Release resources in __setup_irq() error path
swap: cond_resched in swap_cgroup_prepare()
mm/memory-failure.c: use compound_head() flags for huge pages
USB: gadgetfs, dummy-hcd, net2280: fix locking for callbacks
usb: xhci: ASMedia ASM1042A chipset need shorts TX quirk
drivers/misc/c2port/c2port-duramar2150.c: checking for NULL instead of IS_ERR()
usb: r8a66597-hcd: decrease timeout
usb: r8a66597-hcd: select a different endpoint on timeout
USB: gadget: dummy_hcd: fix hub-descriptor removable fields
[media] pvrusb2: reduce stack usage pvr2_eeprom_analyze()
usb: core: fix potential memory leak in error path during hcd creation
USB: hub: fix SS max number of ports
iio: proximity: as3935: recalibrate RCO after resume
staging: rtl8188eu: prevent an underflow in rtw_check_beacon_data()
...
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/timer.c | 7 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 5 |
2 files changed, 8 insertions, 4 deletions
diff --git a/sound/core/timer.c b/sound/core/timer.c index b024ef0ec32b..b1b6a78f6c1c 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -1616,6 +1616,7 @@ static int snd_timer_user_tselect(struct file *file, if (err < 0) goto __err; + tu->qhead = tu->qtail = tu->qused = 0; kfree(tu->queue); tu->queue = NULL; kfree(tu->tqueue); @@ -1956,6 +1957,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, tu = file->private_data; unit = tu->tread ? sizeof(struct snd_timer_tread) : sizeof(struct snd_timer_read); + mutex_lock(&tu->ioctl_lock); spin_lock_irq(&tu->qlock); while ((long)count - result >= unit) { while (!tu->qused) { @@ -1971,7 +1973,9 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, add_wait_queue(&tu->qchange_sleep, &wait); spin_unlock_irq(&tu->qlock); + mutex_unlock(&tu->ioctl_lock); schedule(); + mutex_lock(&tu->ioctl_lock); spin_lock_irq(&tu->qlock); remove_wait_queue(&tu->qchange_sleep, &wait); @@ -1991,7 +1995,6 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, tu->qused--; spin_unlock_irq(&tu->qlock); - mutex_lock(&tu->ioctl_lock); if (tu->tread) { if (copy_to_user(buffer, &tu->tqueue[qhead], sizeof(struct snd_timer_tread))) @@ -2001,7 +2004,6 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, sizeof(struct snd_timer_read))) err = -EFAULT; } - mutex_unlock(&tu->ioctl_lock); spin_lock_irq(&tu->qlock); if (err < 0) @@ -2011,6 +2013,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, } _error: spin_unlock_irq(&tu->qlock); + mutex_unlock(&tu->ioctl_lock); return result > 0 ? result : err; } diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 23732523f87c..5598747e5a11 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -1778,6 +1778,9 @@ static int soc_cleanup_card_resources(struct snd_soc_card *card) for (i = 0; i < card->num_aux_devs; i++) soc_remove_aux_dev(card, i); + /* free the ALSA card at first; this syncs with pending operations */ + snd_card_free(card->snd_card); + /* remove and free each DAI */ soc_remove_dai_links(card); @@ -1789,9 +1792,7 @@ static int soc_cleanup_card_resources(struct snd_soc_card *card) snd_soc_dapm_free(&card->dapm); - snd_card_free(card->snd_card); return 0; - } /* removes a socdev */ |