From: Greg Kroah-Hartman Date: Thu, 3 Mar 2011 21:36:37 +0000 (-0800) Subject: .37 patches X-Git-Tag: v2.6.37.3~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=833d4b29d1c9a8604ef38158d8b9bff4e091c21c;p=thirdparty%2Fkernel%2Fstable-queue.git .37 patches --- diff --git a/queue-2.6.37/asoc-correct-pxa-ac97-dai-names.patch b/queue-2.6.37/asoc-correct-pxa-ac97-dai-names.patch new file mode 100644 index 00000000000..cf4d7e6081b --- /dev/null +++ b/queue-2.6.37/asoc-correct-pxa-ac97-dai-names.patch @@ -0,0 +1,188 @@ +From 4bfc4e2508234f9149fd33fae853e99fb9e4a75b Mon Sep 17 00:00:00 2001 +From: Dmitry Eremin-Solenikov +Date: Wed, 23 Feb 2011 02:29:11 +0300 +Subject: ASoC: correct pxa AC97 DAI names + +From: Dmitry Eremin-Solenikov + +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 +Acked-by: Liam Girdwood +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + 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", + }, + { diff --git a/queue-2.6.37/bluetooth-add-atheros-bt-ar5bbu12-fw-supported.patch b/queue-2.6.37/bluetooth-add-atheros-bt-ar5bbu12-fw-supported.patch new file mode 100644 index 00000000000..44409a91416 --- /dev/null +++ b/queue-2.6.37/bluetooth-add-atheros-bt-ar5bbu12-fw-supported.patch @@ -0,0 +1,45 @@ +From e9036e336a8e5640871e0006ea4a89982b25046f Mon Sep 17 00:00:00 2001 +From: Cho, Yu-Chen +Date: Tue, 15 Feb 2011 10:20:07 +0800 +Subject: Bluetooth: Add Atheros BT AR5BBU12 fw supported + +From: Cho, Yu-Chen + +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 +Signed-off-by: Gustavo F. Padovan +Signed-off-by: Greg Kroah-Hartman + +--- + 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 }, diff --git a/queue-2.6.37/bluetooth-add-atheros-bt-ar9285-fw-supported.patch b/queue-2.6.37/bluetooth-add-atheros-bt-ar9285-fw-supported.patch new file mode 100644 index 00000000000..11bac796a75 --- /dev/null +++ b/queue-2.6.37/bluetooth-add-atheros-bt-ar9285-fw-supported.patch @@ -0,0 +1,45 @@ +From 509e7861d8a5e26bb07b5a3a13e2b9e442283631 Mon Sep 17 00:00:00 2001 +From: Cho, Yu-Chen +Date: Wed, 26 Jan 2011 17:10:59 +0800 +Subject: Bluetooth: add Atheros BT AR9285 fw supported + +From: Cho, Yu-Chen + +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 +Signed-off-by: Gustavo F. Padovan +Signed-off-by: Greg Kroah-Hartman + +--- + 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 }, diff --git a/queue-2.6.37/bluetooth-fix-crash-with-quirky-dongles-doing-sound.patch b/queue-2.6.37/bluetooth-fix-crash-with-quirky-dongles-doing-sound.patch new file mode 100644 index 00000000000..7891c1ad349 --- /dev/null +++ b/queue-2.6.37/bluetooth-fix-crash-with-quirky-dongles-doing-sound.patch @@ -0,0 +1,40 @@ +From 8efdd0cdc54f3bb5db464b3baf88f7441f54da47 Mon Sep 17 00:00:00 2001 +From: Oliver Neukum +Date: Fri, 11 Feb 2011 13:00:06 +0100 +Subject: Bluetooth: fix crash with quirky dongles doing sound + +From: Oliver Neukum + +commit 8efdd0cdc54f3bb5db464b3baf88f7441f54da47 upstream. + +Quirky dongles sometimes do not use the iso interface which +causes a crash with runtime PM + +Signed-off-by: Oliver Neukum +Signed-off-by: Gustavo F. Padovan +Signed-off-by: Greg Kroah-Hartman + +--- + 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); + } + } + diff --git a/queue-2.6.37/clockevents-prevent-oneshot-mode-when-broadcast-device-is-periodic.patch b/queue-2.6.37/clockevents-prevent-oneshot-mode-when-broadcast-device-is-periodic.patch new file mode 100644 index 00000000000..6dbd19552e4 --- /dev/null +++ b/queue-2.6.37/clockevents-prevent-oneshot-mode-when-broadcast-device-is-periodic.patch @@ -0,0 +1,88 @@ +From 3a142a0672b48a853f00af61f184c7341ac9c99d Mon Sep 17 00:00:00 2001 +From: Thomas Gleixner +Date: Fri, 25 Feb 2011 22:34:23 +0100 +Subject: clockevents: Prevent oneshot mode when broadcast device is periodic + +From: Thomas Gleixner + +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 +Signed-off-by: Thomas Gleixner +LKML-Reference: +Signed-off-by: Greg Kroah-Hartman + +--- + 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 */ + + /* diff --git a/queue-2.6.37/eukrea-tlv320-fix-platform_name.patch b/queue-2.6.37/eukrea-tlv320-fix-platform_name.patch new file mode 100644 index 00000000000..2bae6f78c37 --- /dev/null +++ b/queue-2.6.37/eukrea-tlv320-fix-platform_name.patch @@ -0,0 +1,35 @@ +From 43c63188821dc21b2af23a40a18faea6e386e90a Mon Sep 17 00:00:00 2001 +From: Eric Bénard +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 + +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 +Acked-by: Liam Girdwood +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + 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, diff --git a/queue-2.6.37/ext2-fix-link-count-corruption-under-heavy-link-rename-load.patch b/queue-2.6.37/ext2-fix-link-count-corruption-under-heavy-link-rename-load.patch new file mode 100644 index 00000000000..f1488e74e9e --- /dev/null +++ b/queue-2.6.37/ext2-fix-link-count-corruption-under-heavy-link-rename-load.patch @@ -0,0 +1,67 @@ +From e8a80c6f769dd4622d8b211b398452158ee60c0b Mon Sep 17 00:00:00 2001 +From: Josh Hunt +Date: Thu, 24 Feb 2011 11:48:22 +0100 +Subject: ext2: Fix link count corruption under heavy link+rename load + +From: Josh Hunt + +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 +Signed-off-by: Josh Hunt +Signed-off-by: Jan Kara +Signed-off-by: Greg Kroah-Hartman + +--- + 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) diff --git a/queue-2.6.37/fuse-fix-hang-of-single-threaded-fuseblk-filesystem.patch b/queue-2.6.37/fuse-fix-hang-of-single-threaded-fuseblk-filesystem.patch new file mode 100644 index 00000000000..f6880dc60b8 --- /dev/null +++ b/queue-2.6.37/fuse-fix-hang-of-single-threaded-fuseblk-filesystem.patch @@ -0,0 +1,142 @@ +From 5a18ec176c934ca1bc9dc61580a5e0e90a9b5733 Mon Sep 17 00:00:00 2001 +From: Miklos Szeredi +Date: Fri, 25 Feb 2011 14:44:58 +0100 +Subject: fuse: fix hang of single threaded fuseblk filesystem + +From: Miklos Szeredi + +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 +Signed-off-by: Miklos Szeredi +Signed-off-by: Greg Kroah-Hartman + +--- + 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 + #include + #include ++#include + + /** 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; diff --git a/queue-2.6.37/series b/queue-2.6.37/series index 32192d2068d..2c7b5e1d071 100644 --- a/queue-2.6.37/series +++ b/queue-2.6.37/series @@ -43,3 +43,12 @@ drm-fix-unsigned-vs-signed-comparison-issue-in-modeset-ctl-ioctl.patch 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 diff --git a/queue-2.6.37/x86-use-u32-instead-of-long-to-set-reset-vector-back-to-0.patch b/queue-2.6.37/x86-use-u32-instead-of-long-to-set-reset-vector-back-to-0.patch new file mode 100644 index 00000000000..c80addba5c5 --- /dev/null +++ b/queue-2.6.37/x86-use-u32-instead-of-long-to-set-reset-vector-back-to-0.patch @@ -0,0 +1,46 @@ +From 299c56966a72b9109d47c71a6db52097098703dd Mon Sep 17 00:00:00 2001 +From: Don Zickus +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 + +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 +Acked-by: Matthew Garrett +LKML-Reference: <1297139100-424-1-git-send-email-dzickus@redhat.com> +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + 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)