From: Greg Kroah-Hartman Date: Thu, 29 Nov 2012 21:10:11 +0000 (-0800) Subject: 3.6-stable patches X-Git-Tag: v3.6.9~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bb75365d915ba828de9129971b33be9687b18f77;p=thirdparty%2Fkernel%2Fstable-queue.git 3.6-stable patches added patches: alsa-hda-add-new-codec-alc283-alc290-support.patch alsa-hda-add-support-for-realtek-alc292.patch alsa-hda-fix-missing-beep-on-asus-x43u-notebook.patch can-bcm-initialize-ifindex-for-timeouts-without-previous-frame-reception.patch can-peak_usb-fix-hwtstamp-assignment.patch jbd-fix-lock-ordering-bug-in-journal_unmap_buffer.patch pm-qos-fix-wrong-error-checking-condition.patch sparc64-not-any-error-from-do_sigaltstack-should-fail-rt_sigreturn.patch writeback-put-unused-inodes-to-lru-after-writeback-completion.patch --- diff --git a/queue-3.6/alsa-hda-add-new-codec-alc283-alc290-support.patch b/queue-3.6/alsa-hda-add-new-codec-alc283-alc290-support.patch new file mode 100644 index 00000000000..a52a78aee11 --- /dev/null +++ b/queue-3.6/alsa-hda-add-new-codec-alc283-alc290-support.patch @@ -0,0 +1,30 @@ +From 7ff34ad80b7080fafaac8efa9ef0061708eddd51 Mon Sep 17 00:00:00 2001 +From: Kailang Yang +Date: Sat, 6 Oct 2012 17:02:30 +0200 +Subject: ALSA: hda - Add new codec ALC283 ALC290 support + +From: Kailang Yang + +commit 7ff34ad80b7080fafaac8efa9ef0061708eddd51 upstream. + +These are compatible with standard ALC269 parser. + +Signed-off-by: Kailang Yang +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -7089,6 +7089,8 @@ static const struct hda_codec_preset snd + { .id = 0x10ec0276, .name = "ALC276", .patch = patch_alc269 }, + { .id = 0x10ec0280, .name = "ALC280", .patch = patch_alc269 }, + { .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 }, ++ { .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 }, ++ { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, + { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", + .patch = patch_alc861 }, + { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, diff --git a/queue-3.6/alsa-hda-add-support-for-realtek-alc292.patch b/queue-3.6/alsa-hda-add-support-for-realtek-alc292.patch new file mode 100644 index 00000000000..fc17a922b1c --- /dev/null +++ b/queue-3.6/alsa-hda-add-support-for-realtek-alc292.patch @@ -0,0 +1,32 @@ +From af02dde8a609d8d071c4b31a82df811a55690a4a Mon Sep 17 00:00:00 2001 +From: David Henningsson +Date: Wed, 21 Nov 2012 08:57:58 +0100 +Subject: ALSA: hda - Add support for Realtek ALC292 + +From: David Henningsson + +commit af02dde8a609d8d071c4b31a82df811a55690a4a upstream. + +We found a new codec ID 292, and that just a simple quirk would enable +sound output/input on this ALC292 chip. + +BugLink: https://bugs.launchpad.net/bugs/1081466 +Tested-by: Acelan Kao +Signed-off-by: David Henningsson +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -7092,6 +7092,7 @@ static const struct hda_codec_preset snd + { .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 }, + { .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 }, + { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, ++ { .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 }, + { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", + .patch = patch_alc861 }, + { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, diff --git a/queue-3.6/alsa-hda-fix-missing-beep-on-asus-x43u-notebook.patch b/queue-3.6/alsa-hda-fix-missing-beep-on-asus-x43u-notebook.patch new file mode 100644 index 00000000000..15b59c99497 --- /dev/null +++ b/queue-3.6/alsa-hda-fix-missing-beep-on-asus-x43u-notebook.patch @@ -0,0 +1,27 @@ +From 7110005e8d5c3cd418fc4b64f9f124f004422a9a Mon Sep 17 00:00:00 2001 +From: Duncan Roe +Date: Wed, 10 Oct 2012 14:19:50 +0200 +Subject: ALSA: hda - Fix missing beep on ASUS X43U notebook + +From: Duncan Roe + +commit 7110005e8d5c3cd418fc4b64f9f124f004422a9a upstream. + +Signed-off-by: Duncan Roe +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -4280,6 +4280,7 @@ static void alc_auto_init_std(struct hda + ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir)) + + static const struct snd_pci_quirk beep_white_list[] = { ++ SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1), + SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), + SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1), + SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1), diff --git a/queue-3.6/can-bcm-initialize-ifindex-for-timeouts-without-previous-frame-reception.patch b/queue-3.6/can-bcm-initialize-ifindex-for-timeouts-without-previous-frame-reception.patch new file mode 100644 index 00000000000..5d834e3a61c --- /dev/null +++ b/queue-3.6/can-bcm-initialize-ifindex-for-timeouts-without-previous-frame-reception.patch @@ -0,0 +1,35 @@ +From 81b401100c01d2357031e874689f89bd788d13cd Mon Sep 17 00:00:00 2001 +From: Oliver Hartkopp +Date: Mon, 26 Nov 2012 22:24:23 +0100 +Subject: can: bcm: initialize ifindex for timeouts without previous frame reception + +From: Oliver Hartkopp + +commit 81b401100c01d2357031e874689f89bd788d13cd upstream. + +Set in the rx_ifindex to pass the correct interface index in the case of a +message timeout detection. Usually the rx_ifindex value is set at receive +time. But when no CAN frame has been received the RX_TIMEOUT notification +did not contain a valid value. + +Reported-by: Andre Naujoks +Signed-off-by: Oliver Hartkopp +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Greg Kroah-Hartman + +--- + net/can/bcm.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/net/can/bcm.c ++++ b/net/can/bcm.c +@@ -1084,6 +1084,9 @@ static int bcm_rx_setup(struct bcm_msg_h + op->sk = sk; + op->ifindex = ifindex; + ++ /* ifindex for timeout events w/o previous frame reception */ ++ op->rx_ifindex = ifindex; ++ + /* initialize uninitialized (kzalloc) structure */ + hrtimer_init(&op->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + op->timer.function = bcm_rx_timeout_handler; diff --git a/queue-3.6/can-peak_usb-fix-hwtstamp-assignment.patch b/queue-3.6/can-peak_usb-fix-hwtstamp-assignment.patch new file mode 100644 index 00000000000..0d2d35815e3 --- /dev/null +++ b/queue-3.6/can-peak_usb-fix-hwtstamp-assignment.patch @@ -0,0 +1,95 @@ +From c9faaa09e2a1335678f09c70a0d0eda095564bab Mon Sep 17 00:00:00 2001 +From: Oliver Hartkopp +Date: Wed, 21 Nov 2012 22:43:59 +0100 +Subject: can: peak_usb: fix hwtstamp assignment + +From: Oliver Hartkopp + +commit c9faaa09e2a1335678f09c70a0d0eda095564bab upstream. + +The skb->tstamp is set to the hardware timestamp when available in the USB +urb message. This leads to user visible timestamps which contain the 'uptime' +of the USB adapter - and not the usual system generated timestamp. + +Fix this wrong assignment by applying the available hardware timestamp to the +skb_shared_hwtstamps data structure - which is intended for this purpose. + +Signed-off-by: Oliver Hartkopp +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/can/usb/peak_usb/pcan_usb.c | 8 ++++++-- + drivers/net/can/usb/peak_usb/pcan_usb_pro.c | 8 ++++++-- + 2 files changed, 12 insertions(+), 4 deletions(-) + +--- a/drivers/net/can/usb/peak_usb/pcan_usb.c ++++ b/drivers/net/can/usb/peak_usb/pcan_usb.c +@@ -519,8 +519,10 @@ static int pcan_usb_decode_error(struct + mc->pdev->dev.can.state = new_state; + + if (status_len & PCAN_USB_STATUSLEN_TIMESTAMP) { ++ struct skb_shared_hwtstamps *hwts = skb_hwtstamps(skb); ++ + peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv); +- skb->tstamp = timeval_to_ktime(tv); ++ hwts->hwtstamp = timeval_to_ktime(tv); + } + + netif_rx(skb); +@@ -605,6 +607,7 @@ static int pcan_usb_decode_data(struct p + struct sk_buff *skb; + struct can_frame *cf; + struct timeval tv; ++ struct skb_shared_hwtstamps *hwts; + + skb = alloc_can_skb(mc->netdev, &cf); + if (!skb) +@@ -652,7 +655,8 @@ static int pcan_usb_decode_data(struct p + + /* convert timestamp into kernel time */ + peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv); +- skb->tstamp = timeval_to_ktime(tv); ++ hwts = skb_hwtstamps(skb); ++ hwts->hwtstamp = timeval_to_ktime(tv); + + /* push the skb */ + netif_rx(skb); +--- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c ++++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +@@ -532,6 +532,7 @@ static int pcan_usb_pro_handle_canmsg(st + struct can_frame *can_frame; + struct sk_buff *skb; + struct timeval tv; ++ struct skb_shared_hwtstamps *hwts; + + skb = alloc_can_skb(netdev, &can_frame); + if (!skb) +@@ -549,7 +550,8 @@ static int pcan_usb_pro_handle_canmsg(st + memcpy(can_frame->data, rx->data, can_frame->can_dlc); + + peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(rx->ts32), &tv); +- skb->tstamp = timeval_to_ktime(tv); ++ hwts = skb_hwtstamps(skb); ++ hwts->hwtstamp = timeval_to_ktime(tv); + + netif_rx(skb); + netdev->stats.rx_packets++; +@@ -570,6 +572,7 @@ static int pcan_usb_pro_handle_error(str + u8 err_mask = 0; + struct sk_buff *skb; + struct timeval tv; ++ struct skb_shared_hwtstamps *hwts; + + /* nothing should be sent while in BUS_OFF state */ + if (dev->can.state == CAN_STATE_BUS_OFF) +@@ -664,7 +667,8 @@ static int pcan_usb_pro_handle_error(str + dev->can.state = new_state; + + peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(er->ts32), &tv); +- skb->tstamp = timeval_to_ktime(tv); ++ hwts = skb_hwtstamps(skb); ++ hwts->hwtstamp = timeval_to_ktime(tv); + netif_rx(skb); + netdev->stats.rx_packets++; + netdev->stats.rx_bytes += can_frame->can_dlc; diff --git a/queue-3.6/jbd-fix-lock-ordering-bug-in-journal_unmap_buffer.patch b/queue-3.6/jbd-fix-lock-ordering-bug-in-journal_unmap_buffer.patch new file mode 100644 index 00000000000..c7a4e866ab4 --- /dev/null +++ b/queue-3.6/jbd-fix-lock-ordering-bug-in-journal_unmap_buffer.patch @@ -0,0 +1,38 @@ +From 25389bb207987b5774182f763b9fb65ff08761c8 Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Fri, 23 Nov 2012 14:03:04 +0100 +Subject: jbd: Fix lock ordering bug in journal_unmap_buffer() + +From: Jan Kara + +commit 25389bb207987b5774182f763b9fb65ff08761c8 upstream. + +Commit 09e05d48 introduced a wait for transaction commit into +journal_unmap_buffer() in the case we are truncating a buffer undergoing commit +in the page stradding i_size on a filesystem with blocksize < pagesize. Sadly +we forgot to drop buffer lock before waiting for transaction commit and thus +deadlock is possible when kjournald wants to lock the buffer. + +Fix the problem by dropping the buffer lock before waiting for transaction +commit. Since we are still holding page lock (and that is OK), buffer cannot +disappear under us. + +Signed-off-by: Jan Kara +Signed-off-by: Greg Kroah-Hartman + +--- + fs/jbd/transaction.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/fs/jbd/transaction.c ++++ b/fs/jbd/transaction.c +@@ -1961,7 +1961,9 @@ retry: + spin_unlock(&journal->j_list_lock); + jbd_unlock_bh_state(bh); + spin_unlock(&journal->j_state_lock); ++ unlock_buffer(bh); + log_wait_commit(journal, tid); ++ lock_buffer(bh); + goto retry; + } + /* diff --git a/queue-3.6/pm-qos-fix-wrong-error-checking-condition.patch b/queue-3.6/pm-qos-fix-wrong-error-checking-condition.patch new file mode 100644 index 00000000000..00d10be5df1 --- /dev/null +++ b/queue-3.6/pm-qos-fix-wrong-error-checking-condition.patch @@ -0,0 +1,36 @@ +From a7227a0faa117d0bc532aea546ae5ac5f89e8ed7 Mon Sep 17 00:00:00 2001 +From: Guennadi Liakhovetski +Date: Fri, 23 Nov 2012 20:55:06 +0100 +Subject: PM / QoS: fix wrong error-checking condition + +From: Guennadi Liakhovetski + +commit a7227a0faa117d0bc532aea546ae5ac5f89e8ed7 upstream. + +dev_pm_qos_add_request() can return 0, 1, or a negative error code, +therefore the correct error test is "if (error < 0)." Checking just for +non-zero return code leads to erroneous setting of the req->dev pointer +to NULL, which then leads to a repeated call to +dev_pm_qos_add_ancestor_request() in st1232_ts_irq_handler(). This in turn +leads to an Oops, when the I2C host adapter is unloaded and reloaded again +because of the inconsistent state of its QoS request list. + +Signed-off-by: Guennadi Liakhovetski +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/base/power/qos.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/base/power/qos.c ++++ b/drivers/base/power/qos.c +@@ -451,7 +451,7 @@ int dev_pm_qos_add_ancestor_request(stru + if (ancestor) + error = dev_pm_qos_add_request(ancestor, req, value); + +- if (error) ++ if (error < 0) + req->dev = NULL; + + return error; diff --git a/queue-3.6/series b/queue-3.6/series index 50f8f3f93c0..1e627fadbe3 100644 --- a/queue-3.6/series +++ b/queue-3.6/series @@ -25,3 +25,12 @@ dm-fix-deadlock-with-request-based-dm-and-queue-request_fn-recursion.patch futex-avoid-wake_futex-for-a-pi-futex_q.patch mac80211-deinitialize-ibss-internals-after-emptiness-check.patch radeon-add-agpmode-1-quirk-for-rv250.patch +can-peak_usb-fix-hwtstamp-assignment.patch +can-bcm-initialize-ifindex-for-timeouts-without-previous-frame-reception.patch +jbd-fix-lock-ordering-bug-in-journal_unmap_buffer.patch +sparc64-not-any-error-from-do_sigaltstack-should-fail-rt_sigreturn.patch +pm-qos-fix-wrong-error-checking-condition.patch +writeback-put-unused-inodes-to-lru-after-writeback-completion.patch +alsa-hda-add-new-codec-alc283-alc290-support.patch +alsa-hda-fix-missing-beep-on-asus-x43u-notebook.patch +alsa-hda-add-support-for-realtek-alc292.patch diff --git a/queue-3.6/sparc64-not-any-error-from-do_sigaltstack-should-fail-rt_sigreturn.patch b/queue-3.6/sparc64-not-any-error-from-do_sigaltstack-should-fail-rt_sigreturn.patch new file mode 100644 index 00000000000..6c2131dee44 --- /dev/null +++ b/queue-3.6/sparc64-not-any-error-from-do_sigaltstack-should-fail-rt_sigreturn.patch @@ -0,0 +1,39 @@ +From fae2ae2a900a5c7bb385fe4075f343e7e2d5daa2 Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Sun, 18 Nov 2012 22:27:03 -0500 +Subject: sparc64: not any error from do_sigaltstack() should fail rt_sigreturn() + +From: Al Viro + +commit fae2ae2a900a5c7bb385fe4075f343e7e2d5daa2 upstream. + +If a signal handler is executed on altstack and another signal comes, +we will end up with rt_sigreturn() on return from the second handler +getting -EPERM from do_sigaltstack(). It's perfectly OK, since we +are not asking to change the settings; in fact, they couldn't have been +changed during the second handler execution exactly because we'd been +on altstack all along. 64bit sigreturn on sparc treats any error from +do_sigaltstack() as "SIGSEGV now"; we need to switch to the same semantics +we are using on other architectures. + +Signed-off-by: Al Viro +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + arch/sparc/kernel/signal_64.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/arch/sparc/kernel/signal_64.c ++++ b/arch/sparc/kernel/signal_64.c +@@ -295,9 +295,7 @@ void do_rt_sigreturn(struct pt_regs *reg + err |= restore_fpu_state(regs, fpu_save); + + err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); +- err |= do_sigaltstack(&sf->stack, NULL, (unsigned long)sf); +- +- if (err) ++ if (err || do_sigaltstack(&sf->stack, NULL, (unsigned long)sf) == -EFAULT) + goto segv; + + err |= __get_user(rwin_save, &sf->rwin_save); diff --git a/queue-3.6/writeback-put-unused-inodes-to-lru-after-writeback-completion.patch b/queue-3.6/writeback-put-unused-inodes-to-lru-after-writeback-completion.patch new file mode 100644 index 00000000000..826fc188830 --- /dev/null +++ b/queue-3.6/writeback-put-unused-inodes-to-lru-after-writeback-completion.patch @@ -0,0 +1,104 @@ +From 4eff96dd5283a102e0c1cac95247090be74a38ed Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Mon, 26 Nov 2012 16:29:51 -0800 +Subject: writeback: put unused inodes to LRU after writeback completion + +From: Jan Kara + +commit 4eff96dd5283a102e0c1cac95247090be74a38ed upstream. + +Commit 169ebd90131b ("writeback: Avoid iput() from flusher thread") +removed iget-iput pair from inode writeback. As a side effect, inodes +that are dirty during iput_final() call won't be ever added to inode LRU +(iput_final() doesn't add dirty inodes to LRU and later when the inode +is cleaned there's noone to add the inode there). Thus inodes are +effectively unreclaimable until someone looks them up again. + +The practical effect of this bug is limited by the fact that inodes are +pinned by a dentry for long enough that the inode gets cleaned. But +still the bug can have nasty consequences leading up to OOM conditions +under certain circumstances. Following can easily reproduce the +problem: + + for (( i = 0; i < 1000; i++ )); do + mkdir $i + for (( j = 0; j < 1000; j++ )); do + touch $i/$j + echo 2 > /proc/sys/vm/drop_caches + done + done + +then one needs to run 'sync; ls -lR' to make inodes reclaimable again. + +We fix the issue by inserting unused clean inodes into the LRU after +writeback finishes in inode_sync_complete(). + +Signed-off-by: Jan Kara +Reported-by: OGAWA Hirofumi +Cc: Al Viro +Cc: OGAWA Hirofumi +Cc: Wu Fengguang +Cc: Dave Chinner +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + fs/fs-writeback.c | 2 ++ + fs/inode.c | 16 ++++++++++++++-- + fs/internal.h | 1 + + 3 files changed, 17 insertions(+), 2 deletions(-) + +--- a/fs/fs-writeback.c ++++ b/fs/fs-writeback.c +@@ -228,6 +228,8 @@ static void requeue_io(struct inode *ino + static void inode_sync_complete(struct inode *inode) + { + inode->i_state &= ~I_SYNC; ++ /* If inode is clean an unused, put it into LRU now... */ ++ inode_add_lru(inode); + /* Waiters must see I_SYNC cleared before being woken up */ + smp_mb(); + wake_up_bit(&inode->i_state, __I_SYNC); +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -408,6 +408,19 @@ static void inode_lru_list_add(struct in + spin_unlock(&inode->i_sb->s_inode_lru_lock); + } + ++/* ++ * Add inode to LRU if needed (inode is unused and clean). ++ * ++ * Needs inode->i_lock held. ++ */ ++void inode_add_lru(struct inode *inode) ++{ ++ if (!(inode->i_state & (I_DIRTY | I_SYNC | I_FREEING | I_WILL_FREE)) && ++ !atomic_read(&inode->i_count) && inode->i_sb->s_flags & MS_ACTIVE) ++ inode_lru_list_add(inode); ++} ++ ++ + static void inode_lru_list_del(struct inode *inode) + { + spin_lock(&inode->i_sb->s_inode_lru_lock); +@@ -1390,8 +1403,7 @@ static void iput_final(struct inode *ino + + if (!drop && (sb->s_flags & MS_ACTIVE)) { + inode->i_state |= I_REFERENCED; +- if (!(inode->i_state & (I_DIRTY|I_SYNC))) +- inode_lru_list_add(inode); ++ inode_add_lru(inode); + spin_unlock(&inode->i_lock); + return; + } +--- a/fs/internal.h ++++ b/fs/internal.h +@@ -110,6 +110,7 @@ extern int open_check_o_direct(struct fi + * inode.c + */ + extern spinlock_t inode_sb_list_lock; ++extern void inode_add_lru(struct inode *inode); + + /* + * fs-writeback.c