From a3cedfd010df61ddf8430709bded9929db1e6c70 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 29 Mar 2010 11:26:51 -0700 Subject: [PATCH] .32 patches --- ...ipci-work-around-invalid-pcm-pointer.patch | 53 ++++++++ ...msi-neton-ap1900-and-wind-top-ae2220.patch | 38 ++++++ ...da-disable-msi-for-nvidia-controller.patch | 37 ++++++ ...for-hp-laptops-using-cx20551-waikiki.patch | 49 +++++++ ...-secondary-adc-of-alc260-basic-model.patch | 31 +++++ ...b-and-6stack-dig-for-emachines-t5212.patch | 47 +++++++ ...add-the-documentation-for-mpol-local.patch | 51 +++++++ ...clearing-of-at_state-strings-on-ring.patch | 44 +++++++ ...prune-use-of-tty_buffer_request_room.patch | 33 +++++ ...avoid-a-deadlock-in-nfs_release_page.patch | 124 ++++++++++++++++++ ...another-deadlock-in-nfs_release_page.patch | 33 +++++ ..._forced-flag-in-nfs_revalidate_inode.patch | 57 ++++++++ ...all-relative-to-destdir-if-specified.patch | 77 +++++++++++ ...oops-triggered-by-cpu-offline-online.patch | 83 ++++++++++++ ...onization-issue-while-deleting-vport.patch | 77 +++++++++++ queue-2.6.32/series | 19 +++ .../tmpfs-cleanup-mpol_parse_str.patch | 103 +++++++++++++++ ...fix-oops-on-mounts-with-mpol-default.patch | 55 ++++++++ ...dle-mpol_local-mount-option-properly.patch | 40 ++++++ ...-mpol-bind-0-don-t-cause-mount-error.patch | 51 +++++++ 20 files changed, 1102 insertions(+) create mode 100644 queue-2.6.32/alsa-cmipci-work-around-invalid-pcm-pointer.patch create mode 100644 queue-2.6.32/alsa-hda-add-pci-quirks-for-msi-neton-ap1900-and-wind-top-ae2220.patch create mode 100644 queue-2.6.32/alsa-hda-disable-msi-for-nvidia-controller.patch create mode 100644 queue-2.6.32/alsa-hda-fix-0-db-offset-for-hp-laptops-using-cx20551-waikiki.patch create mode 100644 queue-2.6.32/alsa-hda-fix-secondary-adc-of-alc260-basic-model.patch create mode 100644 queue-2.6.32/alsa-hda-use-lpib-and-6stack-dig-for-emachines-t5212.patch create mode 100644 queue-2.6.32/doc-add-the-documentation-for-mpol-local.patch create mode 100644 queue-2.6.32/gigaset-correct-clearing-of-at_state-strings-on-ring.patch create mode 100644 queue-2.6.32/gigaset-prune-use-of-tty_buffer_request_room.patch create mode 100644 queue-2.6.32/nfs-avoid-a-deadlock-in-nfs_release_page.patch create mode 100644 queue-2.6.32/nfs-prevent-another-deadlock-in-nfs_release_page.patch create mode 100644 queue-2.6.32/nfsv4-don-t-ignore-the-nfs_ino_reval_forced-flag-in-nfs_revalidate_inode.patch create mode 100644 queue-2.6.32/perf-make-the-install-relative-to-destdir-if-specified.patch create mode 100644 queue-2.6.32/perf_event-fix-oops-triggered-by-cpu-offline-online.patch create mode 100644 queue-2.6.32/scsi-scsi_transport_fc-fix-synchronization-issue-while-deleting-vport.patch create mode 100644 queue-2.6.32/tmpfs-cleanup-mpol_parse_str.patch create mode 100644 queue-2.6.32/tmpfs-fix-oops-on-mounts-with-mpol-default.patch create mode 100644 queue-2.6.32/tmpfs-handle-mpol_local-mount-option-properly.patch create mode 100644 queue-2.6.32/tmpfs-mpol-bind-0-don-t-cause-mount-error.patch diff --git a/queue-2.6.32/alsa-cmipci-work-around-invalid-pcm-pointer.patch b/queue-2.6.32/alsa-cmipci-work-around-invalid-pcm-pointer.patch new file mode 100644 index 00000000000..554f6e24408 --- /dev/null +++ b/queue-2.6.32/alsa-cmipci-work-around-invalid-pcm-pointer.patch @@ -0,0 +1,53 @@ +From 1c583063a5c769fe2ec604752e383972c69e6d9b Mon Sep 17 00:00:00 2001 +From: Clemens Ladisch +Date: Wed, 24 Mar 2010 07:10:54 +0100 +Subject: ALSA: cmipci: work around invalid PCM pointer + +From: Clemens Ladisch + +commit 1c583063a5c769fe2ec604752e383972c69e6d9b upstream. + +When the CMI8738 FRAME2 register is read, the chip sometimes (probably +when wrapping around) returns an invalid value that would be outside the +programmed DMA buffer. This leads to an inconsistent PCM pointer that is +likely to result in an underrun. + +To work around this, read the register multiple times until we get a +valid value; the error state seems to be very short-lived. + +Signed-off-by: Clemens Ladisch +Reported-and-tested-by: Matija Nalis +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/cmipci.c | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +--- a/sound/pci/cmipci.c ++++ b/sound/pci/cmipci.c +@@ -941,13 +941,21 @@ static snd_pcm_uframes_t snd_cmipci_pcm_ + struct snd_pcm_substream *substream) + { + size_t ptr; +- unsigned int reg; ++ unsigned int reg, rem, tries; ++ + if (!rec->running) + return 0; + #if 1 // this seems better.. + reg = rec->ch ? CM_REG_CH1_FRAME2 : CM_REG_CH0_FRAME2; +- ptr = rec->dma_size - (snd_cmipci_read_w(cm, reg) + 1); +- ptr >>= rec->shift; ++ for (tries = 0; tries < 3; tries++) { ++ rem = snd_cmipci_read_w(cm, reg); ++ if (rem < rec->dma_size) ++ goto ok; ++ } ++ printk(KERN_ERR "cmipci: invalid PCM pointer: %#x\n", rem); ++ return SNDRV_PCM_POS_XRUN; ++ok: ++ ptr = (rec->dma_size - (rem + 1)) >> rec->shift; + #else + reg = rec->ch ? CM_REG_CH1_FRAME1 : CM_REG_CH0_FRAME1; + ptr = snd_cmipci_read(cm, reg) - rec->offset; diff --git a/queue-2.6.32/alsa-hda-add-pci-quirks-for-msi-neton-ap1900-and-wind-top-ae2220.patch b/queue-2.6.32/alsa-hda-add-pci-quirks-for-msi-neton-ap1900-and-wind-top-ae2220.patch new file mode 100644 index 00000000000..5d18ac36046 --- /dev/null +++ b/queue-2.6.32/alsa-hda-add-pci-quirks-for-msi-neton-ap1900-and-wind-top-ae2220.patch @@ -0,0 +1,38 @@ +From b43f6e5e258d67acae5961896d10bbe38c271070 Mon Sep 17 00:00:00 2001 +From: Anisse Astier +Date: Wed, 10 Mar 2010 19:17:46 +0100 +Subject: ALSA: hda - Add PCI quirks for MSI NetOn AP1900 and Wind Top AE2220 + +From: Anisse Astier + +commit b43f6e5e258d67acae5961896d10bbe38c271070 upstream. + +This should make the speakers and jack detection work on MSI all-in-one +computers NetOn AP1900 and Wind Top AE2220. + +Signed-off-by: Anisse Astier +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 +@@ -8881,6 +8881,7 @@ static struct snd_pci_quirk alc882_cfg_t + SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG), + SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG), + SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG), ++ SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG), + SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG), + SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG), + SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG), +@@ -8890,6 +8891,7 @@ static struct snd_pci_quirk alc882_cfg_t + SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG), + SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG), + SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG), ++ SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG), + SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG), + SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG), + diff --git a/queue-2.6.32/alsa-hda-disable-msi-for-nvidia-controller.patch b/queue-2.6.32/alsa-hda-disable-msi-for-nvidia-controller.patch new file mode 100644 index 00000000000..b7fe8aebaa7 --- /dev/null +++ b/queue-2.6.32/alsa-hda-disable-msi-for-nvidia-controller.patch @@ -0,0 +1,37 @@ +From 80c43ed724797627d8f86855248c497a6161a214 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 15 Mar 2010 15:51:53 +0100 +Subject: ALSA: hda - Disable MSI for Nvidia controller + +From: Takashi Iwai + +commit 80c43ed724797627d8f86855248c497a6161a214 upstream. + +Judging from the member of enable_msi white-list, Nvidia controller +seems to cause troubles with MSI enabled, e.g. boot hang up or other +serious issue may come up. It's safer to disable MSI as default for +Nvidia controllers again for now. + +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/hda_intel.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -2335,6 +2335,13 @@ static void __devinit check_msi(struct a + "hda_intel: msi for device %04x:%04x set to %d\n", + q->subvendor, q->subdevice, q->value); + chip->msi = q->value; ++ return; ++ } ++ ++ /* NVidia chipsets seem to cause troubles with MSI */ ++ if (chip->driver_type == AZX_DRIVER_NVIDIA) { ++ printk(KERN_INFO "hda_intel: Disable MSI for Nvidia chipset\n"); ++ chip->msi = 0; + } + } + diff --git a/queue-2.6.32/alsa-hda-fix-0-db-offset-for-hp-laptops-using-cx20551-waikiki.patch b/queue-2.6.32/alsa-hda-fix-0-db-offset-for-hp-laptops-using-cx20551-waikiki.patch new file mode 100644 index 00000000000..399decb4226 --- /dev/null +++ b/queue-2.6.32/alsa-hda-fix-0-db-offset-for-hp-laptops-using-cx20551-waikiki.patch @@ -0,0 +1,49 @@ +From 025f206c9e0f96cc41567b01c07fb852d8900da1 Mon Sep 17 00:00:00 2001 +From: Daniel T Chen +Date: Sun, 21 Mar 2010 18:34:43 -0400 +Subject: ALSA: hda: Fix 0 dB offset for HP laptops using CX20551 (Waikiki) + +From: Daniel T Chen + +commit 025f206c9e0f96cc41567b01c07fb852d8900da1 upstream. + +BugLink: https://launchpad.net/bugs/420578 + +The OR has verified that his hardware distorts because of the 0 dB +offset not corresponding to the highest PCM level. Fix this by capping +said PCM level to 0 dB similarly to what we do for CX20549 (Venice). + +Reported-by: Mike Pontillo +Tested-by: Mike Pontillo +Signed-off-by: Daniel T Chen +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_conexant.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +--- a/sound/pci/hda/patch_conexant.c ++++ b/sound/pci/hda/patch_conexant.c +@@ -1581,6 +1581,21 @@ static int patch_cxt5047(struct hda_code + #endif + } + spec->vmaster_nid = 0x13; ++ ++ switch (codec->subsystem_id >> 16) { ++ case 0x103c: ++ /* HP laptops have really bad sound over 0 dB on NID 0x10. ++ * Fix max PCM level to 0 dB (originally it has 0x1e steps ++ * with 0 dB offset 0x17) ++ */ ++ snd_hda_override_amp_caps(codec, 0x10, HDA_INPUT, ++ (0x17 << AC_AMPCAP_OFFSET_SHIFT) | ++ (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | ++ (0x05 << AC_AMPCAP_STEP_SIZE_SHIFT) | ++ (1 << AC_AMPCAP_MUTE_SHIFT)); ++ break; ++ } ++ + return 0; + } + diff --git a/queue-2.6.32/alsa-hda-fix-secondary-adc-of-alc260-basic-model.patch b/queue-2.6.32/alsa-hda-fix-secondary-adc-of-alc260-basic-model.patch new file mode 100644 index 00000000000..e01c75ff616 --- /dev/null +++ b/queue-2.6.32/alsa-hda-fix-secondary-adc-of-alc260-basic-model.patch @@ -0,0 +1,31 @@ +From 9c4cc0bdede1c39bde60a0d5d9251aac71fbe719 Mon Sep 17 00:00:00 2001 +From: Takashi Iwai +Date: Mon, 15 Mar 2010 09:07:52 +0100 +Subject: ALSA: hda - Fix secondary ADC of ALC260 basic model + +From: Takashi Iwai + +commit 9c4cc0bdede1c39bde60a0d5d9251aac71fbe719 upstream. + +Fix adc_nids[] for ALC260 basic model to match with num_adc_nids. +Otherwise you get an invalid NID in the secondary "Input Source" mixer +element. + +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/patch_realtek.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -6281,7 +6281,7 @@ static struct alc_config_preset alc260_p + .num_dacs = ARRAY_SIZE(alc260_dac_nids), + .dac_nids = alc260_dac_nids, + .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), +- .adc_nids = alc260_adc_nids, ++ .adc_nids = alc260_dual_adc_nids, + .num_channel_mode = ARRAY_SIZE(alc260_modes), + .channel_mode = alc260_modes, + .input_mux = &alc260_capture_source, diff --git a/queue-2.6.32/alsa-hda-use-lpib-and-6stack-dig-for-emachines-t5212.patch b/queue-2.6.32/alsa-hda-use-lpib-and-6stack-dig-for-emachines-t5212.patch new file mode 100644 index 00000000000..e5979f68273 --- /dev/null +++ b/queue-2.6.32/alsa-hda-use-lpib-and-6stack-dig-for-emachines-t5212.patch @@ -0,0 +1,47 @@ +From 572c0e3c73341755f3e7dfaaef6b26df12bd709c Mon Sep 17 00:00:00 2001 +From: Daniel T Chen +Date: Sun, 14 Mar 2010 23:44:03 -0400 +Subject: ALSA: hda: Use LPIB and 6stack-dig for eMachines T5212 + +From: Daniel T Chen + +commit 572c0e3c73341755f3e7dfaaef6b26df12bd709c upstream. + +BugLink: https://bugs.launchpad.net/bugs/538895 + +The OR has verified that both position_fix=1 and model=6stack-dig are +necessary to have capture function properly. (The existing 3stack-6ch +model quirk seems to be incorrect.) + +Reported-by: Reuben Bailey +Tested-by: Reuben Bailey +Signed-off-by: Daniel T Chen +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman + +--- + sound/pci/hda/hda_intel.c | 1 + + sound/pci/hda/patch_realtek.c | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -2230,6 +2230,7 @@ static struct snd_pci_quirk position_fix + SND_PCI_QUIRK(0x1028, 0x01f6, "Dell Latitude 131L", POS_FIX_LPIB), + SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB), + SND_PCI_QUIRK(0x1565, 0x820f, "Biostar Microtech", POS_FIX_LPIB), ++ SND_PCI_QUIRK(0x8086, 0xd601, "eMachines T5212", POS_FIX_LPIB), + {} + }; + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -8921,7 +8921,7 @@ static struct snd_pci_quirk alc882_cfg_t + SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL), + SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL), + SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL), +- SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), ++ SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG), + + {} + }; diff --git a/queue-2.6.32/doc-add-the-documentation-for-mpol-local.patch b/queue-2.6.32/doc-add-the-documentation-for-mpol-local.patch new file mode 100644 index 00000000000..62898007ea7 --- /dev/null +++ b/queue-2.6.32/doc-add-the-documentation-for-mpol-local.patch @@ -0,0 +1,51 @@ +From 5574169613b40b85d6f4c67208fa4846b897a0a1 Mon Sep 17 00:00:00 2001 +From: KOSAKI Motohiro +Date: Tue, 23 Mar 2010 13:35:33 -0700 +Subject: doc: add the documentation for mpol=local + +From: KOSAKI Motohiro + +commit 5574169613b40b85d6f4c67208fa4846b897a0a1 upstream. + +commit 3f226aa1c (mempolicy: support mpol=local tmpfs mount option) added +new mpol=local mount option. but it didn't add a documentation. + +This patch does it. + +Signed-off-by: KOSAKI Motohiro +Cc: Ravikiran Thirumalai +Cc: Christoph Lameter +Cc: Mel Gorman +Acked-by: Lee Schermerhorn +Cc: Hugh Dickins +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + Documentation/filesystems/tmpfs.txt | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +--- a/Documentation/filesystems/tmpfs.txt ++++ b/Documentation/filesystems/tmpfs.txt +@@ -82,11 +82,13 @@ tmpfs has a mount option to set the NUMA + all files in that instance (if CONFIG_NUMA is enabled) - which can be + adjusted on the fly via 'mount -o remount ...' + +-mpol=default prefers to allocate memory from the local node ++mpol=default use the process allocation policy ++ (see set_mempolicy(2)) + mpol=prefer:Node prefers to allocate memory from the given Node + mpol=bind:NodeList allocates memory only from nodes in NodeList + mpol=interleave prefers to allocate from each node in turn + mpol=interleave:NodeList allocates from each node of NodeList in turn ++mpol=local prefers to allocate memory from the local node + + NodeList format is a comma-separated list of decimal numbers and ranges, + a range being two hyphen-separated decimal numbers, the smallest and +@@ -134,3 +136,5 @@ Author: + Christoph Rohland , 1.12.01 + Updated: + Hugh Dickins, 4 June 2007 ++Updated: ++ KOSAKI Motohiro, 16 Mar 2010 diff --git a/queue-2.6.32/gigaset-correct-clearing-of-at_state-strings-on-ring.patch b/queue-2.6.32/gigaset-correct-clearing-of-at_state-strings-on-ring.patch new file mode 100644 index 00000000000..332e102f595 --- /dev/null +++ b/queue-2.6.32/gigaset-correct-clearing-of-at_state-strings-on-ring.patch @@ -0,0 +1,44 @@ +From 3a0a3a6b92edf181f849ebd8417122392ba73a96 Mon Sep 17 00:00:00 2001 +From: Tilman Schmidt +Date: Sun, 14 Mar 2010 12:58:05 +0000 +Subject: gigaset: correct clearing of at_state strings on RING + +From: Tilman Schmidt + +commit 3a0a3a6b92edf181f849ebd8417122392ba73a96 upstream. + +In RING handling, clear the table of received parameter strings in +a loop like everywhere else, instead of by enumeration which had +already gotten out of sync. + +Impact: minor bugfix +Signed-off-by: Tilman Schmidt +Acked-by: Karsten Keil +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/isdn/gigaset/ev-layer.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +--- a/drivers/isdn/gigaset/ev-layer.c ++++ b/drivers/isdn/gigaset/ev-layer.c +@@ -1243,14 +1243,10 @@ static void do_action(int action, struct + * note that bcs may be NULL if no B channel is free + */ + at_state2->ConState = 700; +- kfree(at_state2->str_var[STR_NMBR]); +- at_state2->str_var[STR_NMBR] = NULL; +- kfree(at_state2->str_var[STR_ZCPN]); +- at_state2->str_var[STR_ZCPN] = NULL; +- kfree(at_state2->str_var[STR_ZBC]); +- at_state2->str_var[STR_ZBC] = NULL; +- kfree(at_state2->str_var[STR_ZHLC]); +- at_state2->str_var[STR_ZHLC] = NULL; ++ for (i = 0; i < STR_NUM; ++i) { ++ kfree(at_state2->str_var[i]); ++ at_state2->str_var[i] = NULL; ++ } + at_state2->int_var[VAR_ZCTP] = -1; + + spin_lock_irqsave(&cs->lock, flags); diff --git a/queue-2.6.32/gigaset-prune-use-of-tty_buffer_request_room.patch b/queue-2.6.32/gigaset-prune-use-of-tty_buffer_request_room.patch new file mode 100644 index 00000000000..501dee993f1 --- /dev/null +++ b/queue-2.6.32/gigaset-prune-use-of-tty_buffer_request_room.patch @@ -0,0 +1,33 @@ +From 873a69a358a6b393fd8d9d92e193ec8895cac4d7 Mon Sep 17 00:00:00 2001 +From: Tilman Schmidt +Date: Sun, 14 Mar 2010 12:58:05 +0000 +Subject: gigaset: prune use of tty_buffer_request_room + +From: Tilman Schmidt + +commit 873a69a358a6b393fd8d9d92e193ec8895cac4d7 upstream. + +Calling tty_buffer_request_room() before tty_insert_flip_string() +is unnecessary, costs CPU and for big buffers can mess up the +multi-page allocation avoidance. + +Signed-off-by: Tilman Schmidt +Acked-by: Karsten Keil +CC: Alan Cox +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/isdn/gigaset/interface.c | 1 - + 1 file changed, 1 deletion(-) + +--- a/drivers/isdn/gigaset/interface.c ++++ b/drivers/isdn/gigaset/interface.c +@@ -635,7 +635,6 @@ void gigaset_if_receive(struct cardstate + if ((tty = cs->tty) == NULL) + gig_dbg(DEBUG_ANY, "receive on closed device"); + else { +- tty_buffer_request_room(tty, len); + tty_insert_flip_string(tty, buffer, len); + tty_flip_buffer_push(tty); + } diff --git a/queue-2.6.32/nfs-avoid-a-deadlock-in-nfs_release_page.patch b/queue-2.6.32/nfs-avoid-a-deadlock-in-nfs_release_page.patch new file mode 100644 index 00000000000..90aa01bcf0f --- /dev/null +++ b/queue-2.6.32/nfs-avoid-a-deadlock-in-nfs_release_page.patch @@ -0,0 +1,124 @@ +From bb6fbc4548b9ae7ebbd06ef72f00229df259d217 Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Thu, 11 Mar 2010 09:19:35 -0500 +Subject: NFS: Avoid a deadlock in nfs_release_page + +From: Trond Myklebust + +commit bb6fbc4548b9ae7ebbd06ef72f00229df259d217 upstream. + +J.R. Okajima reports the following deadlock: + +INFO: task kswapd0:305 blocked for more than 120 seconds. +"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. +kswapd0 D 0000000000000001 0 305 2 0x00000000 + ffff88001f21d4f0 0000000000000046 ffff88001fdea680 ffff88001f21c000 + ffff88001f21dfd8 ffff88001f21c000 ffff88001f21dfd8 ffff88001f21dfd8 + ffff88001fdea040 0000000000014c00 0000000000000001 ffff88001fdea040 +Call Trace: + [] io_schedule+0x4d/0x70 + [] sync_page+0x65/0xa0 + [] __wait_on_bit_lock+0x52/0xb0 + [] ? sync_page+0x0/0xa0 + [] __lock_page+0x64/0x70 + [] ? wake_bit_function+0x0/0x40 + [] truncate_inode_pages_range+0x344/0x4a0 + [] truncate_inode_pages+0x10/0x20 + [] generic_delete_inode+0x15e/0x190 + [] generic_drop_inode+0x5d/0x80 + [] iput+0x78/0x80 + [] nfs_dentry_iput+0x38/0x50 + [] dentry_iput+0x84/0x110 + [] d_kill+0x2e/0x60 + [] dput+0x7a/0x170 + [] path_put+0x15/0x40 + [] __put_nfs_open_context+0xa4/0xb0 + [] ? nfs_free_request+0x0/0x50 + [] put_nfs_open_context+0xb/0x10 + [] nfs_free_request+0x29/0x50 + [] kref_put+0x8e/0xe0 + [] nfs_release_request+0x14/0x20 + [] nfs_find_and_lock_request+0x89/0xa0 + [] nfs_wb_page+0x80/0x110 + [] nfs_release_page+0x70/0x90 + [] try_to_release_page+0x5e/0x80 + [] shrink_page_list+0x638/0x860 + [] shrink_zone+0x63e/0xc40 + +We can fix this by making the call to put_nfs_open_context() happen when we +actually remove the write request from the inode (which is done by the +nfsiod thread in this case). + +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman + +--- + fs/nfs/pagelist.c | 23 +++++++++++++---------- + 1 file changed, 13 insertions(+), 10 deletions(-) + +--- a/fs/nfs/pagelist.c ++++ b/fs/nfs/pagelist.c +@@ -112,12 +112,10 @@ void nfs_unlock_request(struct nfs_page + */ + int nfs_set_page_tag_locked(struct nfs_page *req) + { +- struct nfs_inode *nfsi = NFS_I(req->wb_context->path.dentry->d_inode); +- + if (!nfs_lock_request_dontget(req)) + return 0; + if (req->wb_page != NULL) +- radix_tree_tag_set(&nfsi->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); ++ radix_tree_tag_set(&NFS_I(req->wb_context->path.dentry->d_inode)->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); + return 1; + } + +@@ -126,10 +124,10 @@ int nfs_set_page_tag_locked(struct nfs_p + */ + void nfs_clear_page_tag_locked(struct nfs_page *req) + { +- struct inode *inode = req->wb_context->path.dentry->d_inode; +- struct nfs_inode *nfsi = NFS_I(inode); +- + if (req->wb_page != NULL) { ++ struct inode *inode = req->wb_context->path.dentry->d_inode; ++ struct nfs_inode *nfsi = NFS_I(inode); ++ + spin_lock(&inode->i_lock); + radix_tree_tag_clear(&nfsi->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); + nfs_unlock_request(req); +@@ -142,16 +140,22 @@ void nfs_clear_page_tag_locked(struct nf + * nfs_clear_request - Free up all resources allocated to the request + * @req: + * +- * Release page resources associated with a write request after it +- * has completed. ++ * Release page and open context resources associated with a read/write ++ * request after it has completed. + */ + void nfs_clear_request(struct nfs_page *req) + { + struct page *page = req->wb_page; ++ struct nfs_open_context *ctx = req->wb_context; ++ + if (page != NULL) { + page_cache_release(page); + req->wb_page = NULL; + } ++ if (ctx != NULL) { ++ put_nfs_open_context(ctx); ++ req->wb_context = NULL; ++ } + } + + +@@ -165,9 +169,8 @@ static void nfs_free_request(struct kref + { + struct nfs_page *req = container_of(kref, struct nfs_page, wb_kref); + +- /* Release struct file or cached credential */ ++ /* Release struct file and open context */ + nfs_clear_request(req); +- put_nfs_open_context(req->wb_context); + nfs_page_free(req); + } + diff --git a/queue-2.6.32/nfs-prevent-another-deadlock-in-nfs_release_page.patch b/queue-2.6.32/nfs-prevent-another-deadlock-in-nfs_release_page.patch new file mode 100644 index 00000000000..2ac68316911 --- /dev/null +++ b/queue-2.6.32/nfs-prevent-another-deadlock-in-nfs_release_page.patch @@ -0,0 +1,33 @@ +From d812e575822a2b7ab1a7cadae2571505ec6ec2bd Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Fri, 19 Mar 2010 13:55:17 -0400 +Subject: NFS: Prevent another deadlock in nfs_release_page() + +From: Trond Myklebust + +commit d812e575822a2b7ab1a7cadae2571505ec6ec2bd upstream. + +We should not attempt to free the page if __GFP_FS is not set. Otherwise we +can deadlock as per + + http://bugzilla.kernel.org/show_bug.cgi?id=15578 + +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman + +--- + fs/nfs/file.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/fs/nfs/file.c ++++ b/fs/nfs/file.c +@@ -486,7 +486,8 @@ static int nfs_release_page(struct page + { + dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); + +- if (gfp & __GFP_WAIT) ++ /* Only do I/O if gfp is a superset of GFP_KERNEL */ ++ if ((gfp & GFP_KERNEL) == GFP_KERNEL) + nfs_wb_page(page->mapping->host, page); + /* If PagePrivate() is set, then the page is not freeable */ + if (PagePrivate(page)) diff --git a/queue-2.6.32/nfsv4-don-t-ignore-the-nfs_ino_reval_forced-flag-in-nfs_revalidate_inode.patch b/queue-2.6.32/nfsv4-don-t-ignore-the-nfs_ino_reval_forced-flag-in-nfs_revalidate_inode.patch new file mode 100644 index 00000000000..be521b6a0cb --- /dev/null +++ b/queue-2.6.32/nfsv4-don-t-ignore-the-nfs_ino_reval_forced-flag-in-nfs_revalidate_inode.patch @@ -0,0 +1,57 @@ +From b4d2314bb88b07e5a04e6c75b442a1dfcd60e340 Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Wed, 10 Mar 2010 15:21:44 -0500 +Subject: NFSv4: Don't ignore the NFS_INO_REVAL_FORCED flag in nfs_revalidate_inode() + +From: Trond Myklebust + +commit b4d2314bb88b07e5a04e6c75b442a1dfcd60e340 upstream. + +If the NFS_INO_REVAL_FORCED flag is set, that means that we don't yet have +an up to date attribute cache. Even if we hold a delegation, we must +put a GETATTR on the wire. + +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman + +--- + fs/nfs/delegation.h | 6 ++++++ + fs/nfs/dir.c | 2 +- + fs/nfs/inode.c | 2 +- + 3 files changed, 8 insertions(+), 2 deletions(-) + +--- a/fs/nfs/delegation.h ++++ b/fs/nfs/delegation.h +@@ -68,4 +68,10 @@ static inline int nfs_inode_return_deleg + } + #endif + ++static inline int nfs_have_delegated_attributes(struct inode *inode) ++{ ++ return nfs_have_delegation(inode, FMODE_READ) && ++ !(NFS_I(inode)->cache_validity & NFS_INO_REVAL_FORCED); ++} ++ + #endif +--- a/fs/nfs/dir.c ++++ b/fs/nfs/dir.c +@@ -1797,7 +1797,7 @@ static int nfs_access_get_cached(struct + cache = nfs_access_search_rbtree(inode, cred); + if (cache == NULL) + goto out; +- if (!nfs_have_delegation(inode, FMODE_READ) && ++ if (!nfs_have_delegated_attributes(inode) && + !time_in_range_open(jiffies, cache->jiffies, cache->jiffies + nfsi->attrtimeo)) + goto out_stale; + res->jiffies = cache->jiffies; +--- a/fs/nfs/inode.c ++++ b/fs/nfs/inode.c +@@ -759,7 +759,7 @@ int nfs_attribute_timeout(struct inode * + { + struct nfs_inode *nfsi = NFS_I(inode); + +- if (nfs_have_delegation(inode, FMODE_READ)) ++ if (nfs_have_delegated_attributes(inode)) + return 0; + return !time_in_range_open(jiffies, nfsi->read_cache_jiffies, nfsi->read_cache_jiffies + nfsi->attrtimeo); + } diff --git a/queue-2.6.32/perf-make-the-install-relative-to-destdir-if-specified.patch b/queue-2.6.32/perf-make-the-install-relative-to-destdir-if-specified.patch new file mode 100644 index 00000000000..cf7ab7aeede --- /dev/null +++ b/queue-2.6.32/perf-make-the-install-relative-to-destdir-if-specified.patch @@ -0,0 +1,77 @@ +From 7ae5f21361fea11f58c398701da635f778635d13 Mon Sep 17 00:00:00 2001 +From: John Kacur +Date: Thu, 11 Mar 2010 13:57:00 +0100 +Subject: perf: Make the install relative to DESTDIR if specified + +From: John Kacur + +commit 7ae5f21361fea11f58c398701da635f778635d13 upstream. + +Without this change, the install path is relative to +prefix/DESTDIR where prefix is automatically set to $HOME. + +This can produce unexpected results. For example: + + make -C tools/perf DESTDIR=/home/jkacur/tmp install-man + +creates the directory: /home/jkacur/home/jkacur/tmp/share/... +instead of the expected: /home/jkacur/tmp/share/... + +Signed-off-by: John Kacur +Cc: Peter Zijlstra +Cc: Paul Mackerras +Cc: Arnaldo Carvalho de Melo +Cc: Frederic Weisbecker +Cc: Tom Zanussi +Cc: Kyle McMartin +LKML-Reference: <1268312220-12880-1-git-send-email-jkacur@redhat.com> +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + tools/perf/Documentation/Makefile | 4 +++- + tools/perf/Makefile | 4 +++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +--- a/tools/perf/Documentation/Makefile ++++ b/tools/perf/Documentation/Makefile +@@ -24,7 +24,10 @@ DOC_MAN1=$(patsubst %.txt,%.1,$(MAN1_TXT + DOC_MAN5=$(patsubst %.txt,%.5,$(MAN5_TXT)) + DOC_MAN7=$(patsubst %.txt,%.7,$(MAN7_TXT)) + ++# Make the path relative to DESTDIR, not prefix ++ifndef DESTDIR + prefix?=$(HOME) ++endif + bindir?=$(prefix)/bin + htmldir?=$(prefix)/share/doc/perf-doc + pdfdir?=$(prefix)/share/doc/perf-doc +@@ -32,7 +35,6 @@ mandir?=$(prefix)/share/man + man1dir=$(mandir)/man1 + man5dir=$(mandir)/man5 + man7dir=$(mandir)/man7 +-# DESTDIR= + + ASCIIDOC=asciidoc + ASCIIDOC_EXTRA = --unsafe +--- a/tools/perf/Makefile ++++ b/tools/perf/Makefile +@@ -218,7 +218,10 @@ STRIP ?= strip + # runtime figures out where they are based on the path to the executable. + # This can help installing the suite in a relocatable way. + ++# Make the path relative to DESTDIR, not to prefix ++ifndef DESTDIR + prefix = $(HOME) ++endif + bindir_relative = bin + bindir = $(prefix)/$(bindir_relative) + mandir = share/man +@@ -235,7 +238,6 @@ sysconfdir = $(prefix)/etc + ETC_PERFCONFIG = etc/perfconfig + endif + lib = lib +-# DESTDIR= + + export prefix bindir sharedir sysconfdir + diff --git a/queue-2.6.32/perf_event-fix-oops-triggered-by-cpu-offline-online.patch b/queue-2.6.32/perf_event-fix-oops-triggered-by-cpu-offline-online.patch new file mode 100644 index 00000000000..aa9af4c18dd --- /dev/null +++ b/queue-2.6.32/perf_event-fix-oops-triggered-by-cpu-offline-online.patch @@ -0,0 +1,83 @@ +From 220b140b52ab6cc133f674a7ffec8fa792054f25 Mon Sep 17 00:00:00 2001 +From: Paul Mackerras +Date: Wed, 10 Mar 2010 20:45:52 +1100 +Subject: perf_event: Fix oops triggered by cpu offline/online + +From: Paul Mackerras + +commit 220b140b52ab6cc133f674a7ffec8fa792054f25 upstream. + +Anton Blanchard found that he could reliably make the kernel hit a +BUG_ON in the slab allocator by taking a cpu offline and then online +while a system-wide perf record session was running. + +The reason is that when the cpu comes up, we completely reinitialize +the ctx field of the struct perf_cpu_context for the cpu. If there is +a system-wide perf record session running, then there will be a struct +perf_event that has a reference to the context, so its refcount will +be 2. (The perf_event has been removed from the context's group_entry +and event_entry lists by perf_event_exit_cpu(), but that doesn't +remove the perf_event's reference to the context and doesn't decrement +the context's refcount.) + +When the cpu comes up, perf_event_init_cpu() gets called, and it calls +__perf_event_init_context() on the cpu's context. That resets the +refcount to 1. Then when the perf record session finishes and the +perf_event is closed, the refcount gets decremented to 0 and the +context gets kfreed after an RCU grace period. Since the context +wasn't kmalloced -- it's part of a per-cpu variable -- bad things +happen. + +In fact we don't need to completely reinitialize the context when the +cpu comes up. It's sufficient to initialize the context once at boot, +but we need to do it for all possible cpus. + +This moves the context initialization to happen at boot time. With +this, we don't trash the refcount and the context never gets kfreed, +and we don't hit the BUG_ON. + +Reported-by: Anton Blanchard +Signed-off-by: Paul Mackerras +Tested-by: Anton Blanchard +Acked-by: Peter Zijlstra +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/perf_event.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +--- a/kernel/perf_event.c ++++ b/kernel/perf_event.c +@@ -4981,12 +4981,22 @@ int perf_event_init_task(struct task_str + return ret; + } + ++static void __init perf_event_init_all_cpus(void) ++{ ++ int cpu; ++ struct perf_cpu_context *cpuctx; ++ ++ for_each_possible_cpu(cpu) { ++ cpuctx = &per_cpu(perf_cpu_context, cpu); ++ __perf_event_init_context(&cpuctx->ctx, NULL); ++ } ++} ++ + static void __cpuinit perf_event_init_cpu(int cpu) + { + struct perf_cpu_context *cpuctx; + + cpuctx = &per_cpu(perf_cpu_context, cpu); +- __perf_event_init_context(&cpuctx->ctx, NULL); + + spin_lock(&perf_resource_lock); + cpuctx->max_pertask = perf_max_events - perf_reserved_percpu; +@@ -5057,6 +5067,7 @@ static struct notifier_block __cpuinitda + + void __init perf_event_init(void) + { ++ perf_event_init_all_cpus(); + perf_cpu_notify(&perf_cpu_nb, (unsigned long)CPU_UP_PREPARE, + (void *)(long)smp_processor_id()); + perf_cpu_notify(&perf_cpu_nb, (unsigned long)CPU_ONLINE, diff --git a/queue-2.6.32/scsi-scsi_transport_fc-fix-synchronization-issue-while-deleting-vport.patch b/queue-2.6.32/scsi-scsi_transport_fc-fix-synchronization-issue-while-deleting-vport.patch new file mode 100644 index 00000000000..55e5d6da0c5 --- /dev/null +++ b/queue-2.6.32/scsi-scsi_transport_fc-fix-synchronization-issue-while-deleting-vport.patch @@ -0,0 +1,77 @@ +From 0d9dc7c8b9b7fa0f53647423b41056ee1beed735 Mon Sep 17 00:00:00 2001 +From: Gal Rosen +Date: Thu, 21 Jan 2010 10:15:32 +0200 +Subject: SCSI: scsi_transport_fc: Fix synchronization issue while deleting vport + +From: Gal Rosen + +commit 0d9dc7c8b9b7fa0f53647423b41056ee1beed735 upstream. + +The issue occur while deleting 60 virtual ports through the sys +interface /sys/class/fc_vports/vport-X/vport_delete. It happen while in +a mistake each request sent twice for the same vport. This interface is +asynchronous, entering the delete request into a work queue, allowing +more than one request to enter to the delete work queue. The result is a +NULL pointer. The first request already delete the vport, while the +second request got a pointer to the vport before the device destroyed. +Re-create vport later cause system freeze. + +Solution: Check vport flags before entering the request to the work queue. + +[jejb: fixed int<->long problem on spinlock flags variable] +Signed-off-by: Gal Rosen +Acked-by: James Smart +Signed-off-by: James Bottomley +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/scsi/scsi_transport_fc.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +--- a/drivers/scsi/scsi_transport_fc.c ++++ b/drivers/scsi/scsi_transport_fc.c +@@ -1215,6 +1215,15 @@ store_fc_vport_delete(struct device *dev + { + struct fc_vport *vport = transport_class_to_vport(dev); + struct Scsi_Host *shost = vport_to_shost(vport); ++ unsigned long flags; ++ ++ spin_lock_irqsave(shost->host_lock, flags); ++ if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) { ++ spin_unlock_irqrestore(shost->host_lock, flags); ++ return -EBUSY; ++ } ++ vport->flags |= FC_VPORT_DELETING; ++ spin_unlock_irqrestore(shost->host_lock, flags); + + fc_queue_work(shost, &vport->vport_delete_work); + return count; +@@ -1804,6 +1813,9 @@ store_fc_host_vport_delete(struct device + list_for_each_entry(vport, &fc_host->vports, peers) { + if ((vport->channel == 0) && + (vport->port_name == wwpn) && (vport->node_name == wwnn)) { ++ if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) ++ break; ++ vport->flags |= FC_VPORT_DELETING; + match = 1; + break; + } +@@ -3328,18 +3340,6 @@ fc_vport_terminate(struct fc_vport *vpor + unsigned long flags; + int stat; + +- spin_lock_irqsave(shost->host_lock, flags); +- if (vport->flags & FC_VPORT_CREATING) { +- spin_unlock_irqrestore(shost->host_lock, flags); +- return -EBUSY; +- } +- if (vport->flags & (FC_VPORT_DEL)) { +- spin_unlock_irqrestore(shost->host_lock, flags); +- return -EALREADY; +- } +- vport->flags |= FC_VPORT_DELETING; +- spin_unlock_irqrestore(shost->host_lock, flags); +- + if (i->f->vport_delete) + stat = i->f->vport_delete(vport); + else diff --git a/queue-2.6.32/series b/queue-2.6.32/series index c55325b7586..0ab29a346c9 100644 --- a/queue-2.6.32/series +++ b/queue-2.6.32/series @@ -41,3 +41,22 @@ virtio-fix-out-of-range-array-access.patch x86-set_personality_ia32-misses-force_personality32.patch sched-fix-sched_mc-regression-caused-by-change-in-sched-cpu_power.patch readahead-add-blk_run_backing_dev.patch +alsa-hda-use-lpib-and-6stack-dig-for-emachines-t5212.patch +alsa-hda-disable-msi-for-nvidia-controller.patch +alsa-hda-add-pci-quirks-for-msi-neton-ap1900-and-wind-top-ae2220.patch +alsa-hda-fix-secondary-adc-of-alc260-basic-model.patch +alsa-hda-fix-0-db-offset-for-hp-laptops-using-cx20551-waikiki.patch +alsa-cmipci-work-around-invalid-pcm-pointer.patch +gigaset-correct-clearing-of-at_state-strings-on-ring.patch +gigaset-prune-use-of-tty_buffer_request_room.patch +perf-make-the-install-relative-to-destdir-if-specified.patch +perf_event-fix-oops-triggered-by-cpu-offline-online.patch +tmpfs-fix-oops-on-mounts-with-mpol-default.patch +tmpfs-mpol-bind-0-don-t-cause-mount-error.patch +tmpfs-handle-mpol_local-mount-option-properly.patch +tmpfs-cleanup-mpol_parse_str.patch +doc-add-the-documentation-for-mpol-local.patch +scsi-scsi_transport_fc-fix-synchronization-issue-while-deleting-vport.patch +nfsv4-don-t-ignore-the-nfs_ino_reval_forced-flag-in-nfs_revalidate_inode.patch +nfs-avoid-a-deadlock-in-nfs_release_page.patch +nfs-prevent-another-deadlock-in-nfs_release_page.patch diff --git a/queue-2.6.32/tmpfs-cleanup-mpol_parse_str.patch b/queue-2.6.32/tmpfs-cleanup-mpol_parse_str.patch new file mode 100644 index 00000000000..22974961a4d --- /dev/null +++ b/queue-2.6.32/tmpfs-cleanup-mpol_parse_str.patch @@ -0,0 +1,103 @@ +From 926f2ae04f183098cf9a30521776fb2759c8afeb Mon Sep 17 00:00:00 2001 +From: KOSAKI Motohiro +Date: Tue, 23 Mar 2010 13:35:32 -0700 +Subject: tmpfs: cleanup mpol_parse_str() + +From: KOSAKI Motohiro + +commit 926f2ae04f183098cf9a30521776fb2759c8afeb upstream. + +mpol_parse_str() made lots 'err' variable related bug. Because it is ugly +and reviewing unfriendly. + +This patch simplifies it. + +Signed-off-by: KOSAKI Motohiro +Cc: Ravikiran Thirumalai +Cc: Christoph Lameter +Cc: Mel Gorman +Acked-by: Lee Schermerhorn +Cc: Hugh Dickins +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/mempolicy.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2122,8 +2122,8 @@ int mpol_parse_str(char *str, struct mem + char *rest = nodelist; + while (isdigit(*rest)) + rest++; +- if (!*rest) +- err = 0; ++ if (*rest) ++ goto out; + } + break; + case MPOL_INTERLEAVE: +@@ -2132,7 +2132,6 @@ int mpol_parse_str(char *str, struct mem + */ + if (!nodelist) + nodes = node_states[N_HIGH_MEMORY]; +- err = 0; + break; + case MPOL_LOCAL: + /* +@@ -2141,7 +2140,6 @@ int mpol_parse_str(char *str, struct mem + if (nodelist) + goto out; + mode = MPOL_PREFERRED; +- err = 0; + break; + case MPOL_DEFAULT: + /* +@@ -2156,7 +2154,6 @@ int mpol_parse_str(char *str, struct mem + */ + if (!nodelist) + goto out; +- err = 0; + } + + mode_flags = 0; +@@ -2170,13 +2167,14 @@ int mpol_parse_str(char *str, struct mem + else if (!strcmp(flags, "relative")) + mode_flags |= MPOL_F_RELATIVE_NODES; + else +- err = 1; ++ goto out; + } + + new = mpol_new(mode, mode_flags, &nodes); + if (IS_ERR(new)) +- err = 1; +- else { ++ goto out; ++ ++ { + int ret; + NODEMASK_SCRATCH(scratch); + if (scratch) { +@@ -2187,13 +2185,15 @@ int mpol_parse_str(char *str, struct mem + ret = -ENOMEM; + NODEMASK_SCRATCH_FREE(scratch); + if (ret) { +- err = 1; + mpol_put(new); +- } else if (no_context) { +- /* save for contextualization */ +- new->w.user_nodemask = nodes; ++ goto out; + } + } ++ err = 0; ++ if (no_context) { ++ /* save for contextualization */ ++ new->w.user_nodemask = nodes; ++ } + + out: + /* Restore string for error message */ diff --git a/queue-2.6.32/tmpfs-fix-oops-on-mounts-with-mpol-default.patch b/queue-2.6.32/tmpfs-fix-oops-on-mounts-with-mpol-default.patch new file mode 100644 index 00000000000..4ed805dccd5 --- /dev/null +++ b/queue-2.6.32/tmpfs-fix-oops-on-mounts-with-mpol-default.patch @@ -0,0 +1,55 @@ +From 413b43deab8377819aba1dbad2abf0c15d59b491 Mon Sep 17 00:00:00 2001 +From: Ravikiran G Thirumalai +Date: Tue, 23 Mar 2010 13:35:28 -0700 +Subject: tmpfs: fix oops on mounts with mpol=default + +From: Ravikiran G Thirumalai + +commit 413b43deab8377819aba1dbad2abf0c15d59b491 upstream. + +Fix an 'oops' when a tmpfs mount point is mounted with the mpol=default +mempolicy. + +Upon remounting a tmpfs mount point with 'mpol=default' option, the mount +code crashed with a null pointer dereference. The initial problem report +was on 2.6.27, but the problem exists in mainline 2.6.34-rc as well. On +examining the code, we see that mpol_new returns NULL if default mempolicy +was requested. This 'NULL' mempolicy is accessed to store the node mask +resulting in oops. + +The following patch fixes it. + +Signed-off-by: Ravikiran Thirumalai +Signed-off-by: KOSAKI Motohiro +Cc: Christoph Lameter +Cc: Mel Gorman +Acked-by: Lee Schermerhorn +Cc: Hugh Dickins +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/mempolicy.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2142,10 +2142,15 @@ int mpol_parse_str(char *str, struct mem + goto out; + mode = MPOL_PREFERRED; + break; +- ++ case MPOL_DEFAULT: ++ /* ++ * Insist on a empty nodelist ++ */ ++ if (!nodelist) ++ err = 0; ++ goto out; + /* + * case MPOL_BIND: mpol_new() enforces non-empty nodemask. +- * case MPOL_DEFAULT: mpol_new() enforces empty nodemask, ignores flags. + */ + } + diff --git a/queue-2.6.32/tmpfs-handle-mpol_local-mount-option-properly.patch b/queue-2.6.32/tmpfs-handle-mpol_local-mount-option-properly.patch new file mode 100644 index 00000000000..f1a4f3615f6 --- /dev/null +++ b/queue-2.6.32/tmpfs-handle-mpol_local-mount-option-properly.patch @@ -0,0 +1,40 @@ +From 12821f5fb942e795f8009ece14bde868893bd811 Mon Sep 17 00:00:00 2001 +From: KOSAKI Motohiro +Date: Tue, 23 Mar 2010 13:35:31 -0700 +Subject: tmpfs: handle MPOL_LOCAL mount option properly + +From: KOSAKI Motohiro + +commit 12821f5fb942e795f8009ece14bde868893bd811 upstream. + +commit 71fe804b6d5 (mempolicy: use struct mempolicy pointer in +shmem_sb_info) added mpol=local mount option. but its feature is broken +since it was born. because such code always return 1 (i.e. mount +failure). + +This patch fixes it. + +Signed-off-by: KOSAKI Motohiro +Cc: Ravikiran Thirumalai +Cc: Christoph Lameter +Cc: Mel Gorman +Acked-by: Lee Schermerhorn +Cc: Hugh Dickins +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/mempolicy.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2141,6 +2141,7 @@ int mpol_parse_str(char *str, struct mem + if (nodelist) + goto out; + mode = MPOL_PREFERRED; ++ err = 0; + break; + case MPOL_DEFAULT: + /* diff --git a/queue-2.6.32/tmpfs-mpol-bind-0-don-t-cause-mount-error.patch b/queue-2.6.32/tmpfs-mpol-bind-0-don-t-cause-mount-error.patch new file mode 100644 index 00000000000..8cb8a1cc505 --- /dev/null +++ b/queue-2.6.32/tmpfs-mpol-bind-0-don-t-cause-mount-error.patch @@ -0,0 +1,51 @@ +From d69b2e63e9172afb4d07c305601b79a55509ac4c Mon Sep 17 00:00:00 2001 +From: KOSAKI Motohiro +Date: Tue, 23 Mar 2010 13:35:30 -0700 +Subject: tmpfs: mpol=bind:0 don't cause mount error. + +From: KOSAKI Motohiro + +commit d69b2e63e9172afb4d07c305601b79a55509ac4c upstream. + +Currently, following mount operation cause mount error. + +% mount -t tmpfs -ompol=bind:0 none /tmp + +Because commit 71fe804b6d5 (mempolicy: use struct mempolicy pointer in +shmem_sb_info) corrupted MPOL_BIND parse code. + +This patch restore the needed one. + +Signed-off-by: KOSAKI Motohiro +Cc: Ravikiran Thirumalai +Cc: Christoph Lameter +Cc: Mel Gorman +Acked-by: Lee Schermerhorn +Cc: Hugh Dickins +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/mempolicy.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -2149,9 +2149,13 @@ int mpol_parse_str(char *str, struct mem + if (!nodelist) + err = 0; + goto out; +- /* +- * case MPOL_BIND: mpol_new() enforces non-empty nodemask. +- */ ++ case MPOL_BIND: ++ /* ++ * Insist on a nodelist ++ */ ++ if (!nodelist) ++ goto out; ++ err = 0; + } + + mode_flags = 0; -- 2.47.3