]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 9 May 2015 17:24:23 +0000 (19:24 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 9 May 2015 17:24:23 +0000 (19:24 +0200)
added patches:
alsa-emu10k1-emu10k2-32-bit-dma-mode.patch
alsa-emu10k1-fix-card-shortname-string-buffer-overflow.patch
alsa-emux-fix-mutex-deadlock-at-unloading.patch
alsa-emux-fix-mutex-deadlock-in-oss-emulation.patch
alsa-hda-add-mute-led-mode-control-to-thinkpad.patch
alsa-hda-fix-mute-led-fixed-mode.patch
asoc-dapm-enable-autodisable-on-soc_dapm_single_tlv_autodisable.patch
ext4-fix-data-corruption-caused-by-unwritten-and-delayed-extents.patch
rbd-end-i-o-the-entire-obj_request-on-error.patch
serial-of-serial-remove-device_type-serial-registration.patch
tty-serial-at91-maxburst-was-missing-for-dma-transfers.patch

12 files changed:
queue-3.14/alsa-emu10k1-emu10k2-32-bit-dma-mode.patch [new file with mode: 0644]
queue-3.14/alsa-emu10k1-fix-card-shortname-string-buffer-overflow.patch [new file with mode: 0644]
queue-3.14/alsa-emux-fix-mutex-deadlock-at-unloading.patch [new file with mode: 0644]
queue-3.14/alsa-emux-fix-mutex-deadlock-in-oss-emulation.patch [new file with mode: 0644]
queue-3.14/alsa-hda-add-mute-led-mode-control-to-thinkpad.patch [new file with mode: 0644]
queue-3.14/alsa-hda-fix-mute-led-fixed-mode.patch [new file with mode: 0644]
queue-3.14/asoc-dapm-enable-autodisable-on-soc_dapm_single_tlv_autodisable.patch [new file with mode: 0644]
queue-3.14/ext4-fix-data-corruption-caused-by-unwritten-and-delayed-extents.patch [new file with mode: 0644]
queue-3.14/rbd-end-i-o-the-entire-obj_request-on-error.patch [new file with mode: 0644]
queue-3.14/serial-of-serial-remove-device_type-serial-registration.patch [new file with mode: 0644]
queue-3.14/series
queue-3.14/tty-serial-at91-maxburst-was-missing-for-dma-transfers.patch [new file with mode: 0644]

diff --git a/queue-3.14/alsa-emu10k1-emu10k2-32-bit-dma-mode.patch b/queue-3.14/alsa-emu10k1-emu10k2-32-bit-dma-mode.patch
new file mode 100644 (file)
index 0000000..e0ae28f
--- /dev/null
@@ -0,0 +1,205 @@
+From 7241ea558c6715501e777396b5fc312c372e11d9 Mon Sep 17 00:00:00 2001
+From: Peter Zubaj <pzubaj@marticonet.sk>
+Date: Tue, 28 Apr 2015 21:57:29 +0200
+Subject: ALSA: emu10k1: Emu10k2 32 bit DMA mode
+
+From: Peter Zubaj <pzubaj@marticonet.sk>
+
+commit 7241ea558c6715501e777396b5fc312c372e11d9 upstream.
+
+Looks like audigy emu10k2 (probably emu10k1 - sb live too) support two
+modes for DMA. Second mode is useful for 64 bit os with more then 2 GB
+of ram (fixes problems with big soundfont loading)
+
+1) 32MB from 2 GB address space using 8192 pages (used now as default)
+2) 16MB from 4 GB address space using 4096 pages
+
+Mode is set using HCFG_EXPANDED_MEM flag in HCFG register.
+Also format of emu10k2 page table is then different.
+
+Signed-off-by: Peter Zubaj <pzubaj@marticonet.sk>
+Tested-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ include/sound/emu10k1.h              |   14 +++++++++-----
+ sound/pci/emu10k1/emu10k1_callback.c |    4 ++--
+ sound/pci/emu10k1/emu10k1_main.c     |   17 ++++++++++++-----
+ sound/pci/emu10k1/emupcm.c           |    2 +-
+ sound/pci/emu10k1/memory.c           |   11 ++++++-----
+ 5 files changed, 30 insertions(+), 18 deletions(-)
+
+--- a/include/sound/emu10k1.h
++++ b/include/sound/emu10k1.h
+@@ -41,7 +41,8 @@
+ #define EMUPAGESIZE     4096
+ #define MAXREQVOICES    8
+-#define MAXPAGES        8192
++#define MAXPAGES0       4096  /* 32 bit mode */
++#define MAXPAGES1       8192  /* 31 bit mode */
+ #define RESERVED        0
+ #define NUM_MIDI        16
+ #define NUM_G           64              /* use all channels */
+@@ -50,8 +51,7 @@
+ /* FIXME? - according to the OSS driver the EMU10K1 needs a 29 bit DMA mask */
+ #define EMU10K1_DMA_MASK      0x7fffffffUL    /* 31bit */
+-#define AUDIGY_DMA_MASK               0x7fffffffUL    /* 31bit FIXME - 32 should work? */
+-                                              /* See ALSA bug #1276 - rlrevell */
++#define AUDIGY_DMA_MASK               0xffffffffUL    /* 32bit mode */
+ #define TMEMSIZE        256*1024
+ #define TMEMSIZEREG     4
+@@ -468,8 +468,11 @@
+ #define MAPB                  0x0d            /* Cache map B                                          */
+-#define MAP_PTE_MASK          0xffffe000      /* The 19 MSBs of the PTE indexed by the PTI            */
+-#define MAP_PTI_MASK          0x00001fff      /* The 13 bit index to one of the 8192 PTE dwords       */
++#define MAP_PTE_MASK0         0xfffff000      /* The 20 MSBs of the PTE indexed by the PTI            */
++#define MAP_PTI_MASK0         0x00000fff      /* The 12 bit index to one of the 4096 PTE dwords       */
++
++#define MAP_PTE_MASK1         0xffffe000      /* The 19 MSBs of the PTE indexed by the PTI            */
++#define MAP_PTI_MASK1         0x00001fff      /* The 13 bit index to one of the 8192 PTE dwords       */
+ /* 0x0e, 0x0f: Not used */
+@@ -1706,6 +1709,7 @@ struct snd_emu10k1 {
+       unsigned short model;                   /* subsystem id */
+       unsigned int card_type;                 /* EMU10K1_CARD_* */
+       unsigned int ecard_ctrl;                /* ecard control bits */
++      unsigned int address_mode;              /* address mode */
+       unsigned long dma_mask;                 /* PCI DMA mask */
+       unsigned int delay_pcm_irq;             /* in samples */
+       int max_cache_pages;                    /* max memory size / PAGE_SIZE */
+--- a/sound/pci/emu10k1/emu10k1_callback.c
++++ b/sound/pci/emu10k1/emu10k1_callback.c
+@@ -415,7 +415,7 @@ start_voice(struct snd_emux_voice *vp)
+       snd_emu10k1_ptr_write(hw, Z2, ch, 0);
+       /* invalidate maps */
+-      temp = (hw->silent_page.addr << 1) | MAP_PTI_MASK;
++      temp = (hw->silent_page.addr << hw->address_mode) | (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
+       snd_emu10k1_ptr_write(hw, MAPA, ch, temp);
+       snd_emu10k1_ptr_write(hw, MAPB, ch, temp);
+ #if 0
+@@ -436,7 +436,7 @@ start_voice(struct snd_emux_voice *vp)
+               snd_emu10k1_ptr_write(hw, CDF, ch, sample);
+               /* invalidate maps */
+-              temp = ((unsigned int)hw->silent_page.addr << 1) | MAP_PTI_MASK;
++              temp = ((unsigned int)hw->silent_page.addr << hw_address_mode) | (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
+               snd_emu10k1_ptr_write(hw, MAPA, ch, temp);
+               snd_emu10k1_ptr_write(hw, MAPB, ch, temp);
+               
+--- a/sound/pci/emu10k1/emu10k1_main.c
++++ b/sound/pci/emu10k1/emu10k1_main.c
+@@ -282,7 +282,7 @@ static int snd_emu10k1_init(struct snd_e
+       snd_emu10k1_ptr_write(emu, TCB, 0, 0);  /* taken from original driver */
+       snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */
+-      silent_page = (emu->silent_page.addr << 1) | MAP_PTI_MASK;
++      silent_page = (emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
+       for (ch = 0; ch < NUM_G; ch++) {
+               snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page);
+               snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page);
+@@ -348,6 +348,11 @@ static int snd_emu10k1_init(struct snd_e
+               outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG);
+       }
++      if (emu->address_mode == 0) {
++              /* use 16M in 4G */
++              outl(inl(emu->port + HCFG) | HCFG_EXPANDED_MEM, emu->port + HCFG);
++      }
++
+       return 0;
+ }
+@@ -1865,8 +1870,10 @@ int snd_emu10k1_create(struct snd_card *
+       is_audigy = emu->audigy = c->emu10k2_chip;
++      /* set addressing mode */
++      emu->address_mode = is_audigy ? 0 : 1;
+       /* set the DMA transfer mask */
+-      emu->dma_mask = is_audigy ? AUDIGY_DMA_MASK : EMU10K1_DMA_MASK;
++      emu->dma_mask = emu->address_mode ? EMU10K1_DMA_MASK : AUDIGY_DMA_MASK;
+       if (pci_set_dma_mask(pci, emu->dma_mask) < 0 ||
+           pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) {
+               snd_printk(KERN_ERR "architecture does not support PCI busmaster DMA with mask 0x%lx\n", emu->dma_mask);
+@@ -1889,7 +1896,7 @@ int snd_emu10k1_create(struct snd_card *
+       emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
+       if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
+-                              32 * 1024, &emu->ptb_pages) < 0) {
++                              (emu->address_mode ? 32 : 16) * 1024, &emu->ptb_pages) < 0) {
+               err = -ENOMEM;
+               goto error;
+       }
+@@ -1988,8 +1995,8 @@ int snd_emu10k1_create(struct snd_card *
+       /* Clear silent pages and set up pointers */
+       memset(emu->silent_page.area, 0, PAGE_SIZE);
+-      silent_page = emu->silent_page.addr << 1;
+-      for (idx = 0; idx < MAXPAGES; idx++)
++      silent_page = emu->silent_page.addr << emu->address_mode;
++      for (idx = 0; idx < (emu->address_mode ? MAXPAGES1 : MAXPAGES0); idx++)
+               ((u32 *)emu->ptb_pages.area)[idx] = cpu_to_le32(silent_page | idx);
+       /* set up voice indices */
+--- a/sound/pci/emu10k1/emupcm.c
++++ b/sound/pci/emu10k1/emupcm.c
+@@ -379,7 +379,7 @@ static void snd_emu10k1_pcm_init_voice(s
+       snd_emu10k1_ptr_write(emu, Z1, voice, 0);
+       snd_emu10k1_ptr_write(emu, Z2, voice, 0);
+       /* invalidate maps */
+-      silent_page = ((unsigned int)emu->silent_page.addr << 1) | MAP_PTI_MASK;
++      silent_page = ((unsigned int)emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
+       snd_emu10k1_ptr_write(emu, MAPA, voice, silent_page);
+       snd_emu10k1_ptr_write(emu, MAPB, voice, silent_page);
+       /* modulation envelope */
+--- a/sound/pci/emu10k1/memory.c
++++ b/sound/pci/emu10k1/memory.c
+@@ -34,10 +34,11 @@
+  * aligned pages in others
+  */
+ #define __set_ptb_entry(emu,page,addr) \
+-      (((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << 1) | (page)))
++      (((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << (emu->address_mode)) | (page)))
+ #define UNIT_PAGES            (PAGE_SIZE / EMUPAGESIZE)
+-#define MAX_ALIGN_PAGES               (MAXPAGES / UNIT_PAGES)
++#define MAX_ALIGN_PAGES0              (MAXPAGES0 / UNIT_PAGES)
++#define MAX_ALIGN_PAGES1              (MAXPAGES1 / UNIT_PAGES)
+ /* get aligned page from offset address */
+ #define get_aligned_page(offset)      ((offset) >> PAGE_SHIFT)
+ /* get offset address from aligned page */
+@@ -124,7 +125,7 @@ static int search_empty_map_area(struct
+               }
+               page = blk->mapped_page + blk->pages;
+       }
+-      size = MAX_ALIGN_PAGES - page;
++      size = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0) - page;
+       if (size >= max_size) {
+               *nextp = pos;
+               return page;
+@@ -181,7 +182,7 @@ static int unmap_memblk(struct snd_emu10
+               q = get_emu10k1_memblk(p, mapped_link);
+               end_page = q->mapped_page;
+       } else
+-              end_page = MAX_ALIGN_PAGES;
++              end_page = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0);
+       /* remove links */
+       list_del(&blk->mapped_link);
+@@ -305,7 +306,7 @@ snd_emu10k1_alloc_pages(struct snd_emu10
+       if (snd_BUG_ON(!emu))
+               return NULL;
+       if (snd_BUG_ON(runtime->dma_bytes <= 0 ||
+-                     runtime->dma_bytes >= MAXPAGES * EMUPAGESIZE))
++                     runtime->dma_bytes >= (emu->address_mode ? MAXPAGES1 : MAXPAGES0) * EMUPAGESIZE))
+               return NULL;
+       hdr = emu->memhdr;
+       if (snd_BUG_ON(!hdr))
diff --git a/queue-3.14/alsa-emu10k1-fix-card-shortname-string-buffer-overflow.patch b/queue-3.14/alsa-emu10k1-fix-card-shortname-string-buffer-overflow.patch
new file mode 100644 (file)
index 0000000..4fde427
--- /dev/null
@@ -0,0 +1,62 @@
+From d02260824e2cad626fb2a9d62e27006d34b6dedc Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 27 Apr 2015 13:00:09 +0200
+Subject: ALSA: emu10k1: Fix card shortname string buffer overflow
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit d02260824e2cad626fb2a9d62e27006d34b6dedc upstream.
+
+Some models provide too long string for the shortname that has 32bytes
+including the terminator, and it results in a non-terminated string
+exposed to the user-space.  This isn't too critical, though, as the
+string is stopped at the succeeding longname string.
+
+This patch fixes such entries by dropping "SB" prefix (it's enough to
+fit within 32 bytes, so far).  Meanwhile, it also changes strcpy()
+with strlcpy() to make sure that this kind of problem won't happen in
+future, too.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/emu10k1/emu10k1.c      |    6 ++++--
+ sound/pci/emu10k1/emu10k1_main.c |    4 ++--
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+--- a/sound/pci/emu10k1/emu10k1.c
++++ b/sound/pci/emu10k1/emu10k1.c
+@@ -181,8 +181,10 @@ static int snd_card_emu10k1_probe(struct
+       }
+ #endif
+  
+-      strcpy(card->driver, emu->card_capabilities->driver);
+-      strcpy(card->shortname, emu->card_capabilities->name);
++      strlcpy(card->driver, emu->card_capabilities->driver,
++              sizeof(card->driver));
++      strlcpy(card->shortname, emu->card_capabilities->name,
++              sizeof(card->shortname));
+       snprintf(card->longname, sizeof(card->longname),
+                "%s (rev.%d, serial:0x%x) at 0x%lx, irq %i",
+                card->shortname, emu->revision, emu->serial, emu->port, emu->irq);
+--- a/sound/pci/emu10k1/emu10k1_main.c
++++ b/sound/pci/emu10k1/emu10k1_main.c
+@@ -1411,7 +1411,7 @@ static struct snd_emu_chip_details emu_c
+        *
+        */
+       {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x20011102,
+-       .driver = "Audigy2", .name = "SB Audigy 2 ZS Notebook [SB0530]",
++       .driver = "Audigy2", .name = "Audigy 2 ZS Notebook [SB0530]",
+        .id = "Audigy2",
+        .emu10k2_chip = 1,
+        .ca0108_chip = 1,
+@@ -1561,7 +1561,7 @@ static struct snd_emu_chip_details emu_c
+        .adc_1361t = 1,  /* 24 bit capture instead of 16bit */
+        .ac97_chip = 1} ,
+       {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10051102,
+-       .driver = "Audigy2", .name = "SB Audigy 2 Platinum EX [SB0280]",
++       .driver = "Audigy2", .name = "Audigy 2 Platinum EX [SB0280]",
+        .id = "Audigy2",
+        .emu10k2_chip = 1,
+        .ca0102_chip = 1,
diff --git a/queue-3.14/alsa-emux-fix-mutex-deadlock-at-unloading.patch b/queue-3.14/alsa-emux-fix-mutex-deadlock-at-unloading.patch
new file mode 100644 (file)
index 0000000..872d167
--- /dev/null
@@ -0,0 +1,48 @@
+From 07b0e5d49d227e3950cb13a3e8caf248ef2a310e Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 27 Apr 2015 14:50:39 +0200
+Subject: ALSA: emux: Fix mutex deadlock at unloading
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 07b0e5d49d227e3950cb13a3e8caf248ef2a310e upstream.
+
+The emux-synth driver has a possible AB/BA mutex deadlock at unloading
+the emu10k1 driver:
+
+  snd_emux_free() ->
+    snd_emux_detach_seq(): mutex_lock(&emu->register_mutex) ->
+      snd_seq_delete_kernel_client() ->
+        snd_seq_free_client(): mutex_lock(&register_mutex)
+
+  snd_seq_release() ->
+    snd_seq_free_client(): mutex_lock(&register_mutex) ->
+      snd_seq_delete_all_ports() ->
+        snd_emux_unuse(): mutex_lock(&emu->register_mutex)
+
+Basically snd_emux_detach_seq() doesn't need a protection of
+emu->register_mutex as it's already being unregistered.  So, we can
+get rid of this for avoiding the deadlock.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/synth/emux/emux_seq.c |    2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/sound/synth/emux/emux_seq.c
++++ b/sound/synth/emux/emux_seq.c
+@@ -124,12 +124,10 @@ snd_emux_detach_seq(struct snd_emux *emu
+       if (emu->voices)
+               snd_emux_terminate_all(emu);
+               
+-      mutex_lock(&emu->register_mutex);
+       if (emu->client >= 0) {
+               snd_seq_delete_kernel_client(emu->client);
+               emu->client = -1;
+       }
+-      mutex_unlock(&emu->register_mutex);
+ }
diff --git a/queue-3.14/alsa-emux-fix-mutex-deadlock-in-oss-emulation.patch b/queue-3.14/alsa-emux-fix-mutex-deadlock-in-oss-emulation.patch
new file mode 100644 (file)
index 0000000..9e09023
--- /dev/null
@@ -0,0 +1,154 @@
+From 1c94e65c668f44d2c69ae7e7fc268ab3268fba3e Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Tue, 28 Apr 2015 17:11:44 +0200
+Subject: ALSA: emux: Fix mutex deadlock in OSS emulation
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 1c94e65c668f44d2c69ae7e7fc268ab3268fba3e upstream.
+
+The OSS emulation in synth-emux helper has a potential AB/BA deadlock
+at the simultaneous closing and opening:
+
+  close ->
+    snd_seq_release() ->
+      sne_seq_free_client() ->
+        snd_seq_delete_all_ports(): takes client->ports_mutex ->
+         port_delete() ->
+           snd_emux_unuse(): takes emux->register_mutex
+
+  open ->
+    snd_seq_oss_open() ->
+      snd_emux_open_seq_oss(): takes emux->register_mutex ->
+        snd_seq_event_port_attach() ->
+         snd_seq_create_port(): takes client->ports_mutex
+
+This patch addresses the deadlock by reducing the rance taking
+emux->register_mutex in snd_emux_open_seq_oss().  The lock is needed
+for the refcount handling, so move it locally.  The calls in
+emux_seq.c are already with the mutex, thus they are replaced with the
+version without mutex lock/unlock.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/synth/emux/emux_oss.c |   11 +----------
+ sound/synth/emux/emux_seq.c |   27 +++++++++++++++++++++------
+ 2 files changed, 22 insertions(+), 16 deletions(-)
+
+--- a/sound/synth/emux/emux_oss.c
++++ b/sound/synth/emux/emux_oss.c
+@@ -118,12 +118,8 @@ snd_emux_open_seq_oss(struct snd_seq_oss
+       if (snd_BUG_ON(!arg || !emu))
+               return -ENXIO;
+-      mutex_lock(&emu->register_mutex);
+-
+-      if (!snd_emux_inc_count(emu)) {
+-              mutex_unlock(&emu->register_mutex);
++      if (!snd_emux_inc_count(emu))
+               return -EFAULT;
+-      }
+       memset(&callback, 0, sizeof(callback));
+       callback.owner = THIS_MODULE;
+@@ -135,7 +131,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss
+       if (p == NULL) {
+               snd_printk(KERN_ERR "can't create port\n");
+               snd_emux_dec_count(emu);
+-              mutex_unlock(&emu->register_mutex);
+               return -ENOMEM;
+       }
+@@ -148,8 +143,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss
+       reset_port_mode(p, arg->seq_mode);
+       snd_emux_reset_port(p);
+-
+-      mutex_unlock(&emu->register_mutex);
+       return 0;
+ }
+@@ -195,13 +188,11 @@ snd_emux_close_seq_oss(struct snd_seq_os
+       if (snd_BUG_ON(!emu))
+               return -ENXIO;
+-      mutex_lock(&emu->register_mutex);
+       snd_emux_sounds_off_all(p);
+       snd_soundfont_close_check(emu->sflist, SF_CLIENT_NO(p->chset.port));
+       snd_seq_event_port_detach(p->chset.client, p->chset.port);
+       snd_emux_dec_count(emu);
+-      mutex_unlock(&emu->register_mutex);
+       return 0;
+ }
+--- a/sound/synth/emux/emux_seq.c
++++ b/sound/synth/emux/emux_seq.c
+@@ -267,8 +267,8 @@ snd_emux_event_input(struct snd_seq_even
+ /*
+  * increment usage count
+  */
+-int
+-snd_emux_inc_count(struct snd_emux *emu)
++static int
++__snd_emux_inc_count(struct snd_emux *emu)
+ {
+       emu->used++;
+       if (!try_module_get(emu->ops.owner))
+@@ -282,12 +282,21 @@ snd_emux_inc_count(struct snd_emux *emu)
+       return 1;
+ }
++int snd_emux_inc_count(struct snd_emux *emu)
++{
++      int ret;
++
++      mutex_lock(&emu->register_mutex);
++      ret = __snd_emux_inc_count(emu);
++      mutex_unlock(&emu->register_mutex);
++      return ret;
++}
+ /*
+  * decrease usage count
+  */
+-void
+-snd_emux_dec_count(struct snd_emux *emu)
++static void
++__snd_emux_dec_count(struct snd_emux *emu)
+ {
+       module_put(emu->card->module);
+       emu->used--;
+@@ -296,6 +305,12 @@ snd_emux_dec_count(struct snd_emux *emu)
+       module_put(emu->ops.owner);
+ }
++void snd_emux_dec_count(struct snd_emux *emu)
++{
++      mutex_lock(&emu->register_mutex);
++      __snd_emux_dec_count(emu);
++      mutex_unlock(&emu->register_mutex);
++}
+ /*
+  * Routine that is called upon a first use of a particular port
+@@ -315,7 +330,7 @@ snd_emux_use(void *private_data, struct
+       mutex_lock(&emu->register_mutex);
+       snd_emux_init_port(p);
+-      snd_emux_inc_count(emu);
++      __snd_emux_inc_count(emu);
+       mutex_unlock(&emu->register_mutex);
+       return 0;
+ }
+@@ -338,7 +353,7 @@ snd_emux_unuse(void *private_data, struc
+       mutex_lock(&emu->register_mutex);
+       snd_emux_sounds_off_all(p);
+-      snd_emux_dec_count(emu);
++      __snd_emux_dec_count(emu);
+       mutex_unlock(&emu->register_mutex);
+       return 0;
+ }
diff --git a/queue-3.14/alsa-hda-add-mute-led-mode-control-to-thinkpad.patch b/queue-3.14/alsa-hda-add-mute-led-mode-control-to-thinkpad.patch
new file mode 100644 (file)
index 0000000..155516a
--- /dev/null
@@ -0,0 +1,33 @@
+From 7290006d8c0900c56d8c58428134f02c35109d17 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 27 Apr 2015 10:40:45 +0200
+Subject: ALSA: hda - Add mute-LED mode control to Thinkpad
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 7290006d8c0900c56d8c58428134f02c35109d17 upstream.
+
+This patch adds the missing flag to enable "Mute-LED Mode" mixer enum
+ctl for Thinkpads that have also the software mute-LED control.
+
+Reported-and-tested-by: Pali Rohár <pali.rohar@gmail.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/thinkpad_helper.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/sound/pci/hda/thinkpad_helper.c
++++ b/sound/pci/hda/thinkpad_helper.c
+@@ -71,6 +71,7 @@ static void hda_fixup_thinkpad_acpi(stru
+               if (led_set_func(TPACPI_LED_MUTE, false) >= 0) {
+                       old_vmaster_hook = spec->vmaster_mute.hook;
+                       spec->vmaster_mute.hook = update_tpacpi_mute_led;
++                      spec->vmaster_mute_enum = 1;
+                       removefunc = false;
+               }
+               if (led_set_func(TPACPI_LED_MICMUTE, false) >= 0) {
diff --git a/queue-3.14/alsa-hda-fix-mute-led-fixed-mode.patch b/queue-3.14/alsa-hda-fix-mute-led-fixed-mode.patch
new file mode 100644 (file)
index 0000000..6e0b722
--- /dev/null
@@ -0,0 +1,74 @@
+From ee52e56e7b12834476cd0031c5986254ba1b6317 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Mon, 27 Apr 2015 10:36:11 +0200
+Subject: ALSA: hda - Fix mute-LED fixed mode
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit ee52e56e7b12834476cd0031c5986254ba1b6317 upstream.
+
+The mute-LED mode control has the fixed on/off states that are
+supposed to remain on/off regardless of the master switch.  However,
+this doesn't work actually because the vmaster hook is called in the
+vmaster code itself.
+
+This patch fixes it by calling the hook indirectly after checking the
+mute LED mode.
+
+Reported-and-tested-by: Pali Rohár <pali.rohar@gmail.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/pci/hda/hda_codec.c |   21 ++++++++++++---------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+--- a/sound/pci/hda/hda_codec.c
++++ b/sound/pci/hda/hda_codec.c
+@@ -2082,6 +2082,16 @@ static void put_vol_mute(struct hda_code
+       snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, parm);
+ }
++/* meta hook to call each driver's vmaster hook */
++static void vmaster_hook(void *private_data, int enabled)
++{
++      struct hda_vmaster_mute_hook *hook = private_data;
++
++      if (hook->mute_mode != HDA_VMUTE_FOLLOW_MASTER)
++              enabled = hook->mute_mode;
++      hook->hook(hook->codec, enabled);
++}
++
+ /**
+  * snd_hda_codec_amp_read - Read AMP value
+  * @codec: HD-audio codec
+@@ -2917,9 +2927,9 @@ int snd_hda_add_vmaster_hook(struct hda_
+       if (!hook->hook || !hook->sw_kctl)
+               return 0;
+-      snd_ctl_add_vmaster_hook(hook->sw_kctl, hook->hook, codec);
+       hook->codec = codec;
+       hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER;
++      snd_ctl_add_vmaster_hook(hook->sw_kctl, vmaster_hook, hook);
+       if (!expose_enum_ctl)
+               return 0;
+       kctl = snd_ctl_new1(&vmaster_mute_mode, hook);
+@@ -2942,14 +2952,7 @@ void snd_hda_sync_vmaster_hook(struct hd
+        */
+       if (hook->codec->bus->shutdown)
+               return;
+-      switch (hook->mute_mode) {
+-      case HDA_VMUTE_FOLLOW_MASTER:
+-              snd_ctl_sync_vmaster_hook(hook->sw_kctl);
+-              break;
+-      default:
+-              hook->hook(hook->codec, hook->mute_mode);
+-              break;
+-      }
++      snd_ctl_sync_vmaster_hook(hook->sw_kctl);
+ }
+ EXPORT_SYMBOL_GPL(snd_hda_sync_vmaster_hook);
diff --git a/queue-3.14/asoc-dapm-enable-autodisable-on-soc_dapm_single_tlv_autodisable.patch b/queue-3.14/asoc-dapm-enable-autodisable-on-soc_dapm_single_tlv_autodisable.patch
new file mode 100644 (file)
index 0000000..4d5bca7
--- /dev/null
@@ -0,0 +1,31 @@
+From a2d97723cb3a7741af81868427b36bba274b681b Mon Sep 17 00:00:00 2001
+From: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
+Date: Wed, 22 Apr 2015 13:58:47 +0100
+Subject: ASoC: dapm: Enable autodisable on SOC_DAPM_SINGLE_TLV_AUTODISABLE
+
+From: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
+
+commit a2d97723cb3a7741af81868427b36bba274b681b upstream.
+
+Correct small copy and paste error where autodisable was not being
+enabled for the SOC_DAPM_SINGLE_TLV_AUTODISABLE control.
+
+Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ include/sound/soc-dapm.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/include/sound/soc-dapm.h
++++ b/include/sound/soc-dapm.h
+@@ -302,7 +302,7 @@ struct device;
+       .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
+       .tlv.p = (tlv_array), \
+       .get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
+-      .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
++      .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 1) }
+ #define SOC_DAPM_SINGLE_TLV_VIRT(xname, max, tlv_array) \
+       SOC_DAPM_SINGLE(xname, SND_SOC_NOPM, 0, max, 0, tlv_array)
+ #define SOC_DAPM_ENUM(xname, xenum) \
diff --git a/queue-3.14/ext4-fix-data-corruption-caused-by-unwritten-and-delayed-extents.patch b/queue-3.14/ext4-fix-data-corruption-caused-by-unwritten-and-delayed-extents.patch
new file mode 100644 (file)
index 0000000..6bb7bd1
--- /dev/null
@@ -0,0 +1,90 @@
+From d2dc317d564a46dfc683978a2e5a4f91434e9711 Mon Sep 17 00:00:00 2001
+From: Lukas Czerner <lczerner@redhat.com>
+Date: Sat, 2 May 2015 21:36:55 -0400
+Subject: ext4: fix data corruption caused by unwritten and delayed extents
+
+From: Lukas Czerner <lczerner@redhat.com>
+
+commit d2dc317d564a46dfc683978a2e5a4f91434e9711 upstream.
+
+Currently it is possible to lose whole file system block worth of data
+when we hit the specific interaction with unwritten and delayed extents
+in status extent tree.
+
+The problem is that when we insert delayed extent into extent status
+tree the only way to get rid of it is when we write out delayed buffer.
+However there is a limitation in the extent status tree implementation
+so that when inserting unwritten extent should there be even a single
+delayed block the whole unwritten extent would be marked as delayed.
+
+At this point, there is no way to get rid of the delayed extents,
+because there are no delayed buffers to write out. So when a we write
+into said unwritten extent we will convert it to written, but it still
+remains delayed.
+
+When we try to write into that block later ext4_da_map_blocks() will set
+the buffer new and delayed and map it to invalid block which causes
+the rest of the block to be zeroed loosing already written data.
+
+For now we can fix this by simply not allowing to set delayed status on
+written extent in the extent status tree. Also add WARN_ON() to make
+sure that we notice if this happens in the future.
+
+This problem can be easily reproduced by running the following xfs_io.
+
+xfs_io -f -c "pwrite -S 0xaa 4096 2048" \
+          -c "falloc 0 131072" \
+          -c "pwrite -S 0xbb 65536 2048" \
+          -c "fsync" /mnt/test/fff
+
+echo 3 > /proc/sys/vm/drop_caches
+xfs_io -c "pwrite -S 0xdd 67584 2048" /mnt/test/fff
+
+This can be theoretically also reproduced by at random by running fsx,
+but it's not very reliable, though on machines with bigger page size
+(like ppc) this can be seen more often (especially xfstest generic/127)
+
+Signed-off-by: Lukas Czerner <lczerner@redhat.com>
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/ext4/extents_status.c |    8 ++++++++
+ fs/ext4/inode.c          |    2 ++
+ 2 files changed, 10 insertions(+)
+
+--- a/fs/ext4/extents_status.c
++++ b/fs/ext4/extents_status.c
+@@ -656,6 +656,14 @@ int ext4_es_insert_extent(struct inode *
+       BUG_ON(end < lblk);
++      if ((status & EXTENT_STATUS_DELAYED) &&
++          (status & EXTENT_STATUS_WRITTEN)) {
++              ext4_warning(inode->i_sb, "Inserting extent [%u/%u] as "
++                              " delayed and written which can potentially "
++                              " cause data loss.\n", lblk, len);
++              WARN_ON(1);
++      }
++
+       newes.es_lblk = lblk;
+       newes.es_len = len;
+       ext4_es_store_pblock(&newes, pblk);
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -569,6 +569,7 @@ int ext4_map_blocks(handle_t *handle, st
+               status = map->m_flags & EXT4_MAP_UNWRITTEN ?
+                               EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN;
+               if (!(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) &&
++                  !(status & EXTENT_STATUS_WRITTEN) &&
+                   ext4_find_delalloc_range(inode, map->m_lblk,
+                                            map->m_lblk + map->m_len - 1))
+                       status |= EXTENT_STATUS_DELAYED;
+@@ -678,6 +679,7 @@ found:
+               status = map->m_flags & EXT4_MAP_UNWRITTEN ?
+                               EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN;
+               if (!(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) &&
++                  !(status & EXTENT_STATUS_WRITTEN) &&
+                   ext4_find_delalloc_range(inode, map->m_lblk,
+                                            map->m_lblk + map->m_len - 1))
+                       status |= EXTENT_STATUS_DELAYED;
diff --git a/queue-3.14/rbd-end-i-o-the-entire-obj_request-on-error.patch b/queue-3.14/rbd-end-i-o-the-entire-obj_request-on-error.patch
new file mode 100644 (file)
index 0000000..d8c4147
--- /dev/null
@@ -0,0 +1,49 @@
+From 082a75dad84d79d1c15ea9e50f31cb4bb4fa7fd6 Mon Sep 17 00:00:00 2001
+From: Ilya Dryomov <idryomov@gmail.com>
+Date: Sat, 25 Apr 2015 15:56:15 +0300
+Subject: rbd: end I/O the entire obj_request on error
+
+From: Ilya Dryomov <idryomov@gmail.com>
+
+commit 082a75dad84d79d1c15ea9e50f31cb4bb4fa7fd6 upstream.
+
+When we end I/O struct request with error, we need to pass
+obj_request->length as @nr_bytes so that the entire obj_request worth
+of bytes is completed.  Otherwise block layer ends up confused and we
+trip on
+
+    rbd_assert(more ^ (which == img_request->obj_request_count));
+
+in rbd_img_obj_callback() due to more being true no matter what.  We
+already do it in most cases but we are missing some, in particular
+those where we don't even get a chance to submit any obj_requests, due
+to an early -ENOMEM for example.
+
+A number of obj_request->xferred assignments seem to be redundant but
+I haven't touched any of obj_request->xferred stuff to keep this small
+and isolated.
+
+Cc: Alex Elder <elder@linaro.org>
+Reported-by: Shawn Edwards <lesser.evil@gmail.com>
+Reviewed-by: Sage Weil <sage@redhat.com>
+Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/block/rbd.c |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/block/rbd.c
++++ b/drivers/block/rbd.c
+@@ -2084,6 +2084,11 @@ static bool rbd_img_obj_end_request(stru
+                       result, xferred);
+               if (!img_request->result)
+                       img_request->result = result;
++              /*
++               * Need to end I/O on the entire obj_request worth of
++               * bytes in case of error.
++               */
++              xferred = obj_request->length;
+       }
+       /* Image object requests don't own their page array */
diff --git a/queue-3.14/serial-of-serial-remove-device_type-serial-registration.patch b/queue-3.14/serial-of-serial-remove-device_type-serial-registration.patch
new file mode 100644 (file)
index 0000000..2850200
--- /dev/null
@@ -0,0 +1,43 @@
+From 6befa9d883385c580369a2cc9e53fbf329771f6d Mon Sep 17 00:00:00 2001
+From: Michal Simek <michal.simek@xilinx.com>
+Date: Tue, 14 Apr 2015 12:03:09 +0200
+Subject: serial: of-serial: Remove device_type = "serial" registration
+
+From: Michal Simek <michal.simek@xilinx.com>
+
+commit 6befa9d883385c580369a2cc9e53fbf329771f6d upstream.
+
+Do not probe all serial drivers by of_serial.c which are using
+device_type = "serial"; property. Only drivers which have valid
+compatible strings listed in the driver should be probed.
+
+When PORT_UNKNOWN is setup probe will fail anyway.
+
+Arnd quotation about driver historical background:
+"when I wrote that driver initially, the idea was that it would
+get used as a stub to hook up all other serial drivers but after
+that, the common code learned to create platform devices from DT"
+
+This patch fix the problem with on the system with xilinx_uartps and
+16550a where of_serial failed to register for xilinx_uartps and because
+of irq_dispose_mapping() removed irq_desc. Then when xilinx_uartps was asking
+for irq with request_irq() EINVAL is returned.
+
+Signed-off-by: Michal Simek <michal.simek@xilinx.com>
+Acked-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/tty/serial/of_serial.c |    1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/drivers/tty/serial/of_serial.c
++++ b/drivers/tty/serial/of_serial.c
+@@ -261,7 +261,6 @@ static struct of_device_id of_platform_s
+       { .compatible = "ibm,qpace-nwp-serial",
+               .data = (void *)PORT_NWPSERIAL, },
+ #endif
+-      { .type = "serial",         .data = (void *)PORT_UNKNOWN, },
+       { /* end of list */ },
+ };
index 3873c7853cf54f0e1867765f0bd3317268fbb4ad..12c0060a809ea2cd2859019f692efe24f8ca5871 100644 (file)
@@ -1 +1,12 @@
 ipv4-missing-sk_nulls_node_init-in-ping_unhash.patch
+alsa-emux-fix-mutex-deadlock-at-unloading.patch
+alsa-emux-fix-mutex-deadlock-in-oss-emulation.patch
+alsa-emu10k1-fix-card-shortname-string-buffer-overflow.patch
+alsa-emu10k1-emu10k2-32-bit-dma-mode.patch
+alsa-hda-fix-mute-led-fixed-mode.patch
+alsa-hda-add-mute-led-mode-control-to-thinkpad.patch
+serial-of-serial-remove-device_type-serial-registration.patch
+asoc-dapm-enable-autodisable-on-soc_dapm_single_tlv_autodisable.patch
+tty-serial-at91-maxburst-was-missing-for-dma-transfers.patch
+rbd-end-i-o-the-entire-obj_request-on-error.patch
+ext4-fix-data-corruption-caused-by-unwritten-and-delayed-extents.patch
diff --git a/queue-3.14/tty-serial-at91-maxburst-was-missing-for-dma-transfers.patch b/queue-3.14/tty-serial-at91-maxburst-was-missing-for-dma-transfers.patch
new file mode 100644 (file)
index 0000000..4316f21
--- /dev/null
@@ -0,0 +1,39 @@
+From a8d4e01637902311c5643b69a5c80e2805f04054 Mon Sep 17 00:00:00 2001
+From: Ludovic Desroches <ludovic.desroches@atmel.com>
+Date: Thu, 16 Apr 2015 16:58:12 +0200
+Subject: tty/serial: at91: maxburst was missing for dma transfers
+
+From: Ludovic Desroches <ludovic.desroches@atmel.com>
+
+commit a8d4e01637902311c5643b69a5c80e2805f04054 upstream.
+
+Maxburst was not set when doing the dma slave configuration. This value
+is checked by the recently introduced xdmac. It causes an error when
+doing the slave configuration and so prevents from using dma.
+
+Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
+Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/tty/serial/atmel_serial.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/tty/serial/atmel_serial.c
++++ b/drivers/tty/serial/atmel_serial.c
+@@ -757,6 +757,7 @@ static int atmel_prepare_tx_dma(struct u
+       config.direction = DMA_MEM_TO_DEV;
+       config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
+       config.dst_addr = port->mapbase + ATMEL_US_THR;
++      config.dst_maxburst = 1;
+       ret = dmaengine_device_control(atmel_port->chan_tx,
+                                       DMA_SLAVE_CONFIG,
+@@ -921,6 +922,7 @@ static int atmel_prepare_rx_dma(struct u
+       config.direction = DMA_DEV_TO_MEM;
+       config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
+       config.src_addr = port->mapbase + ATMEL_US_RHR;
++      config.src_maxburst = 1;
+       ret = dmaengine_device_control(atmel_port->chan_rx,
+                                       DMA_SLAVE_CONFIG,