diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2010-12-17 15:34:02 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-12-17 15:34:02 -0800 |
commit | c3520c4bef7d293f540b6ac347631e34b4e074d7 (patch) | |
tree | d42312159120e09e997efe7e852d3239d3b92714 | |
parent | 98679ce9f502cd32c26dccd37c5b04643dc904ae (diff) | |
download | stable-queue-c3520c4bef7d293f540b6ac347631e34b4e074d7.tar.gz |
.36 patches
11 files changed, 552 insertions, 0 deletions
diff --git a/queue-2.6.36/alsa-hda-always-allow-basic-audio-irrespective-of-eld-info.patch b/queue-2.6.36/alsa-hda-always-allow-basic-audio-irrespective-of-eld-info.patch new file mode 100644 index 0000000000..56c4aa6d81 --- /dev/null +++ b/queue-2.6.36/alsa-hda-always-allow-basic-audio-irrespective-of-eld-info.patch @@ -0,0 +1,65 @@ +From 3dc86429032910bdf762adeb2969112bb303924c Mon Sep 17 00:00:00 2001 +From: Anssi Hannula <anssi.hannula@iki.fi> +Date: Tue, 7 Dec 2010 20:56:19 +0200 +Subject: ALSA: hda - Always allow basic audio irrespective of ELD info + +From: Anssi Hannula <anssi.hannula@iki.fi> + +commit 3dc86429032910bdf762adeb2969112bb303924c upstream. + +Commit bbbe33900d1f3c added functionality to restrict PCM parameters +based on ELD info (derived from EDID data) of the audio sink. + +However, according to CEA-861-D no SAD is needed for basic audio +(32/44.1/48kHz stereo 16-bit audio), which is instead indicated with a +basic audio flag in the CEA EDID Extension. + +The flag is not present in ELD. However, as all audio capable sinks are +required to support basic audio, we can assume it to be always +available. + +Fix allowed audio formats with sinks that have SADs (Short Audio +Descriptors) which do not completely overlap with the basic audio +formats (there are no reports of affected devices so far) by always +assuming that basic audio is supported. + +Reported-by: Stephen Warren <swarren@nvidia.com> +Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi> +Signed-off-by: Takashi Iwai <tiwai@suse.de> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + sound/pci/hda/hda_eld.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +--- a/sound/pci/hda/hda_eld.c ++++ b/sound/pci/hda/hda_eld.c +@@ -604,21 +604,19 @@ void hdmi_eld_update_pcm_info(struct hdm + { + int i; + +- pcm->rates = 0; +- pcm->formats = 0; +- pcm->maxbps = 0; +- pcm->channels_max = 0; ++ /* assume basic audio support (the basic audio flag is not in ELD; ++ * however, all audio capable sinks are required to support basic ++ * audio) */ ++ pcm->rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000; ++ pcm->formats = SNDRV_PCM_FMTBIT_S16_LE; ++ pcm->maxbps = 16; ++ pcm->channels_max = 2; + for (i = 0; i < eld->sad_count; i++) { + struct cea_sad *a = &eld->sad[i]; + pcm->rates |= a->rates; + if (a->channels > pcm->channels_max) + pcm->channels_max = a->channels; + if (a->format == AUDIO_CODING_TYPE_LPCM) { +- if (a->sample_bits & AC_SUPPCM_BITS_16) { +- pcm->formats |= SNDRV_PCM_FMTBIT_S16_LE; +- if (pcm->maxbps < 16) +- pcm->maxbps = 16; +- } + if (a->sample_bits & AC_SUPPCM_BITS_20) { + pcm->formats |= SNDRV_PCM_FMTBIT_S32_LE; + if (pcm->maxbps < 20) diff --git a/queue-2.6.36/alsa-hda-do-not-wrongly-restrict-min_channels-based-on-eld.patch b/queue-2.6.36/alsa-hda-do-not-wrongly-restrict-min_channels-based-on-eld.patch new file mode 100644 index 0000000000..e44623259f --- /dev/null +++ b/queue-2.6.36/alsa-hda-do-not-wrongly-restrict-min_channels-based-on-eld.patch @@ -0,0 +1,69 @@ +From 4b0dbdb17f846a8887e5f7fbeea2deb0703236bd Mon Sep 17 00:00:00 2001 +From: Anssi Hannula <anssi.hannula@iki.fi> +Date: Tue, 7 Dec 2010 18:41:35 +0200 +Subject: ALSA: hda - Do not wrongly restrict min_channels based on ELD + +From: Anssi Hannula <anssi.hannula@iki.fi> + +commit 4b0dbdb17f846a8887e5f7fbeea2deb0703236bd upstream. + +Commit bbbe33900d1f3c added functionality to restrict PCM parameters +based on ELD info (derived from EDID data) of the audio sink. + +However, it wrongly assumes that the bits 0-2 of the first byte of +CEA Short Audio Descriptors mean a supported number of channels. In +reality, they mean the maximum number of channels (as per CEA-861-D +7.5.2). This means that the channel count can only be used to restrict +max_channels, not min_channels. + +Restricting min_channels causes us to deny opening the device in stereo +mode if the sink only has SADs that declare larger numbers of channels +(like Primare SP32 AV Processor does). + +Fix that by not restricting min_channels based on ELD information. + +Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi> +Reported-by: Jean-Yves Avenard <jyavenard@gmail.com> +Tested-by: Jean-Yves Avenard <jyavenard@gmail.com> +Signed-off-by: Takashi Iwai <tiwai@suse.de> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + sound/pci/hda/hda_eld.c | 4 ---- + sound/pci/hda/patch_hdmi.c | 1 - + 2 files changed, 5 deletions(-) + +--- a/sound/pci/hda/hda_eld.c ++++ b/sound/pci/hda/hda_eld.c +@@ -607,13 +607,10 @@ void hdmi_eld_update_pcm_info(struct hdm + pcm->rates = 0; + pcm->formats = 0; + pcm->maxbps = 0; +- pcm->channels_min = -1; + pcm->channels_max = 0; + for (i = 0; i < eld->sad_count; i++) { + struct cea_sad *a = &eld->sad[i]; + pcm->rates |= a->rates; +- if (a->channels < pcm->channels_min) +- pcm->channels_min = a->channels; + if (a->channels > pcm->channels_max) + pcm->channels_max = a->channels; + if (a->format == AUDIO_CODING_TYPE_LPCM) { +@@ -641,7 +638,6 @@ void hdmi_eld_update_pcm_info(struct hdm + /* restrict the parameters by the values the codec provides */ + pcm->rates &= codec_pars->rates; + pcm->formats &= codec_pars->formats; +- pcm->channels_min = max(pcm->channels_min, codec_pars->channels_min); + pcm->channels_max = min(pcm->channels_max, codec_pars->channels_max); + pcm->maxbps = min(pcm->maxbps, codec_pars->maxbps); + } +--- a/sound/pci/hda/patch_hdmi.c ++++ b/sound/pci/hda/patch_hdmi.c +@@ -779,7 +779,6 @@ static int hdmi_pcm_open(struct hda_pcm_ + return -ENODEV; + } else { + /* fallback to the codec default */ +- hinfo->channels_min = codec_pars->channels_min; + hinfo->channels_max = codec_pars->channels_max; + hinfo->rates = codec_pars->rates; + hinfo->formats = codec_pars->formats; diff --git a/queue-2.6.36/alsa-hda-quirk-for-dell-vostro-320-to-make-microphone-work.patch b/queue-2.6.36/alsa-hda-quirk-for-dell-vostro-320-to-make-microphone-work.patch new file mode 100644 index 0000000000..56c63e6e10 --- /dev/null +++ b/queue-2.6.36/alsa-hda-quirk-for-dell-vostro-320-to-make-microphone-work.patch @@ -0,0 +1,34 @@ +From 8a96b1e02029aa512199b1b6d281dcede9ed81f1 Mon Sep 17 00:00:00 2001 +From: David Henningsson <david.henningsson@canonical.com> +Date: Thu, 9 Dec 2010 07:17:27 +0100 +Subject: ALSA: HDA: Quirk for Dell Vostro 320 to make microphone work + +From: David Henningsson <david.henningsson@canonical.com> + +commit 8a96b1e02029aa512199b1b6d281dcede9ed81f1 upstream. + +BugLink: http://launchpad.net/497546 + +Confirmed that the ideapad model works better than the current +quirk for Dell Vostro 320. + +Signed-off-by: David Henningsson <david.henningsson@canonical.com> +Signed-off-by: Takashi Iwai <tiwai@suse.de> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + sound/pci/hda/patch_conexant.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/sound/pci/hda/patch_conexant.c ++++ b/sound/pci/hda/patch_conexant.c +@@ -3085,8 +3085,7 @@ static const char *cxt5066_models[CXT506 + static struct snd_pci_quirk cxt5066_cfg_tbl[] = { + SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", + CXT5066_LAPTOP), +- SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", +- CXT5066_DELL_LAPTOP), ++ SND_PCI_QUIRK(0x1028, 0x02f5, "Dell Vostro 320", CXT5066_IDEAPAD), + SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), + SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO), + SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), diff --git a/queue-2.6.36/alsa-hda-use-model-lg-quirk-for-lg-p1-express-to-enable-playback-and-capture.patch b/queue-2.6.36/alsa-hda-use-model-lg-quirk-for-lg-p1-express-to-enable-playback-and-capture.patch new file mode 100644 index 0000000000..f649028214 --- /dev/null +++ b/queue-2.6.36/alsa-hda-use-model-lg-quirk-for-lg-p1-express-to-enable-playback-and-capture.patch @@ -0,0 +1,38 @@ +From 77c4d5cdb81d25a45fbdfb84dd3348121219a072 Mon Sep 17 00:00:00 2001 +From: Daniel T Chen <crimsun@ubuntu.com> +Date: Thu, 2 Dec 2010 22:45:45 -0500 +Subject: ALSA: hda: Use model=lg quirk for LG P1 Express to enable playback and capture + +From: Daniel T Chen <crimsun@ubuntu.com> + +commit 77c4d5cdb81d25a45fbdfb84dd3348121219a072 upstream. + +BugLink: https://launchpad.net/bugs/595482 + +The original reporter states that audible playback from the internal +speaker is inaudible despite the hardware being properly detected. To +work around this symptom, he uses the model=lg quirk to properly enable +both playback, capture, and jack sense. Another user corroborates this +workaround on separate hardware. Add this PCI SSID to the quirk table +to enable it for further LG P1 Expresses. + +Reported-and-tested-by: Philip Peitsch <philip.peitsch@gmail.com> +Tested-by: nikhov +Signed-off-by: Daniel T Chen <crimsun@ubuntu.com> +Signed-off-by: Takashi Iwai <tiwai@suse.de> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + sound/pci/hda/patch_realtek.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -4389,6 +4389,7 @@ static struct snd_pci_quirk alc880_cfg_t + SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU), + SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW), + SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG), ++ SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_LG), + SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG), + SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW), + SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700), diff --git a/queue-2.6.36/alsa-hda-use-position_fix-1-for-acer-aspire-5538-to-enable-capture-on-internal-mic.patch b/queue-2.6.36/alsa-hda-use-position_fix-1-for-acer-aspire-5538-to-enable-capture-on-internal-mic.patch new file mode 100644 index 0000000000..b9490f71de --- /dev/null +++ b/queue-2.6.36/alsa-hda-use-position_fix-1-for-acer-aspire-5538-to-enable-capture-on-internal-mic.patch @@ -0,0 +1,34 @@ +From dd5a089edfa51a74692604b4b427953d8e16bc35 Mon Sep 17 00:00:00 2001 +From: Daniel T Chen <crimsun@ubuntu.com> +Date: Sun, 5 Dec 2010 08:43:14 -0500 +Subject: ALSA: hda: Use position_fix=1 for Acer Aspire 5538 to enable capture on internal mic + +From: Daniel T Chen <crimsun@ubuntu.com> + +commit dd5a089edfa51a74692604b4b427953d8e16bc35 upstream. + +BugLink: https://launchpad.net/bugs/685161 + +The reporter of the bug states that he must use position_fix=1 to enable +capture for the internal microphone, so set it for his machine's PCI +SSID. Verified using 2.6.35 and the 2010-12-04 alsa-driver build. + +Reported-and-tested-by: Ralph Wabel <rwabel@gmx.net> +Signed-off-by: Daniel T Chen <crimsun@ubuntu.com> +Signed-off-by: Takashi Iwai <tiwai@suse.de> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + sound/pci/hda/hda_intel.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -2298,6 +2298,7 @@ static int azx_dev_free(struct snd_devic + */ + static struct snd_pci_quirk position_fix_list[] __devinitdata = { + SND_PCI_QUIRK(0x1025, 0x009f, "Acer Aspire 5110", POS_FIX_LPIB), ++ SND_PCI_QUIRK(0x1025, 0x026f, "Acer Aspire 5538", POS_FIX_LPIB), + SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), + SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), + SND_PCI_QUIRK(0x1028, 0x01f6, "Dell Latitude 131L", POS_FIX_LPIB), diff --git a/queue-2.6.36/drm-kms-remove-spaces-from-connector-names-v2.patch b/queue-2.6.36/drm-kms-remove-spaces-from-connector-names-v2.patch new file mode 100644 index 0000000000..b7279562c7 --- /dev/null +++ b/queue-2.6.36/drm-kms-remove-spaces-from-connector-names-v2.patch @@ -0,0 +1,46 @@ +From e76116ca9671e2e5239054a40303b94feab585ad Mon Sep 17 00:00:00 2001 +From: Alex Deucher <alexdeucher@gmail.com> +Date: Wed, 8 Dec 2010 19:09:42 -0500 +Subject: drm/kms: remove spaces from connector names (v2) + +From: Alex Deucher <alexdeucher@gmail.com> + +commit e76116ca9671e2e5239054a40303b94feab585ad upstream. + +Grub doesn't parse spaces in parameters correctly, so +this makes it impossible to force video= parameters +for kms on the grub kernel command line. + +v2: shorten the names to make them easier to type. + +Reported-by: Sergej Pupykin <ml@sergej.pp.ru> + +Cc: Sergej Pupykin <ml@sergej.pp.ru> +Signed-off-by: Alex Deucher <alexdeucher@gmail.com> +Signed-off-by: Dave Airlie <airlied@redhat.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/gpu/drm/drm_crtc.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +--- a/drivers/gpu/drm/drm_crtc.c ++++ b/drivers/gpu/drm/drm_crtc.c +@@ -156,12 +156,12 @@ static struct drm_conn_prop_enum_list dr + { DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO", 0 }, + { DRM_MODE_CONNECTOR_LVDS, "LVDS", 0 }, + { DRM_MODE_CONNECTOR_Component, "Component", 0 }, +- { DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN", 0 }, +- { DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort", 0 }, +- { DRM_MODE_CONNECTOR_HDMIA, "HDMI Type A", 0 }, +- { DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 }, ++ { DRM_MODE_CONNECTOR_9PinDIN, "DIN", 0 }, ++ { DRM_MODE_CONNECTOR_DisplayPort, "DP", 0 }, ++ { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A", 0 }, ++ { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B", 0 }, + { DRM_MODE_CONNECTOR_TV, "TV", 0 }, +- { DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort", 0 }, ++ { DRM_MODE_CONNECTOR_eDP, "eDP", 0 }, + }; + + static struct drm_prop_enum_list drm_encoder_enum_list[] = diff --git a/queue-2.6.36/drm-radeon-kms-don-t-apply-7xx-hdp-flush-workaround-on-agp.patch b/queue-2.6.36/drm-radeon-kms-don-t-apply-7xx-hdp-flush-workaround-on-agp.patch new file mode 100644 index 0000000000..0f4f3a3d48 --- /dev/null +++ b/queue-2.6.36/drm-radeon-kms-don-t-apply-7xx-hdp-flush-workaround-on-agp.patch @@ -0,0 +1,58 @@ +From f3886f85cfde578f1d0ba6e40ac5f9d70043923b Mon Sep 17 00:00:00 2001 +From: Alex Deucher <alexdeucher@gmail.com> +Date: Wed, 8 Dec 2010 10:05:34 -0500 +Subject: drm/radeon/kms: don't apply 7xx HDP flush workaround on AGP + +From: Alex Deucher <alexdeucher@gmail.com> + +commit f3886f85cfde578f1d0ba6e40ac5f9d70043923b upstream. + +It should be required for all 7xx asics, but seems to cause +problems on some AGP 7xx chips. + +Fixes: +https://bugzilla.kernel.org/show_bug.cgi?id=19002 + +Signed-off-by: Alex Deucher <alexdeucher@gmail.com> +Reported-and-Tested-by: Duncan <1i5t5.duncan@cox.net> +Signed-off-by: Dave Airlie <airlied@redhat.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/gpu/drm/radeon/r600.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +--- a/drivers/gpu/drm/radeon/r600.c ++++ b/drivers/gpu/drm/radeon/r600.c +@@ -878,12 +878,15 @@ void r600_pcie_gart_tlb_flush(struct rad + u32 tmp; + + /* flush hdp cache so updates hit vram */ +- if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) { ++ if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) && ++ !(rdev->flags & RADEON_IS_AGP)) { + void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; + u32 tmp; + + /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read + * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL ++ * This seems to cause problems on some AGP cards. Just use the old ++ * method for them. + */ + WREG32(HDP_DEBUG1, 0); + tmp = readl((void __iomem *)ptr); +@@ -3525,10 +3528,12 @@ int r600_debugfs_mc_info_init(struct rad + void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo) + { + /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read +- * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL ++ * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL. ++ * This seems to cause problems on some AGP cards. Just use the old ++ * method for them. + */ + if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) && +- rdev->vram_scratch.ptr) { ++ rdev->vram_scratch.ptr && !(rdev->flags & RADEON_IS_AGP)) { + void __iomem *ptr = (void *)rdev->vram_scratch.ptr; + u32 tmp; + diff --git a/queue-2.6.36/drm-radeon-kms-fix-vram-base-calculation-on-rs780-rs880.patch b/queue-2.6.36/drm-radeon-kms-fix-vram-base-calculation-on-rs780-rs880.patch new file mode 100644 index 0000000000..c45e6d7288 --- /dev/null +++ b/queue-2.6.36/drm-radeon-kms-fix-vram-base-calculation-on-rs780-rs880.patch @@ -0,0 +1,34 @@ +From 8961d52d4cc52edf5672f8f2712c57162b736793 Mon Sep 17 00:00:00 2001 +From: Alex Deucher <alexdeucher@gmail.com> +Date: Fri, 3 Dec 2010 14:37:22 -0500 +Subject: drm/radeon/kms: fix vram base calculation on rs780/rs880 + +From: Alex Deucher <alexdeucher@gmail.com> + +commit 8961d52d4cc52edf5672f8f2712c57162b736793 upstream. + +Avoid overflowing a 32 bit value. + +Signed-off-by: Alex Deucher <alexdeucher@gmail.com> +Signed-off-by: Dave Airlie <airlied@redhat.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/gpu/drm/radeon/r600.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/gpu/drm/radeon/r600.c ++++ b/drivers/gpu/drm/radeon/r600.c +@@ -1198,8 +1198,10 @@ void r600_vram_gtt_location(struct radeo + mc->vram_end, mc->real_vram_size >> 20); + } else { + u64 base = 0; +- if (rdev->flags & RADEON_IS_IGP) +- base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; ++ if (rdev->flags & RADEON_IS_IGP) { ++ base = RREG32(MC_VM_FB_LOCATION) & 0xFFFF; ++ base <<= 24; ++ } + radeon_vram_location(rdev, &rdev->mc, base); + rdev->mc.gtt_base_align = 0; + radeon_gtt_location(rdev, mc); diff --git a/queue-2.6.36/fuse-fix-ioctl-when-server-is-32bit.patch b/queue-2.6.36/fuse-fix-ioctl-when-server-is-32bit.patch new file mode 100644 index 0000000000..29b5c00eee --- /dev/null +++ b/queue-2.6.36/fuse-fix-ioctl-when-server-is-32bit.patch @@ -0,0 +1,106 @@ +From d9d318d39dd5cb686660504a3565aac453709ccc Mon Sep 17 00:00:00 2001 +From: Miklos Szeredi <mszeredi@suse.cz> +Date: Tue, 30 Nov 2010 16:39:27 +0100 +Subject: fuse: fix ioctl when server is 32bit + +From: Miklos Szeredi <mszeredi@suse.cz> + +commit d9d318d39dd5cb686660504a3565aac453709ccc upstream. + +If a 32bit CUSE server is run on 64bit this results in EIO being +returned to the caller. + +The reason is that FUSE_IOCTL_RETRY reply was defined to use 'struct +iovec', which is different on 32bit and 64bit archs. + +Work around this by looking at the size of the reply to determine +which struct was used. This is only needed if CONFIG_COMPAT is +defined. + +A more permanent fix for the interface will be to use the same struct +on both 32bit and 64bit. + +Reported-by: "ccmail111" <ccmail111@yahoo.com> +Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> +CC: Tejun Heo <tj@kernel.org> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + fs/fuse/file.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 44 insertions(+), 6 deletions(-) + +--- a/fs/fuse/file.c ++++ b/fs/fuse/file.c +@@ -13,6 +13,7 @@ + #include <linux/kernel.h> + #include <linux/sched.h> + #include <linux/module.h> ++#include <linux/compat.h> + + static const struct file_operations fuse_direct_io_file_operations; + +@@ -1642,6 +1643,44 @@ static int fuse_verify_ioctl_iov(struct + } + + /* ++ * CUSE servers compiled on 32bit broke on 64bit kernels because the ++ * ABI was defined to be 'struct iovec' which is different on 32bit ++ * and 64bit. Fortunately we can determine which structure the server ++ * used from the size of the reply. ++ */ ++static int fuse_copy_ioctl_iovec(struct iovec *dst, void *src, ++ size_t transferred, unsigned count, ++ bool is_compat) ++{ ++#ifdef CONFIG_COMPAT ++ if (count * sizeof(struct compat_iovec) == transferred) { ++ struct compat_iovec *ciov = src; ++ unsigned i; ++ ++ /* ++ * With this interface a 32bit server cannot support ++ * non-compat (i.e. ones coming from 64bit apps) ioctl ++ * requests ++ */ ++ if (!is_compat) ++ return -EINVAL; ++ ++ for (i = 0; i < count; i++) { ++ dst[i].iov_base = compat_ptr(ciov[i].iov_base); ++ dst[i].iov_len = ciov[i].iov_len; ++ } ++ return 0; ++ } ++#endif ++ ++ if (count * sizeof(struct iovec) != transferred) ++ return -EIO; ++ ++ memcpy(dst, src, transferred); ++ return 0; ++} ++ ++/* + * For ioctls, there is no generic way to determine how much memory + * needs to be read and/or written. Furthermore, ioctls are allowed + * to dereference the passed pointer, so the parameter requires deep +@@ -1822,14 +1861,13 @@ long fuse_do_ioctl(struct file *file, un + in_iovs + out_iovs > FUSE_IOCTL_MAX_IOV) + goto out; + +- err = -EIO; +- if ((in_iovs + out_iovs) * sizeof(struct iovec) != transferred) +- goto out; +- +- /* okay, copy in iovs and retry */ + vaddr = kmap_atomic(pages[0], KM_USER0); +- memcpy(page_address(iov_page), vaddr, transferred); ++ err = fuse_copy_ioctl_iovec(page_address(iov_page), vaddr, ++ transferred, in_iovs + out_iovs, ++ (flags & FUSE_IOCTL_COMPAT) != 0); + kunmap_atomic(vaddr, KM_USER0); ++ if (err) ++ goto out; + + in_iov = page_address(iov_page); + out_iov = in_iov + in_iovs; diff --git a/queue-2.6.36/fuse-verify-ioctl-retries.patch b/queue-2.6.36/fuse-verify-ioctl-retries.patch new file mode 100644 index 0000000000..f2f334bbee --- /dev/null +++ b/queue-2.6.36/fuse-verify-ioctl-retries.patch @@ -0,0 +1,58 @@ +From 7572777eef78ebdee1ecb7c258c0ef94d35bad16 Mon Sep 17 00:00:00 2001 +From: Miklos Szeredi <mszeredi@suse.cz> +Date: Tue, 30 Nov 2010 16:39:27 +0100 +Subject: fuse: verify ioctl retries + +From: Miklos Szeredi <mszeredi@suse.cz> + +commit 7572777eef78ebdee1ecb7c258c0ef94d35bad16 upstream. + +Verify that the total length of the iovec returned in FUSE_IOCTL_RETRY +doesn't overflow iov_length(). + +Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> +CC: Tejun Heo <tj@kernel.org> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + fs/fuse/file.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +--- a/fs/fuse/file.c ++++ b/fs/fuse/file.c +@@ -1627,6 +1627,20 @@ static int fuse_ioctl_copy_user(struct p + return 0; + } + ++/* Make sure iov_length() won't overflow */ ++static int fuse_verify_ioctl_iov(struct iovec *iov, size_t count) ++{ ++ size_t n; ++ u32 max = FUSE_MAX_PAGES_PER_REQ << PAGE_SHIFT; ++ ++ for (n = 0; n < count; n++) { ++ if (iov->iov_len > (size_t) max) ++ return -ENOMEM; ++ max -= iov->iov_len; ++ } ++ return 0; ++} ++ + /* + * For ioctls, there is no generic way to determine how much memory + * needs to be read and/or written. Furthermore, ioctls are allowed +@@ -1820,6 +1834,14 @@ long fuse_do_ioctl(struct file *file, un + in_iov = page_address(iov_page); + out_iov = in_iov + in_iovs; + ++ err = fuse_verify_ioctl_iov(in_iov, in_iovs); ++ if (err) ++ goto out; ++ ++ err = fuse_verify_ioctl_iov(out_iov, out_iovs); ++ if (err) ++ goto out; ++ + goto retry; + } + diff --git a/queue-2.6.36/series b/queue-2.6.36/series index f4f3453013..807f3eeca2 100644 --- a/queue-2.6.36/series +++ b/queue-2.6.36/series @@ -1 +1,11 @@ x86-hotplug-use-mwait-to-offline-a-processor-fix-the-legacy-case.patch +fuse-verify-ioctl-retries.patch +fuse-fix-ioctl-when-server-is-32bit.patch +alsa-hda-quirk-for-dell-vostro-320-to-make-microphone-work.patch +alsa-hda-do-not-wrongly-restrict-min_channels-based-on-eld.patch +alsa-hda-always-allow-basic-audio-irrespective-of-eld-info.patch +alsa-hda-use-position_fix-1-for-acer-aspire-5538-to-enable-capture-on-internal-mic.patch +alsa-hda-use-model-lg-quirk-for-lg-p1-express-to-enable-playback-and-capture.patch +drm-radeon-kms-don-t-apply-7xx-hdp-flush-workaround-on-agp.patch +drm-kms-remove-spaces-from-connector-names-v2.patch +drm-radeon-kms-fix-vram-base-calculation-on-rs780-rs880.patch |