From a6a37fb6d250ad6a1d223c55608f83d9b3120dab Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Mon, 25 Feb 2013 00:34:36 +0000 Subject: [PATCH] Cherry-pick some upstream fixes for data loss svn path=/dists/sid/linux/; revision=19853 --- debian/changelog | 2 + ...unusual_devs-update-for-Super-TOP-SA.patch | 38 +++++++++ .../mm-fix-pageblock-bitmap-allocation.patch | 80 +++++++++++++++++++ debian/patches/series | 2 + 4 files changed, 122 insertions(+) create mode 100644 debian/patches/bugfix/all/USB-usb-storage-unusual_devs-update-for-Super-TOP-SA.patch create mode 100644 debian/patches/bugfix/all/mm-fix-pageblock-bitmap-allocation.patch diff --git a/debian/changelog b/debian/changelog index 7e95e2f45..d8e6d40e5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -180,6 +180,8 @@ linux (3.2.39-1) UNRELEASED; urgency=low - drm/radeon: prevent crash in the ring space allocation * linux-image-dbg: Add symlinks to vmlinux from the locations expected by kdump-tools (Closes: #700418), systemtap and others + * mm: fix pageblock bitmap allocation (fixes regression in 3.2.38) + * USB: usb-storage: unusual_devs update for Super TOP SATA bridge [ Aurelien Jarno ] * [armhf/vexpress] Add kernel udebs. diff --git a/debian/patches/bugfix/all/USB-usb-storage-unusual_devs-update-for-Super-TOP-SA.patch b/debian/patches/bugfix/all/USB-usb-storage-unusual_devs-update-for-Super-TOP-SA.patch new file mode 100644 index 000000000..8acbfc7be --- /dev/null +++ b/debian/patches/bugfix/all/USB-usb-storage-unusual_devs-update-for-Super-TOP-SA.patch @@ -0,0 +1,38 @@ +From: Josh Boyer +Date: Thu, 14 Feb 2013 09:39:09 -0500 +Subject: USB: usb-storage: unusual_devs update for Super TOP SATA bridge + +commit 18e03310b5caa6d11c1a8c61b982c37047693fba upstream. + +The current entry in unusual_cypress.h for the Super TOP SATA bridge devices +seems to be causing corruption on newer revisions of this device. This has +been reported in Arch Linux and Fedora. The original patch was tested on +devices with bcdDevice of 1.60, whereas the newer devices report bcdDevice +as 2.20. Limit the UNUSUAL_DEV entry to devices less than 2.20. + +This fixes https://bugzilla.redhat.com/show_bug.cgi?id=909591 + +The Arch Forum post on this is here: + https://bbs.archlinux.org/viewtopic.php?id=152011 + +Reported-by: Carsten S. +Tested-by: Carsten S. +Signed-off-by: Josh Boyer +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/storage/unusual_cypress.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/usb/storage/unusual_cypress.h b/drivers/usb/storage/unusual_cypress.h +index 2c85530..65a6a75 100644 +--- a/drivers/usb/storage/unusual_cypress.h ++++ b/drivers/usb/storage/unusual_cypress.h +@@ -31,7 +31,7 @@ UNUSUAL_DEV( 0x04b4, 0x6831, 0x0000, 0x9999, + "Cypress ISD-300LP", + USB_SC_CYP_ATACB, USB_PR_DEVICE, NULL, 0), + +-UNUSUAL_DEV( 0x14cd, 0x6116, 0x0000, 0x9999, ++UNUSUAL_DEV( 0x14cd, 0x6116, 0x0000, 0x0219, + "Super Top", + "USB 2.0 SATA BRIDGE", + USB_SC_CYP_ATACB, USB_PR_DEVICE, NULL, 0), diff --git a/debian/patches/bugfix/all/mm-fix-pageblock-bitmap-allocation.patch b/debian/patches/bugfix/all/mm-fix-pageblock-bitmap-allocation.patch new file mode 100644 index 000000000..7f0b8a134 --- /dev/null +++ b/debian/patches/bugfix/all/mm-fix-pageblock-bitmap-allocation.patch @@ -0,0 +1,80 @@ +From: Linus Torvalds +Date: Mon, 18 Feb 2013 09:58:02 -0800 +Subject: mm: fix pageblock bitmap allocation + +commit 7c45512df987c5619db041b5c9b80d281e26d3db upstream. + +Commit c060f943d092 ("mm: use aligned zone start for pfn_to_bitidx +calculation") fixed out calculation of the index into the pageblock +bitmap when a !SPARSEMEM zome was not aligned to pageblock_nr_pages. + +However, the _allocation_ of that bitmap had never taken this alignment +requirement into accout, so depending on the exact size and alignment of +the zone, the use of that index could then access past the allocation, +resulting in some very subtle memory corruption. + +This was reported (and bisected) by Ingo Molnar: one of his random +config builds would hang with certain very specific kernel command line +options. + +In the meantime, commit c060f943d092 has been marked for stable, so this +fix needs to be back-ported to the stable kernels that backported the +commit to use the right alignment. + +Bisected-and-tested-by: Ingo Molnar +Acked-by: Mel Gorman +Signed-off-by: Linus Torvalds +--- + mm/page_alloc.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index 9673d96..6a83cd3 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -4420,10 +4420,11 @@ static void __meminit calculate_node_totalpages(struct pglist_data *pgdat, + * round what is now in bits to nearest long in bits, then return it in + * bytes. + */ +-static unsigned long __init usemap_size(unsigned long zonesize) ++static unsigned long __init usemap_size(unsigned long zone_start_pfn, unsigned long zonesize) + { + unsigned long usemapsize; + ++ zonesize += zone_start_pfn & (pageblock_nr_pages-1); + usemapsize = roundup(zonesize, pageblock_nr_pages); + usemapsize = usemapsize >> pageblock_order; + usemapsize *= NR_PAGEBLOCK_BITS; +@@ -4433,17 +4434,19 @@ static unsigned long __init usemap_size(unsigned long zonesize) + } + + static void __init setup_usemap(struct pglist_data *pgdat, +- struct zone *zone, unsigned long zonesize) ++ struct zone *zone, ++ unsigned long zone_start_pfn, ++ unsigned long zonesize) + { +- unsigned long usemapsize = usemap_size(zonesize); ++ unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize); + zone->pageblock_flags = NULL; + if (usemapsize) + zone->pageblock_flags = alloc_bootmem_node_nopanic(pgdat, + usemapsize); + } + #else +-static inline void setup_usemap(struct pglist_data *pgdat, +- struct zone *zone, unsigned long zonesize) {} ++static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone, ++ unsigned long zone_start_pfn, unsigned long zonesize) {} + #endif /* CONFIG_SPARSEMEM */ + + #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE +@@ -4594,7 +4597,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat, + continue; + + set_pageblock_order(); +- setup_usemap(pgdat, zone, size); ++ setup_usemap(pgdat, zone, zone_start_pfn, size); + ret = init_currently_empty_zone(zone, zone_start_pfn, + size, MEMMAP_EARLY); + BUG_ON(ret); diff --git a/debian/patches/series b/debian/patches/series index fe3848852..f7055b7f6 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -626,3 +626,5 @@ features/all/line6/0106-staging-line6-drop-unused-dumprequest-code.patch bugfix/all/mm-Try-harder-to-allocate-vmemmap-blocks.patch bugfix/x86/efi-Clear-EFI_RUNTIME_SERVICES-rather-than-EFI_BOOT-.patch bugfix/x86/x86-efi-Make-noefi-really-disable-EFI-runtime-serivc.patch +bugfix/all/mm-fix-pageblock-bitmap-allocation.patch +bugfix/all/USB-usb-storage-unusual_devs-update-for-Super-TOP-SA.patch