--- /dev/null
+From 4bfc4e2508234f9149fd33fae853e99fb9e4a75b Mon Sep 17 00:00:00 2001
+From: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
+Date: Wed, 23 Feb 2011 02:29:11 +0300
+Subject: ASoC: correct pxa AC97 DAI names
+
+From: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
+
+commit 4bfc4e2508234f9149fd33fae853e99fb9e4a75b upstream.
+
+Correct names for pxa AC97 DAI are pxa2xx-ac97 and pxa2xx-ac97-aux. Fix
+that for all PXA platforms.
+
+Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
+Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
+Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/soc/pxa/e740_wm9705.c | 4 ++--
+ sound/soc/pxa/e750_wm9705.c | 4 ++--
+ sound/soc/pxa/e800_wm9712.c | 4 ++--
+ sound/soc/pxa/em-x270.c | 4 ++--
+ sound/soc/pxa/mioa701_wm9713.c | 4 ++--
+ sound/soc/pxa/palm27x.c | 4 ++--
+ sound/soc/pxa/tosa.c | 4 ++--
+ sound/soc/pxa/zylonite.c | 4 ++--
+ 8 files changed, 16 insertions(+), 16 deletions(-)
+
+--- a/sound/soc/pxa/e740_wm9705.c
++++ b/sound/soc/pxa/e740_wm9705.c
+@@ -117,7 +117,7 @@ static struct snd_soc_dai_link e740_dai[
+ {
+ .name = "AC97",
+ .stream_name = "AC97 HiFi",
+- .cpu_dai_name = "pxa-ac97.0",
++ .cpu_dai_name = "pxa2xx-ac97",
+ .codec_dai_name = "wm9705-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9705-codec",
+@@ -126,7 +126,7 @@ static struct snd_soc_dai_link e740_dai[
+ {
+ .name = "AC97 Aux",
+ .stream_name = "AC97 Aux",
+- .cpu_dai_name = "pxa-ac97.1",
++ .cpu_dai_name = "pxa2xx-ac97-aux",
+ .codec_dai_name = "wm9705-aux",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9705-codec",
+--- a/sound/soc/pxa/e750_wm9705.c
++++ b/sound/soc/pxa/e750_wm9705.c
+@@ -99,7 +99,7 @@ static struct snd_soc_dai_link e750_dai[
+ {
+ .name = "AC97",
+ .stream_name = "AC97 HiFi",
+- .cpu_dai_name = "pxa-ac97.0",
++ .cpu_dai_name = "pxa2xx-ac97",
+ .codec_dai_name = "wm9705-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9705-codec",
+@@ -109,7 +109,7 @@ static struct snd_soc_dai_link e750_dai[
+ {
+ .name = "AC97 Aux",
+ .stream_name = "AC97 Aux",
+- .cpu_dai_name = "pxa-ac97.1",
++ .cpu_dai_name = "pxa2xx-ac97-aux",
+ .codec_dai_name ="wm9705-aux",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9705-codec",
+--- a/sound/soc/pxa/e800_wm9712.c
++++ b/sound/soc/pxa/e800_wm9712.c
+@@ -89,7 +89,7 @@ static struct snd_soc_dai_link e800_dai[
+ {
+ .name = "AC97",
+ .stream_name = "AC97 HiFi",
+- .cpu_dai_name = "pxa-ac97.0",
++ .cpu_dai_name = "pxa2xx-ac97",
+ .codec_dai_name = "wm9712-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
+@@ -98,7 +98,7 @@ static struct snd_soc_dai_link e800_dai[
+ {
+ .name = "AC97 Aux",
+ .stream_name = "AC97 Aux",
+- .cpu_dai_name = "pxa-ac97.1",
++ .cpu_dai_name = "pxa2xx-ac97-aux",
+ .codec_dai_name ="wm9712-aux",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
+--- a/sound/soc/pxa/em-x270.c
++++ b/sound/soc/pxa/em-x270.c
+@@ -38,7 +38,7 @@ static struct snd_soc_dai_link em_x270_d
+ {
+ .name = "AC97",
+ .stream_name = "AC97 HiFi",
+- .cpu_dai_name = "pxa-ac97.0",
++ .cpu_dai_name = "pxa2xx-ac97",
+ .codec_dai_name = "wm9712-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
+@@ -46,7 +46,7 @@ static struct snd_soc_dai_link em_x270_d
+ {
+ .name = "AC97 Aux",
+ .stream_name = "AC97 Aux",
+- .cpu_dai_name = "pxa-ac97.1",
++ .cpu_dai_name = "pxa2xx-ac97-aux",
+ .codec_dai_name ="wm9712-aux",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
+--- a/sound/soc/pxa/mioa701_wm9713.c
++++ b/sound/soc/pxa/mioa701_wm9713.c
+@@ -162,7 +162,7 @@ static struct snd_soc_dai_link mioa701_d
+ {
+ .name = "AC97",
+ .stream_name = "AC97 HiFi",
+- .cpu_dai_name = "pxa-ac97.0",
++ .cpu_dai_name = "pxa2xx-ac97",
+ .codec_dai_name = "wm9713-hifi",
+ .codec_name = "wm9713-codec",
+ .init = mioa701_wm9713_init,
+@@ -172,7 +172,7 @@ static struct snd_soc_dai_link mioa701_d
+ {
+ .name = "AC97 Aux",
+ .stream_name = "AC97 Aux",
+- .cpu_dai_name = "pxa-ac97.1",
++ .cpu_dai_name = "pxa2xx-ac97-aux",
+ .codec_dai_name ="wm9713-aux",
+ .codec_name = "wm9713-codec",
+ .platform_name = "pxa-pcm-audio",
+--- a/sound/soc/pxa/palm27x.c
++++ b/sound/soc/pxa/palm27x.c
+@@ -132,7 +132,7 @@ static struct snd_soc_dai_link palm27x_d
+ {
+ .name = "AC97 HiFi",
+ .stream_name = "AC97 HiFi",
+- .cpu_dai_name = "pxa-ac97.0",
++ .cpu_dai_name = "pxa2xx-ac97",
+ .codec_dai_name = "wm9712-hifi",
+ .codec_name = "wm9712-codec",
+ .platform_name = "pxa-pcm-audio",
+@@ -141,7 +141,7 @@ static struct snd_soc_dai_link palm27x_d
+ {
+ .name = "AC97 Aux",
+ .stream_name = "AC97 Aux",
+- .cpu_dai_name = "pxa-ac97.1",
++ .cpu_dai_name = "pxa2xx-ac97-aux",
+ .codec_dai_name = "wm9712-aux",
+ .codec_name = "wm9712-codec",
+ .platform_name = "pxa-pcm-audio",
+--- a/sound/soc/pxa/tosa.c
++++ b/sound/soc/pxa/tosa.c
+@@ -217,7 +217,7 @@ static struct snd_soc_dai_link tosa_dai[
+ {
+ .name = "AC97",
+ .stream_name = "AC97 HiFi",
+- .cpu_dai_name = "pxa-ac97.0",
++ .cpu_dai_name = "pxa2xx-ac97",
+ .codec_dai_name = "wm9712-hifi",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
+@@ -227,7 +227,7 @@ static struct snd_soc_dai_link tosa_dai[
+ {
+ .name = "AC97 Aux",
+ .stream_name = "AC97 Aux",
+- .cpu_dai_name = "pxa-ac97.1",
++ .cpu_dai_name = "pxa2xx-ac97-aux",
+ .codec_dai_name = "wm9712-aux",
+ .platform_name = "pxa-pcm-audio",
+ .codec_name = "wm9712-codec",
+--- a/sound/soc/pxa/zylonite.c
++++ b/sound/soc/pxa/zylonite.c
+@@ -166,7 +166,7 @@ static struct snd_soc_dai_link zylonite_
+ .stream_name = "AC97 HiFi",
+ .codec_name = "wm9713-codec",
+ .platform_name = "pxa-pcm-audio",
+- .cpu_dai_name = "pxa-ac97.0",
++ .cpu_dai_name = "pxa2xx-ac97",
+ .codec_name = "wm9713-hifi",
+ .init = zylonite_wm9713_init,
+ },
+@@ -175,7 +175,7 @@ static struct snd_soc_dai_link zylonite_
+ .stream_name = "AC97 Aux",
+ .codec_name = "wm9713-codec",
+ .platform_name = "pxa-pcm-audio",
+- .cpu_dai_name = "pxa-ac97.1",
++ .cpu_dai_name = "pxa2xx-ac97-aux",
+ .codec_name = "wm9713-aux",
+ },
+ {
--- /dev/null
+From e9036e336a8e5640871e0006ea4a89982b25046f Mon Sep 17 00:00:00 2001
+From: Cho, Yu-Chen <acho@novell.com>
+Date: Tue, 15 Feb 2011 10:20:07 +0800
+Subject: Bluetooth: Add Atheros BT AR5BBU12 fw supported
+
+From: Cho, Yu-Chen <acho@novell.com>
+
+commit e9036e336a8e5640871e0006ea4a89982b25046f upstream.
+
+Add the btusb.c blacklist [0489:e02c] for Atheros AR5BBU12 BT
+and add to ath3k.c supported this device.
+
+Signed-off-by: Cho, Yu-Chen <acho@novell.com>
+Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/bluetooth/ath3k.c | 3 +++
+ drivers/bluetooth/btusb.c | 3 +++
+ 2 files changed, 6 insertions(+)
+
+--- a/drivers/bluetooth/ath3k.c
++++ b/drivers/bluetooth/ath3k.c
+@@ -41,6 +41,9 @@ static struct usb_device_id ath3k_table[
+
+ /* Atheros AR9285 Malbec with sflash firmware */
+ { USB_DEVICE(0x03F0, 0x311D) },
++
++ /* Atheros AR5BBU12 with sflash firmware */
++ { USB_DEVICE(0x0489, 0xE02C) },
+ { } /* Terminating entry */
+ };
+
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -105,6 +105,9 @@ static struct usb_device_id blacklist_ta
+ /* Atheros AR9285 Malbec with sflash firmware */
+ { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
+
++ /* Atheros AR5BBU12 with sflash firmware */
++ { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
++
+ /* Broadcom BCM2035 */
+ { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
+ { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
--- /dev/null
+From 509e7861d8a5e26bb07b5a3a13e2b9e442283631 Mon Sep 17 00:00:00 2001
+From: Cho, Yu-Chen <acho@novell.com>
+Date: Wed, 26 Jan 2011 17:10:59 +0800
+Subject: Bluetooth: add Atheros BT AR9285 fw supported
+
+From: Cho, Yu-Chen <acho@novell.com>
+
+commit 509e7861d8a5e26bb07b5a3a13e2b9e442283631 upstream.
+
+Add the btusb.c blacklist [03f0:311d] for Atheros AR9285 Malbec BT
+and add to ath3k.c ath3-1.fw (md5:1211fa34c09e10ba48381586b7c3883d)
+supported this device.
+
+Signed-off-by: Cho, Yu-Chen <acho@novell.com>
+Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/bluetooth/ath3k.c | 2 ++
+ drivers/bluetooth/btusb.c | 3 +++
+ 2 files changed, 5 insertions(+)
+
+--- a/drivers/bluetooth/ath3k.c
++++ b/drivers/bluetooth/ath3k.c
+@@ -39,6 +39,8 @@ static struct usb_device_id ath3k_table[
+ /* Atheros AR3011 with sflash firmware*/
+ { USB_DEVICE(0x0CF3, 0x3002) },
+
++ /* Atheros AR9285 Malbec with sflash firmware */
++ { USB_DEVICE(0x03F0, 0x311D) },
+ { } /* Terminating entry */
+ };
+
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -102,6 +102,9 @@ static struct usb_device_id blacklist_ta
+ /* Atheros 3011 with sflash firmware */
+ { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
+
++ /* Atheros AR9285 Malbec with sflash firmware */
++ { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
++
+ /* Broadcom BCM2035 */
+ { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
+ { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
--- /dev/null
+From 8efdd0cdc54f3bb5db464b3baf88f7441f54da47 Mon Sep 17 00:00:00 2001
+From: Oliver Neukum <oneukum@suse.de>
+Date: Fri, 11 Feb 2011 13:00:06 +0100
+Subject: Bluetooth: fix crash with quirky dongles doing sound
+
+From: Oliver Neukum <oneukum@suse.de>
+
+commit 8efdd0cdc54f3bb5db464b3baf88f7441f54da47 upstream.
+
+Quirky dongles sometimes do not use the iso interface which
+causes a crash with runtime PM
+
+Signed-off-by: Oliver Neukum <oneukum@suse.de>
+Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/bluetooth/btusb.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/bluetooth/btusb.c
++++ b/drivers/bluetooth/btusb.c
+@@ -829,7 +829,7 @@ static void btusb_work(struct work_struc
+
+ if (hdev->conn_hash.sco_num > 0) {
+ if (!test_bit(BTUSB_DID_ISO_RESUME, &data->flags)) {
+- err = usb_autopm_get_interface(data->isoc);
++ err = usb_autopm_get_interface(data->isoc ? data->isoc : data->intf);
+ if (err < 0) {
+ clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
+ usb_kill_anchored_urbs(&data->isoc_anchor);
+@@ -858,7 +858,7 @@ static void btusb_work(struct work_struc
+
+ __set_isoc_interface(hdev, 0);
+ if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags))
+- usb_autopm_put_interface(data->isoc);
++ usb_autopm_put_interface(data->isoc ? data->isoc : data->intf);
+ }
+ }
+
--- /dev/null
+From 3a142a0672b48a853f00af61f184c7341ac9c99d Mon Sep 17 00:00:00 2001
+From: Thomas Gleixner <tglx@linutronix.de>
+Date: Fri, 25 Feb 2011 22:34:23 +0100
+Subject: clockevents: Prevent oneshot mode when broadcast device is periodic
+
+From: Thomas Gleixner <tglx@linutronix.de>
+
+commit 3a142a0672b48a853f00af61f184c7341ac9c99d upstream.
+
+When the per cpu timer is marked CLOCK_EVT_FEAT_C3STOP, then we only
+can switch into oneshot mode, when the backup broadcast device
+supports oneshot mode as well. Otherwise we would try to switch the
+broadcast device into an unsupported mode unconditionally. This went
+unnoticed so far as the current available broadcast devices support
+oneshot mode. Seth unearthed this problem while debugging and working
+around an hpet related BIOS wreckage.
+
+Add the necessary check to tick_is_oneshot_available().
+
+Reported-and-tested-by: Seth Forshee <seth.forshee@canonical.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+LKML-Reference: <alpine.LFD.2.00.1102252231200.2701@localhost6.localdomain6>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ kernel/time/tick-broadcast.c | 10 ++++++++++
+ kernel/time/tick-common.c | 6 +++++-
+ kernel/time/tick-internal.h | 3 +++
+ 3 files changed, 18 insertions(+), 1 deletion(-)
+
+--- a/kernel/time/tick-broadcast.c
++++ b/kernel/time/tick-broadcast.c
+@@ -600,4 +600,14 @@ int tick_broadcast_oneshot_active(void)
+ return tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT;
+ }
+
++/*
++ * Check whether the broadcast device supports oneshot.
++ */
++bool tick_broadcast_oneshot_available(void)
++{
++ struct clock_event_device *bc = tick_broadcast_device.evtdev;
++
++ return bc ? bc->features & CLOCK_EVT_FEAT_ONESHOT : false;
++}
++
+ #endif
+--- a/kernel/time/tick-common.c
++++ b/kernel/time/tick-common.c
+@@ -51,7 +51,11 @@ int tick_is_oneshot_available(void)
+ {
+ struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev;
+
+- return dev && (dev->features & CLOCK_EVT_FEAT_ONESHOT);
++ if (!dev || !(dev->features & CLOCK_EVT_FEAT_ONESHOT))
++ return 0;
++ if (!(dev->features & CLOCK_EVT_FEAT_C3STOP))
++ return 1;
++ return tick_broadcast_oneshot_available();
+ }
+
+ /*
+--- a/kernel/time/tick-internal.h
++++ b/kernel/time/tick-internal.h
+@@ -36,6 +36,7 @@ extern void tick_shutdown_broadcast_ones
+ extern int tick_resume_broadcast_oneshot(struct clock_event_device *bc);
+ extern int tick_broadcast_oneshot_active(void);
+ extern void tick_check_oneshot_broadcast(int cpu);
++bool tick_broadcast_oneshot_available(void);
+ # else /* BROADCAST */
+ static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
+ {
+@@ -46,6 +47,7 @@ static inline void tick_broadcast_switch
+ static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
+ static inline int tick_broadcast_oneshot_active(void) { return 0; }
+ static inline void tick_check_oneshot_broadcast(int cpu) { }
++static inline bool tick_broadcast_oneshot_available(void) { return true; }
+ # endif /* !BROADCAST */
+
+ #else /* !ONESHOT */
+@@ -76,6 +78,7 @@ static inline int tick_resume_broadcast_
+ return 0;
+ }
+ static inline int tick_broadcast_oneshot_active(void) { return 0; }
++static inline bool tick_broadcast_oneshot_available(void) { return false; }
+ #endif /* !TICK_ONESHOT */
+
+ /*
--- /dev/null
+From 43c63188821dc21b2af23a40a18faea6e386e90a Mon Sep 17 00:00:00 2001
+From: Eric Bénard <eric@eukrea.com>
+Date: Fri, 25 Feb 2011 13:47:46 +0100
+Subject: eukrea-tlv320: fix platform_name
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Eric Bénard <eric@eukrea.com>
+
+commit 43c63188821dc21b2af23a40a18faea6e386e90a upstream.
+
+commit f0fba2ad1b6b53d5360125c41953b7afcd6deff0 included a mistake
+on the name of the platform in the snd_soc_dai_link structure.
+
+Signed-off-by: Eric Bénard <eric@eukrea.com>
+Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
+Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ sound/soc/imx/eukrea-tlv320.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/sound/soc/imx/eukrea-tlv320.c
++++ b/sound/soc/imx/eukrea-tlv320.c
+@@ -80,7 +80,7 @@ static struct snd_soc_dai_link eukrea_tl
+ .name = "tlv320aic23",
+ .stream_name = "TLV320AIC23",
+ .codec_dai_name = "tlv320aic23-hifi",
+- .platform_name = "imx-pcm-audio.0",
++ .platform_name = "imx-fiq-pcm-audio.0",
+ .codec_name = "tlv320aic23-codec.0-001a",
+ .cpu_dai_name = "imx-ssi.0",
+ .ops = &eukrea_tlv320_snd_ops,
--- /dev/null
+From e8a80c6f769dd4622d8b211b398452158ee60c0b Mon Sep 17 00:00:00 2001
+From: Josh Hunt <johunt@akamai.com>
+Date: Thu, 24 Feb 2011 11:48:22 +0100
+Subject: ext2: Fix link count corruption under heavy link+rename load
+
+From: Josh Hunt <johunt@akamai.com>
+
+commit e8a80c6f769dd4622d8b211b398452158ee60c0b upstream.
+
+vfs_rename_other() does not lock renamed inode with i_mutex. Thus changing
+i_nlink in a non-atomic manner (which happens in ext2_rename()) can corrupt
+it as reported and analyzed by Josh.
+
+In fact, there is no good reason to mess with i_nlink of the moved file.
+We did it presumably to simulate linking into the new directory and unlinking
+from an old one. But the practical effect of this is disputable because fsck
+can possibly treat file as being properly linked into both directories without
+writing any error which is confusing. So we just stop increment-decrement
+games with i_nlink which also fixes the corruption.
+
+CC: Al Viro <viro@ZenIV.linux.org.uk>
+Signed-off-by: Josh Hunt <johunt@akamai.com>
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/ext2/namei.c | 9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+--- a/fs/ext2/namei.c
++++ b/fs/ext2/namei.c
+@@ -344,7 +344,6 @@ static int ext2_rename (struct inode * o
+ new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page);
+ if (!new_de)
+ goto out_dir;
+- inode_inc_link_count(old_inode);
+ ext2_set_link(new_dir, new_de, new_page, old_inode, 1);
+ new_inode->i_ctime = CURRENT_TIME_SEC;
+ if (dir_de)
+@@ -356,12 +355,9 @@ static int ext2_rename (struct inode * o
+ if (new_dir->i_nlink >= EXT2_LINK_MAX)
+ goto out_dir;
+ }
+- inode_inc_link_count(old_inode);
+ err = ext2_add_link(new_dentry, old_inode);
+- if (err) {
+- inode_dec_link_count(old_inode);
++ if (err)
+ goto out_dir;
+- }
+ if (dir_de)
+ inode_inc_link_count(new_dir);
+ }
+@@ -369,12 +365,11 @@ static int ext2_rename (struct inode * o
+ /*
+ * Like most other Unix systems, set the ctime for inodes on a
+ * rename.
+- * inode_dec_link_count() will mark the inode dirty.
+ */
+ old_inode->i_ctime = CURRENT_TIME_SEC;
++ mark_inode_dirty(old_inode);
+
+ ext2_delete_entry (old_de, old_page);
+- inode_dec_link_count(old_inode);
+
+ if (dir_de) {
+ if (old_dir != new_dir)
--- /dev/null
+From 5a18ec176c934ca1bc9dc61580a5e0e90a9b5733 Mon Sep 17 00:00:00 2001
+From: Miklos Szeredi <mszeredi@suse.cz>
+Date: Fri, 25 Feb 2011 14:44:58 +0100
+Subject: fuse: fix hang of single threaded fuseblk filesystem
+
+From: Miklos Szeredi <mszeredi@suse.cz>
+
+commit 5a18ec176c934ca1bc9dc61580a5e0e90a9b5733 upstream.
+
+Single threaded NTFS-3G could get stuck if a delayed RELEASE reply
+triggered a DESTROY request via path_put().
+
+Fix this by
+
+ a) making RELEASE requests synchronous, whenever possible, on fuseblk
+ filesystems
+
+ b) if not possible (triggered by an asynchronous read/write) then do
+ the path_put() in a separate thread with schedule_work().
+
+Reported-by: Oliver Neukum <oneukum@suse.de>
+Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/fuse/file.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-------
+ fs/fuse/fuse_i.h | 6 +++++-
+ 2 files changed, 50 insertions(+), 8 deletions(-)
+
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -86,18 +86,52 @@ struct fuse_file *fuse_file_get(struct f
+ return ff;
+ }
+
++static void fuse_release_async(struct work_struct *work)
++{
++ struct fuse_req *req;
++ struct fuse_conn *fc;
++ struct path path;
++
++ req = container_of(work, struct fuse_req, misc.release.work);
++ path = req->misc.release.path;
++ fc = get_fuse_conn(path.dentry->d_inode);
++
++ fuse_put_request(fc, req);
++ path_put(&path);
++}
++
+ static void fuse_release_end(struct fuse_conn *fc, struct fuse_req *req)
+ {
+- path_put(&req->misc.release.path);
++ if (fc->destroy_req) {
++ /*
++ * If this is a fuseblk mount, then it's possible that
++ * releasing the path will result in releasing the
++ * super block and sending the DESTROY request. If
++ * the server is single threaded, this would hang.
++ * For this reason do the path_put() in a separate
++ * thread.
++ */
++ atomic_inc(&req->count);
++ INIT_WORK(&req->misc.release.work, fuse_release_async);
++ schedule_work(&req->misc.release.work);
++ } else {
++ path_put(&req->misc.release.path);
++ }
+ }
+
+-static void fuse_file_put(struct fuse_file *ff)
++static void fuse_file_put(struct fuse_file *ff, bool sync)
+ {
+ if (atomic_dec_and_test(&ff->count)) {
+ struct fuse_req *req = ff->reserved_req;
+
+- req->end = fuse_release_end;
+- fuse_request_send_background(ff->fc, req);
++ if (sync) {
++ fuse_request_send(ff->fc, req);
++ path_put(&req->misc.release.path);
++ fuse_put_request(ff->fc, req);
++ } else {
++ req->end = fuse_release_end;
++ fuse_request_send_background(ff->fc, req);
++ }
+ kfree(ff);
+ }
+ }
+@@ -219,8 +253,12 @@ void fuse_release_common(struct file *fi
+ * Normally this will send the RELEASE request, however if
+ * some asynchronous READ or WRITE requests are outstanding,
+ * the sending will be delayed.
++ *
++ * Make the release synchronous if this is a fuseblk mount,
++ * synchronous RELEASE is allowed (and desirable) in this case
++ * because the server can be trusted not to screw up.
+ */
+- fuse_file_put(ff);
++ fuse_file_put(ff, ff->fc->destroy_req != NULL);
+ }
+
+ static int fuse_open(struct inode *inode, struct file *file)
+@@ -558,7 +596,7 @@ static void fuse_readpages_end(struct fu
+ page_cache_release(page);
+ }
+ if (req->ff)
+- fuse_file_put(req->ff);
++ fuse_file_put(req->ff, false);
+ }
+
+ static void fuse_send_readpages(struct fuse_req *req, struct file *file)
+@@ -1137,7 +1175,7 @@ static ssize_t fuse_direct_write(struct
+ static void fuse_writepage_free(struct fuse_conn *fc, struct fuse_req *req)
+ {
+ __free_page(req->pages[0]);
+- fuse_file_put(req->ff);
++ fuse_file_put(req->ff, false);
+ }
+
+ static void fuse_writepage_finish(struct fuse_conn *fc, struct fuse_req *req)
+--- a/fs/fuse/fuse_i.h
++++ b/fs/fuse/fuse_i.h
+@@ -21,6 +21,7 @@
+ #include <linux/rwsem.h>
+ #include <linux/rbtree.h>
+ #include <linux/poll.h>
++#include <linux/workqueue.h>
+
+ /** Max number of pages that can be used in a single read request */
+ #define FUSE_MAX_PAGES_PER_REQ 32
+@@ -257,7 +258,10 @@ struct fuse_req {
+ union {
+ struct fuse_forget_in forget_in;
+ struct {
+- struct fuse_release_in in;
++ union {
++ struct fuse_release_in in;
++ struct work_struct work;
++ };
+ struct path path;
+ } release;
+ struct fuse_init_in init_in;
acpi-debugfs-fix-buffer-overflows-double-free.patch
mfd-avoid-tps6586x-burst-writes.patch
mfd-fix-null-pointer-due-to-non-initialized-ucb1x00-ts-absinfo.patch
+x86-use-u32-instead-of-long-to-set-reset-vector-back-to-0.patch
+bluetooth-add-atheros-bt-ar9285-fw-supported.patch
+bluetooth-fix-crash-with-quirky-dongles-doing-sound.patch
+bluetooth-add-atheros-bt-ar5bbu12-fw-supported.patch
+eukrea-tlv320-fix-platform_name.patch
+asoc-correct-pxa-ac97-dai-names.patch
+fuse-fix-hang-of-single-threaded-fuseblk-filesystem.patch
+clockevents-prevent-oneshot-mode-when-broadcast-device-is-periodic.patch
+ext2-fix-link-count-corruption-under-heavy-link-rename-load.patch
--- /dev/null
+From 299c56966a72b9109d47c71a6db52097098703dd Mon Sep 17 00:00:00 2001
+From: Don Zickus <dzickus@redhat.com>
+Date: Mon, 7 Feb 2011 23:25:00 -0500
+Subject: x86: Use u32 instead of long to set reset vector back to 0
+
+From: Don Zickus <dzickus@redhat.com>
+
+commit 299c56966a72b9109d47c71a6db52097098703dd upstream.
+
+A customer of ours, complained that when setting the reset
+vector back to 0, it trashed other data and hung their box.
+They noticed when only 4 bytes were set to 0 instead of 8,
+everything worked correctly.
+
+Mathew pointed out:
+
+ |
+ | We're supposed to be resetting trampoline_phys_low and
+ | trampoline_phys_high here, which are two 16-bit values.
+ | Writing 64 bits is definitely going to overwrite space
+ | that we're not supposed to be touching.
+ |
+
+So limit the area modified to u32.
+
+Signed-off-by: Don Zickus <dzickus@redhat.com>
+Acked-by: Matthew Garrett <mjg@redhat.com>
+LKML-Reference: <1297139100-424-1-git-send-email-dzickus@redhat.com>
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/include/asm/smpboot_hooks.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/x86/include/asm/smpboot_hooks.h
++++ b/arch/x86/include/asm/smpboot_hooks.h
+@@ -34,7 +34,7 @@ static inline void smpboot_restore_warm_
+ */
+ CMOS_WRITE(0, 0xf);
+
+- *((volatile long *)phys_to_virt(apic->trampoline_phys_low)) = 0;
++ *((volatile u32 *)phys_to_virt(apic->trampoline_phys_low)) = 0;
+ }
+
+ static inline void __init smpboot_setup_io_apic(void)