|
Re: [kernel] r14060 - in dists/sid/linux-2.6/debian: . patches/bugfix/all p: msg#13356general
On Fri, Jul 31, 2009 at 11:38:56AM +0000, Maximilian Attems wrote: > Author: maks > Date: Fri Jul 31 11:38:53 2009 > New Revision: 14060 > > Log: > add stable 2.6.30.4 > > curious if this breaks abi. > unpatch merged parisc fixes, nuke not yet released ecryptfs patches, > they are also in (this somehow steals from dannf changelog entries, > don't know if this should be reorganised, > but his commits will be still around). No attribution necessary, I knew they'd be in the next .y, but didn't want us to upload something unfixed in between. Thanks maks! > > Added: > dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.30.4.patch > Deleted: > > dists/sid/linux-2.6/debian/patches/bugfix/all/ecryptfs-check-tag-11-literal-data-buffer-size.patch > > dists/sid/linux-2.6/debian/patches/bugfix/all/ecryptfs-parse_tag_3_packet-check-tag-3-package-encrypted-key-size.patch > Modified: > dists/sid/linux-2.6/debian/changelog > dists/sid/linux-2.6/debian/patches/series/5 > > Modified: dists/sid/linux-2.6/debian/changelog > ============================================================================== > --- dists/sid/linux-2.6/debian/changelog Fri Jul 31 06:25:10 2009 > (r14059) > +++ dists/sid/linux-2.6/debian/changelog Fri Jul 31 11:38:53 2009 > (r14060) > @@ -1,7 +1,11 @@ > linux-2.6 (2.6.30-5) UNRELEASED; urgency=low > > - * ecryptfs: check tag 11 literal data buffer size (CVE-2009-2406) > - * ecryptfs: check tag 3 package encrypted size (CVE-2009-2407) > + [ maximilian attems ] > + * Add stable release 2.6.30.4. > + - cifs: fix regression with O_EXCL creates and optimize away lookup > + (closes: #536426) > + - ecryptfs: check tag 11 literal data buffer size (CVE-2009-2406) > + - ecryptfs: check tag 3 package encrypted size (CVE-2009-2407) > > -- dann frazier <dannf@xxxxxxxxxx> Thu, 30 Jul 2009 11:10:47 -0600 > > > Added: dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.30.4.patch > ============================================================================== > --- /dev/null 00:00:00 1970 (empty, because file is newly added) > +++ dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.30.4.patch > Fri Jul 31 11:38:53 2009 (r14060) > @@ -0,0 +1,2452 @@ > +diff --git a/Documentation/RCU/rculist_nulls.txt > b/Documentation/RCU/rculist_nulls.txt > +index 6389dec..d0c017e 100644 > +--- a/Documentation/RCU/rculist_nulls.txt > ++++ b/Documentation/RCU/rculist_nulls.txt > +@@ -83,11 +83,12 @@ not detect it missed following items in original chain. > + obj = kmem_cache_alloc(...); > + lock_chain(); // typically a spin_lock() > + obj->key = key; > +-atomic_inc(&obj->refcnt); > + /* > + * we need to make sure obj->key is updated before obj->next > ++ * or obj->refcnt > + */ > + smp_wmb(); > ++atomic_set(&obj->refcnt, 1); > + hlist_add_head_rcu(&obj->obj_node, list); > + unlock_chain(); // typically a spin_unlock() > + > +@@ -159,6 +160,10 @@ out: > + obj = kmem_cache_alloc(cachep); > + lock_chain(); // typically a spin_lock() > + obj->key = key; > ++/* > ++ * changes to obj->key must be visible before refcnt one > ++ */ > ++smp_wmb(); > + atomic_set(&obj->refcnt, 1); > + /* > + * insert obj in RCU way (readers might be traversing chain) > +diff --git a/arch/parisc/include/asm/system.h > b/arch/parisc/include/asm/system.h > +index ee80c92..d91357b 100644 > +--- a/arch/parisc/include/asm/system.h > ++++ b/arch/parisc/include/asm/system.h > +@@ -168,8 +168,8 @@ static inline void set_eiem(unsigned long val) > + /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ > + #define __ldcw(a) ({ \ > + unsigned __ret; \ > +- __asm__ __volatile__(__LDCW " 0(%1),%0" \ > +- : "=r" (__ret) : "r" (a)); \ > ++ __asm__ __volatile__(__LDCW " 0(%2),%0" \ > ++ : "=r" (__ret), "+m" (*(a)) : "r" (a)); \ > + __ret; \ > + }) > + > +diff --git a/arch/parisc/include/asm/tlbflush.h > b/arch/parisc/include/asm/tlbflush.h > +index 1f6fd4f..8f1a810 100644 > +--- a/arch/parisc/include/asm/tlbflush.h > ++++ b/arch/parisc/include/asm/tlbflush.h > +@@ -12,14 +12,12 @@ > + * N class systems, only one PxTLB inter processor broadcast can be > + * active at any one time on the Merced bus. This tlb purge > + * synchronisation is fairly lightweight and harmless so we activate > +- * it on all SMP systems not just the N class. We also need to have > +- * preemption disabled on uniprocessor machines, and spin_lock does that > +- * nicely. > ++ * it on all systems not just the N class. > + */ > + extern spinlock_t pa_tlb_lock; > + > +-#define purge_tlb_start(x) spin_lock(&pa_tlb_lock) > +-#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock) > ++#define purge_tlb_start(flags) spin_lock_irqsave(&pa_tlb_lock, flags) > ++#define purge_tlb_end(flags) spin_unlock_irqrestore(&pa_tlb_lock, > flags) > + > + extern void flush_tlb_all(void); > + extern void flush_tlb_all_local(void *); > +@@ -63,14 +61,16 @@ static inline void flush_tlb_mm(struct mm_struct *mm) > + static inline void flush_tlb_page(struct vm_area_struct *vma, > + unsigned long addr) > + { > ++ unsigned long flags; > ++ > + /* For one page, it's not worth testing the split_tlb variable */ > + > + mb(); > + mtsp(vma->vm_mm->context,1); > +- purge_tlb_start(); > ++ purge_tlb_start(flags); > + pdtlb(addr); > + pitlb(addr); > +- purge_tlb_end(); > ++ purge_tlb_end(flags); > + } > + > + void __flush_tlb_range(unsigned long sid, > +diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c > +index 837530e..43546de 100644 > +--- a/arch/parisc/kernel/cache.c > ++++ b/arch/parisc/kernel/cache.c > +@@ -398,12 +398,13 @@ EXPORT_SYMBOL(flush_kernel_icache_range_asm); > + > + void clear_user_page_asm(void *page, unsigned long vaddr) > + { > ++ unsigned long flags; > + /* This function is implemented in assembly in pacache.S */ > + extern void __clear_user_page_asm(void *page, unsigned long vaddr); > + > +- purge_tlb_start(); > ++ purge_tlb_start(flags); > + __clear_user_page_asm(page, vaddr); > +- purge_tlb_end(); > ++ purge_tlb_end(flags); > + } > + > + #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */ > +@@ -444,20 +445,24 @@ extern void clear_user_page_asm(void *page, unsigned > long vaddr); > + > + void clear_user_page(void *page, unsigned long vaddr, struct page *pg) > + { > ++ unsigned long flags; > ++ > + purge_kernel_dcache_page((unsigned long)page); > +- purge_tlb_start(); > ++ purge_tlb_start(flags); > + pdtlb_kernel(page); > +- purge_tlb_end(); > ++ purge_tlb_end(flags); > + clear_user_page_asm(page, vaddr); > + } > + EXPORT_SYMBOL(clear_user_page); > + > + void flush_kernel_dcache_page_addr(void *addr) > + { > ++ unsigned long flags; > ++ > + flush_kernel_dcache_page_asm(addr); > +- purge_tlb_start(); > ++ purge_tlb_start(flags); > + pdtlb_kernel(addr); > +- purge_tlb_end(); > ++ purge_tlb_end(flags); > + } > + EXPORT_SYMBOL(flush_kernel_dcache_page_addr); > + > +@@ -490,8 +495,10 @@ void __flush_tlb_range(unsigned long sid, unsigned long > start, > + if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ > + flush_tlb_all(); > + else { > ++ unsigned long flags; > ++ > + mtsp(sid, 1); > +- purge_tlb_start(); > ++ purge_tlb_start(flags); > + if (split_tlb) { > + while (npages--) { > + pdtlb(start); > +@@ -504,7 +511,7 @@ void __flush_tlb_range(unsigned long sid, unsigned long > start, > + start += PAGE_SIZE; > + } > + } > +- purge_tlb_end(); > ++ purge_tlb_end(flags); > + } > + } > + > +diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c > +index 7d927ea..c07f618 100644 > +--- a/arch/parisc/kernel/pci-dma.c > ++++ b/arch/parisc/kernel/pci-dma.c > +@@ -90,12 +90,14 @@ static inline int map_pte_uncached(pte_t * pte, > + if (end > PMD_SIZE) > + end = PMD_SIZE; > + do { > ++ unsigned long flags; > ++ > + if (!pte_none(*pte)) > + printk(KERN_ERR "map_pte_uncached: page already > exists\n"); > + set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC)); > +- purge_tlb_start(); > ++ purge_tlb_start(flags); > + pdtlb_kernel(orig_vaddr); > +- purge_tlb_end(); > ++ purge_tlb_end(flags); > + vaddr += PAGE_SIZE; > + orig_vaddr += PAGE_SIZE; > + (*paddr_ptr) += PAGE_SIZE; > +@@ -168,11 +170,13 @@ static inline void unmap_uncached_pte(pmd_t * pmd, > unsigned long vaddr, > + if (end > PMD_SIZE) > + end = PMD_SIZE; > + do { > ++ unsigned long flags; > + pte_t page = *pte; > ++ > + pte_clear(&init_mm, vaddr, pte); > +- purge_tlb_start(); > ++ purge_tlb_start(flags); > + pdtlb_kernel(orig_vaddr); > +- purge_tlb_end(); > ++ purge_tlb_end(flags); > + vaddr += PAGE_SIZE; > + orig_vaddr += PAGE_SIZE; > + pte++; > +diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c > +index 0efc12d..5bd527b 100644 > +--- a/arch/powerpc/sysdev/mpic.c > ++++ b/arch/powerpc/sysdev/mpic.c > +@@ -279,28 +279,29 @@ static void _mpic_map_mmio(struct mpic *mpic, > phys_addr_t phys_addr, > + } > + > + #ifdef CONFIG_PPC_DCR > +-static void _mpic_map_dcr(struct mpic *mpic, struct mpic_reg_bank *rb, > ++static void _mpic_map_dcr(struct mpic *mpic, struct device_node *node, > ++ struct mpic_reg_bank *rb, > + unsigned int offset, unsigned int size) > + { > + const u32 *dbasep; > + > +- dbasep = of_get_property(mpic->irqhost->of_node, "dcr-reg", NULL); > ++ dbasep = of_get_property(node, "dcr-reg", NULL); > + > +- rb->dhost = dcr_map(mpic->irqhost->of_node, *dbasep + offset, size); > ++ rb->dhost = dcr_map(node, *dbasep + offset, size); > + BUG_ON(!DCR_MAP_OK(rb->dhost)); > + } > + > +-static inline void mpic_map(struct mpic *mpic, phys_addr_t phys_addr, > +- struct mpic_reg_bank *rb, unsigned int offset, > +- unsigned int size) > ++static inline void mpic_map(struct mpic *mpic, struct device_node *node, > ++ phys_addr_t phys_addr, struct mpic_reg_bank *rb, > ++ unsigned int offset, unsigned int size) > + { > + if (mpic->flags & MPIC_USES_DCR) > +- _mpic_map_dcr(mpic, rb, offset, size); > ++ _mpic_map_dcr(mpic, node, rb, offset, size); > + else > + _mpic_map_mmio(mpic, phys_addr, rb, offset, size); > + } > + #else /* CONFIG_PPC_DCR */ > +-#define mpic_map(m,p,b,o,s) _mpic_map_mmio(m,p,b,o,s) > ++#define mpic_map(m,n,p,b,o,s) _mpic_map_mmio(m,p,b,o,s) > + #endif /* !CONFIG_PPC_DCR */ > + > + > +@@ -1150,8 +1151,8 @@ struct mpic * __init mpic_alloc(struct device_node > *node, > + } > + > + /* Map the global registers */ > +- mpic_map(mpic, paddr, &mpic->gregs, MPIC_INFO(GREG_BASE), 0x1000); > +- mpic_map(mpic, paddr, &mpic->tmregs, MPIC_INFO(TIMER_BASE), 0x1000); > ++ mpic_map(mpic, node, paddr, &mpic->gregs, MPIC_INFO(GREG_BASE), 0x1000); > ++ mpic_map(mpic, node, paddr, &mpic->tmregs, MPIC_INFO(TIMER_BASE), > 0x1000); > + > + /* Reset */ > + if (flags & MPIC_WANTS_RESET) { > +@@ -1192,7 +1193,7 @@ struct mpic * __init mpic_alloc(struct device_node > *node, > + > + /* Map the per-CPU registers */ > + for (i = 0; i < mpic->num_cpus; i++) { > +- mpic_map(mpic, paddr, &mpic->cpuregs[i], > ++ mpic_map(mpic, node, paddr, &mpic->cpuregs[i], > + MPIC_INFO(CPU_BASE) + i * MPIC_INFO(CPU_STRIDE), > + 0x1000); > + } > +@@ -1200,7 +1201,7 @@ struct mpic * __init mpic_alloc(struct device_node > *node, > + /* Initialize main ISU if none provided */ > + if (mpic->isu_size == 0) { > + mpic->isu_size = mpic->num_sources; > +- mpic_map(mpic, paddr, &mpic->isus[0], > ++ mpic_map(mpic, node, paddr, &mpic->isus[0], > + MPIC_INFO(IRQ_BASE), MPIC_INFO(IRQ_STRIDE) * > mpic->isu_size); > + } > + mpic->isu_shift = 1 + __ilog2(mpic->isu_size - 1); > +@@ -1254,8 +1255,10 @@ void __init mpic_assign_isu(struct mpic *mpic, > unsigned int isu_num, > + > + BUG_ON(isu_num >= MPIC_MAX_ISU); > + > +- mpic_map(mpic, paddr, &mpic->isus[isu_num], 0, > ++ mpic_map(mpic, mpic->irqhost->of_node, > ++ paddr, &mpic->isus[isu_num], 0, > + MPIC_INFO(IRQ_STRIDE) * mpic->isu_size); > ++ > + if ((isu_first + mpic->isu_size) > mpic->num_sources) > + mpic->num_sources = isu_first + mpic->isu_size; > + } > +diff --git a/arch/x86/boot/video-vga.c b/arch/x86/boot/video-vga.c > +index 9e0587a..2fd19e6 100644 > +--- a/arch/x86/boot/video-vga.c > ++++ b/arch/x86/boot/video-vga.c > +@@ -45,8 +45,10 @@ static u8 vga_set_basic_mode(void) > + > + #ifdef CONFIG_VIDEO_400_HACK > + if (adapter >= ADAPTER_VGA) { > ++ ax = 0x1202; > + asm volatile(INT10 > +- : : "a" (0x1202), "b" (0x0030) > ++ : "+a" (ax) > ++ : "b" (0x0030) > + : "ecx", "edx", "esi", "edi"); > + } > + #endif > +@@ -81,44 +83,59 @@ static u8 vga_set_basic_mode(void) > + > + static void vga_set_8font(void) > + { > ++ u16 ax; > ++ > + /* Set 8x8 font - 80x43 on EGA, 80x50 on VGA */ > + > + /* Set 8x8 font */ > +- asm volatile(INT10 : : "a" (0x1112), "b" (0)); > ++ ax = 0x1112; > ++ asm volatile(INT10 : "+a" (ax) : "b" (0)); > + > + /* Use alternate print screen */ > +- asm volatile(INT10 : : "a" (0x1200), "b" (0x20)); > ++ ax = 0x1200; > ++ asm volatile(INT10 : "+a" (ax) : "b" (0x20)); > + > + /* Turn off cursor emulation */ > +- asm volatile(INT10 : : "a" (0x1201), "b" (0x34)); > ++ ax = 0x1201; > ++ asm volatile(INT10 : "+a" (ax) : "b" (0x34)); > + > + /* Cursor is scan lines 6-7 */ > +- asm volatile(INT10 : : "a" (0x0100), "c" (0x0607)); > ++ ax = 0x0100; > ++ asm volatile(INT10 : "+a" (ax) : "c" (0x0607)); > + } > + > + static void vga_set_14font(void) > + { > ++ u16 ax; > ++ > + /* Set 9x14 font - 80x28 on VGA */ > + > + /* Set 9x14 font */ > +- asm volatile(INT10 : : "a" (0x1111), "b" (0)); > ++ ax = 0x1111; > ++ asm volatile(INT10 : "+a" (ax) : "b" (0)); > + > + /* Turn off cursor emulation */ > +- asm volatile(INT10 : : "a" (0x1201), "b" (0x34)); > ++ ax = 0x1201; > ++ asm volatile(INT10 : "+a" (ax) : "b" (0x34)); > + > + /* Cursor is scan lines 11-12 */ > +- asm volatile(INT10 : : "a" (0x0100), "c" (0x0b0c)); > ++ ax = 0x0100; > ++ asm volatile(INT10 : "+a" (ax) : "c" (0x0b0c)); > + } > + > + static void vga_set_80x43(void) > + { > ++ u16 ax; > ++ > + /* Set 80x43 mode on VGA (not EGA) */ > + > + /* Set 350 scans */ > +- asm volatile(INT10 : : "a" (0x1201), "b" (0x30)); > ++ ax = 0x1201; > ++ asm volatile(INT10 : "+a" (ax) : "b" (0x30)); > + > + /* Reset video mode */ > +- asm volatile(INT10 : : "a" (0x0003)); > ++ ax = 0x0003; > ++ asm volatile(INT10 : "+a" (ax)); > + > + vga_set_8font(); > + } > +@@ -225,7 +242,7 @@ static int vga_set_mode(struct mode_info *mode) > + */ > + static int vga_probe(void) > + { > +- u16 ega_bx; > ++ u16 ax, ega_bx; > + > + static const char *card_name[] = { > + "CGA/MDA/HGC", "EGA", "VGA" > +@@ -242,9 +259,10 @@ static int vga_probe(void) > + }; > + u8 vga_flag; > + > ++ ax = 0x1200; > + asm(INT10 > +- : "=b" (ega_bx) > +- : "a" (0x1200), "b" (0x10) /* Check EGA/VGA */ > ++ : "+a" (ax), "=b" (ega_bx) > ++ : "b" (0x10) /* Check EGA/VGA */ > + : "ecx", "edx", "esi", "edi"); > + > + #ifndef _WAKEUP > +diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h > +index 2d81af3..7b2d71d 100644 > +--- a/arch/x86/include/asm/fixmap.h > ++++ b/arch/x86/include/asm/fixmap.h > +@@ -111,12 +111,9 @@ enum fixed_addresses { > + #ifdef CONFIG_PARAVIRT > + FIX_PARAVIRT_BOOTMAP, > + #endif > +- FIX_TEXT_POKE0, /* reserve 2 pages for text_poke() */ > +- FIX_TEXT_POKE1, > ++ FIX_TEXT_POKE1, /* reserve 2 pages for text_poke() */ > ++ FIX_TEXT_POKE0, /* first page is last, because allocation is backward */ > + __end_of_permanent_fixed_addresses, > +-#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT > +- FIX_OHCI1394_BASE, > +-#endif > + /* > + * 256 temporary boot-time mappings, used by early_ioremap(), > + * before ioremap() is functional. > +@@ -129,6 +126,9 @@ enum fixed_addresses { > + FIX_BTMAP_END = __end_of_permanent_fixed_addresses + 256 - > + (__end_of_permanent_fixed_addresses & 255), > + FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1, > ++#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT > ++ FIX_OHCI1394_BASE, > ++#endif > + #ifdef CONFIG_X86_32 > + FIX_WP_TEST, > + #endif > +diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h > +index 9d826e4..667ed7f 100644 > +--- a/arch/x86/include/asm/io_apic.h > ++++ b/arch/x86/include/asm/io_apic.h > +@@ -160,6 +160,7 @@ extern int io_apic_set_pci_routing(int ioapic, int pin, > int irq, > + > + extern int (*ioapic_renumber_irq)(int ioapic, int irq); > + extern void ioapic_init_mappings(void); > ++extern void ioapic_insert_resources(void); > + > + #ifdef CONFIG_X86_64 > + extern struct IO_APIC_route_entry **alloc_ioapic_entries(void); > +@@ -183,6 +184,7 @@ extern void ioapic_write_entry(int apic, int pin, > + #define io_apic_assign_pci_irqs 0 > + static const int timer_through_8259 = 0; > + static inline void ioapic_init_mappings(void) { } > ++static inline void ioapic_insert_resources(void) { } > + > + static inline void probe_nr_irqs_gsi(void) { } > + #endif > +diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h > +index b685ece..02c3fc6 100644 > +--- a/arch/x86/include/asm/uaccess.h > ++++ b/arch/x86/include/asm/uaccess.h > +@@ -212,9 +212,9 @@ extern int __get_user_bad(void); > + : "A" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") > + #else > + #define __put_user_asm_u64(x, ptr, retval, errret) \ > +- __put_user_asm(x, ptr, retval, "q", "", "Zr", errret) > ++ __put_user_asm(x, ptr, retval, "q", "", "er", errret) > + #define __put_user_asm_ex_u64(x, addr) \ > +- __put_user_asm_ex(x, addr, "q", "", "Zr") > ++ __put_user_asm_ex(x, addr, "q", "", "er") > + #define __put_user_x8(x, ptr, __ret_pu) __put_user_x(8, x, ptr, __ret_pu) > + #endif > + > +diff --git a/arch/x86/include/asm/uaccess_64.h > b/arch/x86/include/asm/uaccess_64.h > +index 8cc6873..db24b21 100644 > +--- a/arch/x86/include/asm/uaccess_64.h > ++++ b/arch/x86/include/asm/uaccess_64.h > +@@ -88,11 +88,11 @@ int __copy_to_user(void __user *dst, const void *src, > unsigned size) > + ret, "l", "k", "ir", 4); > + return ret; > + case 8:__put_user_asm(*(u64 *)src, (u64 __user *)dst, > +- ret, "q", "", "ir", 8); > ++ ret, "q", "", "er", 8); > + return ret; > + case 10: > + __put_user_asm(*(u64 *)src, (u64 __user *)dst, > +- ret, "q", "", "ir", 10); > ++ ret, "q", "", "er", 10); > + if (unlikely(ret)) > + return ret; > + asm("":::"memory"); > +@@ -101,12 +101,12 @@ int __copy_to_user(void __user *dst, const void *src, > unsigned size) > + return ret; > + case 16: > + __put_user_asm(*(u64 *)src, (u64 __user *)dst, > +- ret, "q", "", "ir", 16); > ++ ret, "q", "", "er", 16); > + if (unlikely(ret)) > + return ret; > + asm("":::"memory"); > + __put_user_asm(1[(u64 *)src], 1 + (u64 __user *)dst, > +- ret, "q", "", "ir", 8); > ++ ret, "q", "", "er", 8); > + return ret; > + default: > + return copy_user_generic((__force void *)dst, src, size); > +@@ -157,7 +157,7 @@ int __copy_in_user(void __user *dst, const void __user > *src, unsigned size) > + ret, "q", "", "=r", 8); > + if (likely(!ret)) > + __put_user_asm(tmp, (u64 __user *)dst, > +- ret, "q", "", "ir", 8); > ++ ret, "q", "", "er", 8); > + return ret; > + } > + default: > +diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c > +index 30da617..edfc25c 100644 > +--- a/arch/x86/kernel/apic/io_apic.c > ++++ b/arch/x86/kernel/apic/io_apic.c > +@@ -4182,28 +4182,20 @@ fake_ioapic_page: > + } > + } > + > +-static int __init ioapic_insert_resources(void) > ++void __init ioapic_insert_resources(void) > + { > + int i; > + struct resource *r = ioapic_resources; > + > + if (!r) { > +- if (nr_ioapics > 0) { > ++ if (nr_ioapics > 0) > + printk(KERN_ERR > + "IO APIC resources couldn't be allocated.\n"); > +- return -1; > +- } > +- return 0; > ++ return; > + } > + > + for (i = 0; i < nr_ioapics; i++) { > + insert_resource(&iomem_resource, r); > + r++; > + } > +- > +- return 0; > + } > +- > +-/* Insert the IO APIC resources after PCI initialization has occured to > handle > +- * IO APICS that are mapped in on a BAR in PCI space. */ > +-late_initcall(ioapic_insert_resources); > +diff --git a/arch/x86/kernel/mfgpt_32.c b/arch/x86/kernel/mfgpt_32.c > +index 846510b..2a62d84 100644 > +--- a/arch/x86/kernel/mfgpt_32.c > ++++ b/arch/x86/kernel/mfgpt_32.c > +@@ -347,7 +347,7 @@ static irqreturn_t mfgpt_tick(int irq, void *dev_id) > + > + static struct irqaction mfgptirq = { > + .handler = mfgpt_tick, > +- .flags = IRQF_DISABLED | IRQF_NOBALANCING, > ++ .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER, > + .name = "mfgpt-timer" > + }; > + > +diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c > +index 0acc6a7..771ffd0 100644 > +--- a/arch/x86/kernel/setup.c > ++++ b/arch/x86/kernel/setup.c > +@@ -650,6 +650,19 @@ static struct dmi_system_id __initdata > bad_bios_dmi_table[] = { > + DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"), > + }, > + }, > ++ { > ++ /* > ++ * AMI BIOS with low memory corruption was found on Intel DG45ID board. > ++ * It hase different DMI_BIOS_VENDOR = "Intel Corp.", for now we will > ++ * match only DMI_BOARD_NAME and see if there is more bad products > ++ * with this vendor. > ++ */ > ++ .callback = dmi_low_memory_corruption, > ++ .ident = "AMI BIOS", > ++ .matches = { > ++ DMI_MATCH(DMI_BOARD_NAME, "DG45ID"), > ++ }, > ++ }, > + #endif > + {} > + }; > +diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c > +index 6340cef..312e8eb 100644 > +--- a/arch/x86/mm/gup.c > ++++ b/arch/x86/mm/gup.c > +@@ -247,10 +247,15 @@ int get_user_pages_fast(unsigned long start, int > nr_pages, int write, > + start &= PAGE_MASK; > + addr = start; > + len = (unsigned long) nr_pages << PAGE_SHIFT; > ++ > + end = start + len; > +- if (unlikely(!access_ok(write ? VERIFY_WRITE : VERIFY_READ, > +- (void __user *)start, len))) > ++ if (end < start) > ++ goto slow_irqon; > ++ > ++#ifdef CONFIG_X86_64 > ++ if (end >> 47) > + goto slow_irqon; > ++#endif > + > + /* > + * XXX: batch / limit 'nr', to avoid large irq off latency > +diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c > +index 0176595..c5c43e0 100644 > +--- a/arch/x86/mm/srat_64.c > ++++ b/arch/x86/mm/srat_64.c > +@@ -89,8 +89,10 @@ static __init void bad_srat(void) > + found_add_area = 0; > + for (i = 0; i < MAX_LOCAL_APIC; i++) > + apicid_to_node[i] = NUMA_NO_NODE; > +- for (i = 0; i < MAX_NUMNODES; i++) > +- nodes_add[i].start = nodes[i].end = 0; > ++ for (i = 0; i < MAX_NUMNODES; i++) { > ++ nodes[i].start = nodes[i].end = 0; > ++ nodes_add[i].start = nodes_add[i].end = 0; > ++ } > + remove_all_active_ranges(); > + } > + > +diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c > +index a85bef2..6dcebb5 100644 > +--- a/arch/x86/pci/i386.c > ++++ b/arch/x86/pci/i386.c > +@@ -35,6 +35,7 @@ > + #include <asm/pat.h> > + #include <asm/e820.h> > + #include <asm/pci_x86.h> > ++#include <asm/io_apic.h> > + > + > + static int > +@@ -230,6 +231,12 @@ void __init pcibios_resource_survey(void) > + pcibios_allocate_resources(1); > + > + e820_reserve_resources_late(); > ++ /* > ++ * Insert the IO APIC resources after PCI initialization has > ++ * occured to handle IO APICS that are mapped in on a BAR in > ++ * PCI space, but before trying to assign unassigned pci res. > ++ */ > ++ ioapic_insert_resources(); > + } > + > + /** > +diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c > +index 94919ad..d37808b 100644 > +--- a/drivers/ata/libata-eh.c > ++++ b/drivers/ata/libata-eh.c > +@@ -2517,6 +2517,10 @@ int ata_eh_reset(struct ata_link *link, int classify, > + > + ata_eh_about_to_do(link, NULL, ATA_EH_RESET); > + rc = ata_do_reset(link, reset, classes, deadline, true); > ++ if (rc) { > ++ failed_link = link; > ++ goto fail; > ++ } > + } > + } else { > + if (verbose) > +diff --git a/drivers/char/vc_screen.c b/drivers/char/vc_screen.c > +index d94d25c..c1791a6 100644 > +--- a/drivers/char/vc_screen.c > ++++ b/drivers/char/vc_screen.c > +@@ -495,11 +495,15 @@ void vcs_remove_sysfs(int index) > + > + int __init vcs_init(void) > + { > ++ unsigned int i; > ++ > + if (register_chrdev(VCS_MAJOR, "vcs", &vcs_fops)) > + panic("unable to get major %d for vcs device", VCS_MAJOR); > + vc_class = class_create(THIS_MODULE, "vc"); > + > + device_create(vc_class, NULL, MKDEV(VCS_MAJOR, 0), NULL, "vcs"); > + device_create(vc_class, NULL, MKDEV(VCS_MAJOR, 128), NULL, "vcsa"); > ++ for (i = 0; i < MIN_NR_CONSOLES; i++) > ++ vcs_make_sysfs(i); > + return 0; > + } > +diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c > +index e9b436d..39e27f4 100644 > +--- a/drivers/hid/usbhid/hiddev.c > ++++ b/drivers/hid/usbhid/hiddev.c > +@@ -527,8 +527,10 @@ static noinline int hiddev_ioctl_usage(struct hiddev > *hiddev, unsigned int cmd, > + goto goodreturn; > + > + case HIDIOCGCOLLECTIONINDEX: > ++ i = field->usage[uref->usage_index].collection_index; > ++ unlock_kernel(); > + kfree(uref_multi); > +- return field->usage[uref->usage_index].collection_index; > ++ return i; > + case HIDIOCGUSAGES: > + for (i = 0; i < uref_multi->num_values; i++) > + uref_multi->values[i] = > +diff --git a/drivers/hwmon/max6650.c b/drivers/hwmon/max6650.c > +index f27af6a..65cf25f 100644 > +--- a/drivers/hwmon/max6650.c > ++++ b/drivers/hwmon/max6650.c > +@@ -407,6 +407,7 @@ static ssize_t set_div(struct device *dev, struct > device_attribute *devattr, > + data->count = 3; > + break; > + default: > ++ mutex_unlock(&data->update_lock); > + dev_err(&client->dev, > + "illegal value for fan divider (%d)\n", div); > + return -EINVAL; > +diff --git a/drivers/input/misc/wistron_btns.c > b/drivers/input/misc/wistron_btns.c > +index 7c8957d..26e17a9 100644 > +--- a/drivers/input/misc/wistron_btns.c > ++++ b/drivers/input/misc/wistron_btns.c > +@@ -646,6 +646,15 @@ static struct dmi_system_id dmi_ids[] __initdata = { > + }, > + { > + .callback = dmi_matched, > ++ .ident = "Maxdata Pro 7000 DX", > ++ .matches = { > ++ DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"), > ++ DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"), > ++ }, > ++ .driver_data = keymap_fs_amilo_pro_v2000 > ++ }, > ++ { > ++ .callback = dmi_matched, > + .ident = "Fujitsu N3510", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), > +diff --git a/drivers/isdn/gigaset/ev-layer.c > b/drivers/isdn/gigaset/ev-layer.c > +index e582a48..42f1a82 100644 > +--- a/drivers/isdn/gigaset/ev-layer.c > ++++ b/drivers/isdn/gigaset/ev-layer.c > +@@ -294,32 +294,33 @@ struct reply_t gigaset_tab_cid_m10x[] = /* for M10x */ > + {RSP_OK, 604,604, -1, 605, 5, {ACT_CMD+AT_MSN}}, > + {RSP_OK, 605,605, -1, 606, 5, {ACT_CMD+AT_ISO}}, > + {RSP_NULL, 605,605, -1, 606, 5, {ACT_CMD+AT_ISO}}, > +- {RSP_OK, 606,606, -1, 607, 5, {0}, > "+VLS=17\r"}, /* set "Endgeraetemodus" */ > ++ {RSP_OK, 606,606, -1, 607, 5, {0}, "+VLS=17\r"}, > + {RSP_OK, 607,607, -1, 608,-1}, > +- //{RSP_ZSAU, 608,608,ZSAU_PROCEEDING, 608, 0, > {ACT_ERROR}},//DELETE > + {RSP_ZSAU, 608,608,ZSAU_PROCEEDING, 609, 5, {ACT_CMD+AT_DIAL}}, > + {RSP_OK, 609,609, -1, 650, 0, {ACT_DIALING}}, > + > +- {RSP_ZVLS, 608,608, 17, -1,-1, {ACT_DEBUG}}, > +- {RSP_ZCTP, 609,609, -1, -1,-1, {ACT_DEBUG}}, > +- {RSP_ZCPN, 609,609, -1, -1,-1, {ACT_DEBUG}}, > + {RSP_ERROR, 601,609, -1, 0, 0, {ACT_ABORTDIAL}}, > + {EV_TIMEOUT, 601,609, -1, 0, 0, {ACT_ABORTDIAL}}, > + > +- /* dialing */ > +- {RSP_ZCTP, 650,650, -1, -1,-1, {ACT_DEBUG}}, > +- {RSP_ZCPN, 650,650, -1, -1,-1, {ACT_DEBUG}}, > +- {RSP_ZSAU, 650,650,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}}, /* some > devices don't send this */ > +- > +- /* connection established */ > +- {RSP_ZSAU, 650,650,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT}}, > //FIXME -> DLE1 > +- {RSP_ZSAU, 750,750,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT}}, > //FIXME -> DLE1 > +- > +- {EV_BC_OPEN, 800,800, -1, 800,-1, {ACT_NOTIFY_BC_UP}}, > //FIXME new constate + timeout > ++ /* optional dialing responses */ > ++ {EV_BC_OPEN, 650,650, -1, 651,-1}, > ++ {RSP_ZVLS, 608,651, 17, -1,-1, {ACT_DEBUG}}, > ++ {RSP_ZCTP, 609,651, -1, -1,-1, {ACT_DEBUG}}, > ++ {RSP_ZCPN, 609,651, -1, -1,-1, {ACT_DEBUG}}, > ++ {RSP_ZSAU, 650,651,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}}, > ++ > ++ /* connect */ > ++ {RSP_ZSAU, 650,650,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT}}, > ++ {RSP_ZSAU, 651,651,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT, > ++ ACT_NOTIFY_BC_UP}}, > ++ {RSP_ZSAU, 750,750,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT}}, > ++ {RSP_ZSAU, 751,751,ZSAU_ACTIVE, 800,-1, {ACT_CONNECT, > ++ ACT_NOTIFY_BC_UP}}, > ++ {EV_BC_OPEN, 800,800, -1, 800,-1, {ACT_NOTIFY_BC_UP}}, > + > + /* remote hangup */ > +- {RSP_ZSAU, 650,650,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEREJECT}}, > +- {RSP_ZSAU, 750,750,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEHUP}}, > ++ {RSP_ZSAU, 650,651,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEREJECT}}, > ++ {RSP_ZSAU, 750,751,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEHUP}}, > + {RSP_ZSAU, 800,800,ZSAU_DISCONNECT_IND, 0, 0, {ACT_REMOTEHUP}}, > + > + /* hangup */ > +@@ -358,7 +359,8 @@ struct reply_t gigaset_tab_cid_m10x[] = /* for M10x */ > + {RSP_ZSAU, 700,729,ZSAU_ACTIVE, 0, 0, {ACT_ABORTACCEPT}}, > + {RSP_ZSAU, 700,729,ZSAU_DISCONNECT_IND, 0, 0, {ACT_ABORTACCEPT}}, > + > +- {EV_TIMEOUT, 750,750, -1, 0, 0, {ACT_CONNTIMEOUT}}, > ++ {EV_BC_OPEN, 750,750, -1, 751,-1}, > ++ {EV_TIMEOUT, 750,751, -1, 0, 0, {ACT_CONNTIMEOUT}}, > + > + /* B channel closed (general case) */ > + {EV_BC_CLOSED, -1, -1, -1, -1,-1, > {ACT_NOTIFY_BC_DOWN}}, //FIXME > +@@ -876,12 +878,6 @@ static void bchannel_down(struct bc_state *bcs) > + > + static void bchannel_up(struct bc_state *bcs) > + { > +- if (!(bcs->chstate & CHS_D_UP)) { > +- dev_notice(bcs->cs->dev, "%s: D channel not up\n", __func__); > +- bcs->chstate |= CHS_D_UP; > +- gigaset_i4l_channel_cmd(bcs, ISDN_STAT_DCONN); > +- } > +- > + if (bcs->chstate & CHS_B_UP) { > + dev_notice(bcs->cs->dev, "%s: B channel already up\n", > + __func__); > +diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c > +index 076fbb4..d8d31b8 100644 > +--- a/drivers/md/dm-raid1.c > ++++ b/drivers/md/dm-raid1.c > +@@ -638,6 +638,7 @@ static void do_writes(struct mirror_set *ms, struct > bio_list *writes) > + spin_lock_irq(&ms->lock); > + bio_list_merge(&ms->writes, &requeue); > + spin_unlock_irq(&ms->lock); > ++ delayed_wake(ms); > + } > + > + /* > +diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c > +index b56d72f..34e2348 100644 > +--- a/drivers/mmc/host/mvsdio.c > ++++ b/drivers/mmc/host/mvsdio.c > +@@ -384,7 +384,7 @@ static irqreturn_t mvsd_irq(int irq, void *dev) > + u16 val[2] = {0, 0}; > + val[0] = mvsd_read(MVSD_FIFO); > + val[1] = mvsd_read(MVSD_FIFO); > +- memcpy(p, &val, s); > ++ memcpy(p, ((void *)&val) + 4 - s, s); > + s = 0; > + intr_status = mvsd_read(MVSD_NOR_INTR_STATUS); > + } > +@@ -423,7 +423,7 @@ static irqreturn_t mvsd_irq(int irq, void *dev) > + if (s < 4) { > + if (s && (intr_status & MVSD_NOR_TX_AVAIL)) { > + u16 val[2] = {0, 0}; > +- memcpy(&val, p, s); > ++ memcpy(((void *)&val) + 4 - s, p, s); > + mvsd_write(MVSD_FIFO, val[0]); > + mvsd_write(MVSD_FIFO, val[1]); > + s = 0; > +diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c > +index 1fc4543..d35cf5b 100644 > +--- a/drivers/net/8139too.c > ++++ b/drivers/net/8139too.c > +@@ -917,6 +917,7 @@ static const struct net_device_ops rtl8139_netdev_ops = { > + .ndo_open = rtl8139_open, > + .ndo_stop = rtl8139_close, > + .ndo_get_stats = rtl8139_get_stats, > ++ .ndo_change_mtu = eth_change_mtu, > + .ndo_validate_addr = eth_validate_addr, > + .ndo_set_mac_address = rtl8139_set_mac_address, > + .ndo_start_xmit = rtl8139_start_xmit, > +diff --git a/drivers/net/arm/ixp4xx_eth.c b/drivers/net/arm/ixp4xx_eth.c > +index a740053..25aef09 100644 > +--- a/drivers/net/arm/ixp4xx_eth.c > ++++ b/drivers/net/arm/ixp4xx_eth.c > +@@ -1140,7 +1140,9 @@ static const struct net_device_ops ixp4xx_netdev_ops = > { > + .ndo_start_xmit = eth_xmit, > + .ndo_set_multicast_list = eth_set_mcast_list, > + .ndo_do_ioctl = eth_ioctl, > +- > ++ .ndo_change_mtu = eth_change_mtu, > ++ .ndo_set_mac_address = eth_mac_addr, > ++ .ndo_validate_addr = eth_validate_addr, > + }; > + > + static int __devinit eth_init_one(struct platform_device *pdev) > +diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c > +index b22dab9..0a7a288 100644 > +--- a/drivers/net/ehea/ehea_main.c > ++++ b/drivers/net/ehea/ehea_main.c > +@@ -3080,7 +3080,9 @@ static const struct net_device_ops ehea_netdev_ops = { > + .ndo_poll_controller = ehea_netpoll, > + #endif > + .ndo_get_stats = ehea_get_stats, > ++ .ndo_change_mtu = eth_change_mtu, > + .ndo_set_mac_address = ehea_set_mac_addr, > ++ .ndo_validate_addr = eth_validate_addr, > + .ndo_set_multicast_list = ehea_set_multicast_list, > + .ndo_change_mtu = ehea_change_mtu, > + .ndo_vlan_rx_register = ehea_vlan_rx_register, > +diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c > +index a051918..d8b2649 100644 > +--- a/drivers/net/gianfar.c > ++++ b/drivers/net/gianfar.c > +@@ -155,6 +155,8 @@ static const struct net_device_ops gfar_netdev_ops = { > + .ndo_tx_timeout = gfar_timeout, > + .ndo_do_ioctl = gfar_ioctl, > + .ndo_vlan_rx_register = gfar_vlan_rx_register, > ++ .ndo_set_mac_address = eth_mac_addr, > ++ .ndo_validate_addr = eth_validate_addr, > + #ifdef CONFIG_NET_POLL_CONTROLLER > + .ndo_poll_controller = gfar_netpoll, > + #endif > +diff --git a/drivers/net/plip.c b/drivers/net/plip.c > +index 0be0f0b..5e2d89d 100644 > +--- a/drivers/net/plip.c > ++++ b/drivers/net/plip.c > +@@ -270,6 +270,9 @@ static const struct net_device_ops plip_netdev_ops = { > + .ndo_stop = plip_close, > + .ndo_start_xmit = plip_tx_packet, > + .ndo_do_ioctl = plip_ioctl, > ++ .ndo_change_mtu = eth_change_mtu, > ++ .ndo_set_mac_address = eth_mac_addr, > ++ .ndo_validate_addr = eth_validate_addr, > + }; > + > + /* Entry point of PLIP driver. > +diff --git a/drivers/net/ps3_gelic_net.c b/drivers/net/ps3_gelic_net.c > +index 30900b3..34c53c6 100644 > +--- a/drivers/net/ps3_gelic_net.c > ++++ b/drivers/net/ps3_gelic_net.c > +@@ -1410,6 +1410,7 @@ static const struct net_device_ops gelic_netdevice_ops > = { > + .ndo_set_multicast_list = gelic_net_set_multi, > + .ndo_change_mtu = gelic_net_change_mtu, > + .ndo_tx_timeout = gelic_net_tx_timeout, > ++ .ndo_set_mac_address = eth_mac_addr, > + .ndo_validate_addr = eth_validate_addr, > + #ifdef CONFIG_NET_POLL_CONTROLLER > + .ndo_poll_controller = gelic_net_poll_controller, > +diff --git a/drivers/net/ps3_gelic_wireless.c > b/drivers/net/ps3_gelic_wireless.c > +index 4f3ada6..4530126 100644 > +--- a/drivers/net/ps3_gelic_wireless.c > ++++ b/drivers/net/ps3_gelic_wireless.c > +@@ -2707,6 +2707,7 @@ static const struct net_device_ops > gelic_wl_netdevice_ops = { > + .ndo_set_multicast_list = gelic_net_set_multi, > + .ndo_change_mtu = gelic_net_change_mtu, > + .ndo_tx_timeout = gelic_net_tx_timeout, > ++ .ndo_set_mac_address = eth_mac_addr, > + .ndo_validate_addr = eth_validate_addr, > + #ifdef CONFIG_NET_POLL_CONTROLLER > + .ndo_poll_controller = gelic_net_poll_controller, > +diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c > +index fdcbaf8..1c70e99 100644 > +--- a/drivers/net/smc91x.c > ++++ b/drivers/net/smc91x.c > +@@ -1774,6 +1774,7 @@ static const struct net_device_ops smc_netdev_ops = { > + .ndo_start_xmit = smc_hard_start_xmit, > + .ndo_tx_timeout = smc_timeout, > + .ndo_set_multicast_list = smc_set_multicast_list, > ++ .ndo_change_mtu = eth_change_mtu, > + .ndo_validate_addr = eth_validate_addr, > + .ndo_set_mac_address = eth_mac_addr, > + #ifdef CONFIG_NET_POLL_CONTROLLER > +diff --git a/drivers/net/smsc911x.c b/drivers/net/smsc911x.c > +index eb7db03..b4e2685 100644 > +--- a/drivers/net/smsc911x.c > ++++ b/drivers/net/smsc911x.c > +@@ -1766,6 +1766,7 @@ static const struct net_device_ops smsc911x_netdev_ops > = { > + .ndo_get_stats = smsc911x_get_stats, > + .ndo_set_multicast_list = smsc911x_set_multicast_list, > + .ndo_do_ioctl = smsc911x_do_ioctl, > ++ .ndo_change_mtu = eth_change_mtu, > + .ndo_validate_addr = eth_validate_addr, > + .ndo_set_mac_address = smsc911x_set_mac_address, > + #ifdef CONFIG_NET_POLL_CONTROLLER > +diff --git a/drivers/net/sunvnet.c b/drivers/net/sunvnet.c > +index a82fb2a..f1e5e45 100644 > +--- a/drivers/net/sunvnet.c > ++++ b/drivers/net/sunvnet.c > +@@ -1016,7 +1016,9 @@ static const struct net_device_ops vnet_ops = { > + .ndo_open = vnet_open, > + .ndo_stop = vnet_close, > + .ndo_set_multicast_list = vnet_set_rx_mode, > ++ .ndo_change_mtu = eth_change_mtu, > + .ndo_set_mac_address = vnet_set_mac_addr, > ++ .ndo_validate_addr = eth_validate_addr, > + .ndo_tx_timeout = vnet_tx_timeout, > + .ndo_change_mtu = vnet_change_mtu, > + .ndo_start_xmit = vnet_start_xmit, > +diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c > +index 3d0d0b0..d837cf1 100644 > +--- a/drivers/net/usb/kaweth.c > ++++ b/drivers/net/usb/kaweth.c > +@@ -982,6 +982,9 @@ static const struct net_device_ops kaweth_netdev_ops = { > + .ndo_tx_timeout = kaweth_tx_timeout, > + .ndo_set_multicast_list = kaweth_set_rx_mode, > + .ndo_get_stats = kaweth_netdev_stats, > ++ .ndo_change_mtu = eth_change_mtu, > ++ .ndo_set_mac_address = eth_mac_addr, > ++ .ndo_validate_addr = eth_validate_addr, > + }; > + > + static int kaweth_probe( > +diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c > +index 73acbd2..631d269 100644 > +--- a/drivers/net/usb/pegasus.c > ++++ b/drivers/net/usb/pegasus.c > +@@ -1493,6 +1493,9 @@ static const struct net_device_ops pegasus_netdev_ops > = { > + .ndo_set_multicast_list = pegasus_set_multicast, > + .ndo_get_stats = pegasus_netdev_stats, > + .ndo_tx_timeout = pegasus_tx_timeout, > ++ .ndo_change_mtu = eth_change_mtu, > ++ .ndo_set_mac_address = eth_mac_addr, > ++ .ndo_validate_addr = eth_validate_addr, > + }; > + > + static struct usb_driver pegasus_driver = { > +diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c > +index 45daba7..9d49497 100644 > +--- a/drivers/net/via-rhine.c > ++++ b/drivers/net/via-rhine.c > +@@ -622,6 +622,7 @@ static const struct net_device_ops rhine_netdev_ops = { > + .ndo_start_xmit = rhine_start_tx, > + .ndo_get_stats = rhine_get_stats, > + .ndo_set_multicast_list = rhine_set_rx_mode, > ++ .ndo_change_mtu = eth_change_mtu, > + .ndo_validate_addr = eth_validate_addr, > + .ndo_set_mac_address = eth_mac_addr, > + .ndo_do_ioctl = netdev_ioctl, > +diff --git a/drivers/net/wireless/orinoco/main.c > b/drivers/net/wireless/orinoco/main.c > +index 345593c..a370e51 100644 > +--- a/drivers/net/wireless/orinoco/main.c > ++++ b/drivers/net/wireless/orinoco/main.c > +@@ -2521,6 +2521,8 @@ static const struct net_device_ops orinoco_netdev_ops > = { > + .ndo_start_xmit = orinoco_xmit, > + .ndo_set_multicast_list = orinoco_set_multicast_list, > + .ndo_change_mtu = orinoco_change_mtu, > ++ .ndo_set_mac_address = eth_mac_addr, > ++ .ndo_validate_addr = eth_validate_addr, > + .ndo_tx_timeout = orinoco_tx_timeout, > + .ndo_get_stats = orinoco_get_stats, > + }; > +@@ -2555,7 +2557,6 @@ struct net_device > + priv->wireless_data.spy_data = &priv->spy_data; > + dev->wireless_data = &priv->wireless_data; > + #endif > +- /* we use the default eth_mac_addr for setting the MAC addr */ > + > + /* Reserve space in skb for the SNAP header */ > + dev->hard_header_len += ENCAPS_OVERHEAD; > +diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c > +index e1716f1..ff63279 100644 > +--- a/drivers/scsi/sg.c > ++++ b/drivers/scsi/sg.c > +@@ -1656,6 +1656,10 @@ static int sg_start_req(Sg_request *srp, unsigned > char *cmd) > + md->nr_entries = req_schp->k_use_sg; > + md->offset = 0; > + md->null_mapped = hp->dxferp ? 0 : 1; > ++ if (dxfer_dir == SG_DXFER_TO_FROM_DEV) > ++ md->from_user = 1; > ++ else > ++ md->from_user = 0; > + } > + > + if (iov_count) { > +diff --git a/drivers/scsi/zalon.c b/drivers/scsi/zalon.c > +index 97f3158..27e84e4 100644 > +--- a/drivers/scsi/zalon.c > ++++ b/drivers/scsi/zalon.c > +@@ -134,7 +134,7 @@ zalon_probe(struct parisc_device *dev) > + > + host = ncr_attach(&zalon7xx_template, unit, &device); > + if (!host) > +- goto fail; > ++ return -ENODEV; > + > + if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) { > + dev_printk(KERN_ERR, &dev->dev, "irq problem with %d, detaching\n ", > +diff --git a/drivers/staging/rt2870/rt2870.h > b/drivers/staging/rt2870/rt2870.h > +index a69cf33..fef14a4 100644 > +--- a/drivers/staging/rt2870/rt2870.h > ++++ b/drivers/staging/rt2870/rt2870.h > +@@ -97,6 +97,7 @@ > + {USB_DEVICE(0x0DF6,0x002C)}, /* Sitecom */ \ > + {USB_DEVICE(0x0DF6,0x002D)}, /* Sitecom */ \ > + {USB_DEVICE(0x0DF6,0x0039)}, /* Sitecom */ \ > ++ {USB_DEVICE(0x0DF6,0x003F)}, /* Sitecom WL-608 */ \ > + {USB_DEVICE(0x14B2,0x3C06)}, /* Conceptronic */ \ > + {USB_DEVICE(0x14B2,0x3C28)}, /* Conceptronic */ \ > + {USB_DEVICE(0x2019,0xED06)}, /* Planex Communications, Inc. */ > \ > +diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac_wx.c > b/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac_wx.c > +index 93af37e..54b4b71 100644 > +--- a/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac_wx.c > ++++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac_wx.c > +@@ -461,19 +461,19 @@ int ieee80211_wx_get_name(struct ieee80211_device > *ieee, > + struct iw_request_info *info, > + union iwreq_data *wrqu, char *extra) > + { > +- strcpy(wrqu->name, "802.11"); > ++ strlcpy(wrqu->name, "802.11", IFNAMSIZ); > + if(ieee->modulation & IEEE80211_CCK_MODULATION){ > +- strcat(wrqu->name, "b"); > ++ strlcat(wrqu->name, "b", IFNAMSIZ); > + if(ieee->modulation & IEEE80211_OFDM_MODULATION) > +- strcat(wrqu->name, "/g"); > ++ strlcat(wrqu->name, "/g", IFNAMSIZ); > + }else if(ieee->modulation & IEEE80211_OFDM_MODULATION) > +- strcat(wrqu->name, "g"); > ++ strlcat(wrqu->name, "g", IFNAMSIZ); > + > + if((ieee->state == IEEE80211_LINKED) || > + (ieee->state == IEEE80211_LINKED_SCANNING)) > +- strcat(wrqu->name," linked"); > ++ strlcat(wrqu->name," link", IFNAMSIZ); > + else if(ieee->state != IEEE80211_NOLINK) > +- strcat(wrqu->name," link.."); > ++ strlcat(wrqu->name," .....", IFNAMSIZ); > + > + > + return 0; > +diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c > +index 3086090..ef03927 100644 > +--- a/drivers/usb/core/devio.c > ++++ b/drivers/usb/core/devio.c > +@@ -982,7 +982,7 @@ static int proc_do_submiturb(struct dev_state *ps, > struct usbdevfs_urb *uurb, > + USBDEVFS_URB_ZERO_PACKET | > + USBDEVFS_URB_NO_INTERRUPT)) > + return -EINVAL; > +- if (!uurb->buffer) > ++ if (uurb->buffer_length > 0 && !uurb->buffer) > + return -EINVAL; > + if (!(uurb->type == USBDEVFS_URB_TYPE_CONTROL && > + (uurb->endpoint & ~USB_ENDPOINT_DIR_MASK) == 0)) { > +@@ -1038,11 +1038,6 @@ static int proc_do_submiturb(struct dev_state *ps, > struct usbdevfs_urb *uurb, > + is_in = 0; > + uurb->endpoint &= ~USB_DIR_IN; > + } > +- if (!access_ok(is_in ? VERIFY_WRITE : VERIFY_READ, > +- uurb->buffer, uurb->buffer_length)) { > +- kfree(dr); > +- return -EFAULT; > +- } > + snoop(&ps->dev->dev, "control urb: bRequest=%02x " > + "bRrequestType=%02x wValue=%04x " > + "wIndex=%04x wLength=%04x\n", > +@@ -1062,9 +1057,6 @@ static int proc_do_submiturb(struct dev_state *ps, > struct usbdevfs_urb *uurb, > + uurb->number_of_packets = 0; > + if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE) > + return -EINVAL; > +- if (!access_ok(is_in ? VERIFY_WRITE : VERIFY_READ, > +- uurb->buffer, uurb->buffer_length)) > +- return -EFAULT; > + snoop(&ps->dev->dev, "bulk urb\n"); > + break; > + > +@@ -1106,28 +1098,35 @@ static int proc_do_submiturb(struct dev_state *ps, > struct usbdevfs_urb *uurb, > + return -EINVAL; > + if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE) > + return -EINVAL; > +- if (!access_ok(is_in ? VERIFY_WRITE : VERIFY_READ, > +- uurb->buffer, uurb->buffer_length)) > +- return -EFAULT; > + snoop(&ps->dev->dev, "interrupt urb\n"); > + break; > + > + default: > + return -EINVAL; > + } > +- as = alloc_async(uurb->number_of_packets); > +- if (!as) { > ++ if (uurb->buffer_length > 0 && > ++ !access_ok(is_in ? VERIFY_WRITE : VERIFY_READ, > ++ uurb->buffer, uurb->buffer_length)) { > + kfree(isopkt); > + kfree(dr); > +- return -ENOMEM; > ++ return -EFAULT; > + } > +- as->urb->transfer_buffer = kmalloc(uurb->buffer_length, GFP_KERNEL); > +- if (!as->urb->transfer_buffer) { > ++ as = alloc_async(uurb->number_of_packets); > ++ if (!as) { > + kfree(isopkt); > + kfree(dr); > +- free_async(as); > + return -ENOMEM; > + } > ++ if (uurb->buffer_length > 0) { > ++ as->urb->transfer_buffer = kmalloc(uurb->buffer_length, > ++ GFP_KERNEL); > ++ if (!as->urb->transfer_buffer) { > ++ kfree(isopkt); > ++ kfree(dr); > ++ free_async(as); > ++ return -ENOMEM; > ++ } > ++ } > + as->urb->dev = ps->dev; > + as->urb->pipe = (uurb->type << 30) | > + __create_pipe(ps->dev, uurb->endpoint & 0xf) | > +@@ -1169,7 +1168,7 @@ static int proc_do_submiturb(struct dev_state *ps, > struct usbdevfs_urb *uurb, > + kfree(isopkt); > + as->ps = ps; > + as->userurb = arg; > +- if (uurb->endpoint & USB_DIR_IN) > ++ if (is_in && uurb->buffer_length > 0) > + as->userbuffer = uurb->buffer; > + else > + as->userbuffer = NULL; > +@@ -1179,9 +1178,9 @@ static int proc_do_submiturb(struct dev_state *ps, > struct usbdevfs_urb *uurb, > + as->uid = cred->uid; > + as->euid = cred->euid; > + security_task_getsecid(current, &as->secid); > +- if (!is_in) { > ++ if (!is_in && uurb->buffer_length > 0) { > + if (copy_from_user(as->urb->transfer_buffer, uurb->buffer, > +- as->urb->transfer_buffer_length)) { > ++ uurb->buffer_length)) { > + free_async(as); > + return -EFAULT; > + } > +@@ -1231,22 +1230,22 @@ static int processcompl(struct async *as, void > __user * __user *arg) > + if (as->userbuffer) > + if (copy_to_user(as->userbuffer, urb->transfer_buffer, > + urb->transfer_buffer_length)) > +- return -EFAULT; > ++ goto err_out; > + if (put_user(as->status, &userurb->status)) > +- return -EFAULT; > ++ goto err_out; > + if (put_user(urb->actual_length, &userurb->actual_length)) > +- return -EFAULT; > ++ goto err_out; > + if (put_user(urb->error_count, &userurb->error_count)) > +- return -EFAULT; > ++ goto err_out; > + > + if (usb_endpoint_xfer_isoc(&urb->ep->desc)) { > + for (i = 0; i < urb->number_of_packets; i++) { > + if (put_user(urb->iso_frame_desc[i].actual_length, > + &userurb->iso_frame_desc[i].actual_length)) > +- return -EFAULT; > ++ goto err_out; > + if (put_user(urb->iso_frame_desc[i].status, > + &userurb->iso_frame_desc[i].status)) > +- return -EFAULT; > ++ goto err_out; > + } > + } > + > +@@ -1255,6 +1254,10 @@ static int processcompl(struct async *as, void __user > * __user *arg) > + if (put_user(addr, (void __user * __user *)arg)) > + return -EFAULT; > + return 0; > ++ > ++err_out: > ++ free_async(as); > ++ return -EFAULT; > + } > + > + static struct async *reap_as(struct dev_state *ps) > +diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c > +index b626283..a94f184 100644 > +--- a/drivers/usb/core/message.c > ++++ b/drivers/usb/core/message.c > +@@ -758,6 +758,48 @@ static int usb_string_sub(struct usb_device *dev, > unsigned int langid, > + return rc; > + } > + > ++static int usb_get_langid(struct usb_device *dev, unsigned char *tbuf) > ++{ > ++ int err; > ++ > ++ if (dev->have_langid) > ++ return 0; > ++ > ++ if (dev->string_langid < 0) > ++ return -EPIPE; > ++ > ++ err = usb_string_sub(dev, 0, 0, tbuf); > ++ > ++ /* If the string was reported but is malformed, default to english > ++ * (0x0409) */ > ++ if (err == -ENODATA || (err > 0 && err < 4)) { > ++ dev->string_langid = 0x0409; > ++ dev->have_langid = 1; > ++ dev_err(&dev->dev, > ++ "string descriptor 0 malformed (err = %d), " > ++ "defaulting to 0x%04x\n", > ++ err, dev->string_langid); > ++ return 0; > ++ } > ++ > ++ /* In case of all other errors, we assume the device is not able to > ++ * deal with strings at all. Set string_langid to -1 in order to > ++ * prevent any string to be retrieved from the device */ > ++ if (err < 0) { > ++ dev_err(&dev->dev, "string descriptor 0 read error: %d\n", > ++ err); > ++ dev->string_langid = -1; > ++ return -EPIPE; > ++ } > ++ > ++ /* always use the first langid listed */ > ++ dev->string_langid = tbuf[2] | (tbuf[3] << 8); > ++ dev->have_langid = 1; > ++ dev_dbg(&dev->dev, "default language 0x%04x\n", > ++ dev->string_langid); > ++ return 0; > ++} > ++ > + /** > + * usb_string - returns ISO 8859-1 version of a string descriptor > + * @dev: the device whose string descriptor is being retrieved > +@@ -797,24 +839,9 @@ int usb_string(struct usb_device *dev, int index, char > *buf, size_t size) > + if (!tbuf) > + return -ENOMEM; > + > +- /* get langid for strings if it's not yet known */ > +- if (!dev->have_langid) { > +- err = usb_string_sub(dev, 0, 0, tbuf); > +- if (err < 0) { > +- dev_err(&dev->dev, > +- "string descriptor 0 read error: %d\n", > +- err); > +- } else if (err < 4) { > +- dev_err(&dev->dev, "string descriptor 0 too short\n"); > +- } else { > +- dev->string_langid = tbuf[2] | (tbuf[3] << 8); > +- /* always use the first langid listed */ > +- dev_dbg(&dev->dev, "default language 0x%04x\n", > +- dev->string_langid); > +- } > +- > +- dev->have_langid = 1; > +- } > ++ err = usb_get_langid(dev, tbuf); > ++ if (err < 0) > ++ goto errout; > + > + err = usb_string_sub(dev, dev->string_langid, index, tbuf); > + if (err < 0) > +diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c > +index d006dc6..bd102f5 100644 > +--- a/drivers/usb/gadget/ether.c > ++++ b/drivers/usb/gadget/ether.c > +@@ -293,15 +293,16 @@ static int __init eth_bind(struct usb_composite_dev > *cdev) > + /* CDC Subset */ > + eth_config_driver.label = "CDC Subset/SAFE"; > + > +- device_desc.idVendor = cpu_to_le16(SIMPLE_VENDOR_NUM), > +- device_desc.idProduct = cpu_to_le16(SIMPLE_PRODUCT_NUM), > +- device_desc.bDeviceClass = USB_CLASS_VENDOR_SPEC; > ++ device_desc.idVendor = cpu_to_le16(SIMPLE_VENDOR_NUM); > ++ device_desc.idProduct = cpu_to_le16(SIMPLE_PRODUCT_NUM); > ++ if (!has_rndis()) > ++ device_desc.bDeviceClass = USB_CLASS_VENDOR_SPEC; > + } > + > + if (has_rndis()) { > + /* RNDIS plus ECM-or-Subset */ > +- device_desc.idVendor = cpu_to_le16(RNDIS_VENDOR_NUM), > +- device_desc.idProduct = cpu_to_le16(RNDIS_PRODUCT_NUM), > ++ device_desc.idVendor = cpu_to_le16(RNDIS_VENDOR_NUM); > ++ device_desc.idProduct = cpu_to_le16(RNDIS_PRODUCT_NUM); > + device_desc.bNumConfigurations = 2; > + } > + > +diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c > +index 556d0ec..a01201a 100644 > +--- a/drivers/usb/host/ehci-sched.c > ++++ b/drivers/usb/host/ehci-sched.c > +@@ -1617,11 +1617,14 @@ itd_complete ( > + desc->status = -EPROTO; > + > + /* HC need not update length with this error */ > +- if (!(t & EHCI_ISOC_BABBLE)) > +- desc->actual_length = EHCI_ITD_LENGTH (t); > ++ if (!(t & EHCI_ISOC_BABBLE)) { > ++ desc->actual_length = EHCI_ITD_LENGTH(t); > ++ urb->actual_length += desc->actual_length; > ++ } > + } else if (likely ((t & EHCI_ISOC_ACTIVE) == 0)) { > + desc->status = 0; > +- desc->actual_length = EHCI_ITD_LENGTH (t); > ++ desc->actual_length = EHCI_ITD_LENGTH(t); > ++ urb->actual_length += desc->actual_length; > + } else { > + /* URB was too late */ > + desc->status = -EXDEV; > +@@ -2012,7 +2015,8 @@ sitd_complete ( > + desc->status = -EPROTO; > + } else { > + desc->status = 0; > +- desc->actual_length = desc->length - SITD_LENGTH (t); > ++ desc->actual_length = desc->length - SITD_LENGTH(t); > ++ urb->actual_length += desc->actual_length; > + } > + stream->depth -= stream->interval << 3; > + > +diff --git a/drivers/usb/serial/ti_usb_3410_5052.c > b/drivers/usb/serial/ti_usb_3410_5052.c > +index ef5f756..1b28cae 100644 > +--- a/drivers/usb/serial/ti_usb_3410_5052.c > ++++ b/drivers/usb/serial/ti_usb_3410_5052.c > +@@ -192,7 +192,6 @@ static struct usb_device_id > ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = { > + { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, > + { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, > + { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) }, > +- { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) }, > + }; > + > + static struct usb_device_id > ti_id_table_combined[14+2*TI_EXTRA_VID_PID_COUNT+1] = { > +@@ -1660,7 +1659,7 @@ static int ti_do_download(struct usb_device *dev, int > pipe, > + u8 cs = 0; > + int done; > + struct ti_firmware_header *header; > +- int status; > ++ int status = 0; > + int len; > + > + for (pos = sizeof(struct ti_firmware_header); pos < size; pos++) > +diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c > +index 40381df..605b17a 100644 > +--- a/fs/binfmt_elf.c > ++++ b/fs/binfmt_elf.c > +@@ -1518,11 +1518,11 @@ static int fill_note_info(struct elfhdr *elf, int > phdrs, > + info->thread = NULL; > + > + psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL); > +- fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo); > +- > + if (psinfo == NULL) > + return 0; > + > ++ fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo); > ++ > + /* > + * Figure out how many notes we're going to need for each thread. > + */ > +diff --git a/fs/bio.c b/fs/bio.c > +index 9871164..78b0509 100644 > +--- a/fs/bio.c > ++++ b/fs/bio.c > +@@ -706,14 +706,13 @@ static struct bio_map_data *bio_alloc_map_data(int > nr_segs, int iov_count, > + } > + > + static int __bio_copy_iov(struct bio *bio, struct bio_vec *iovecs, > +- struct sg_iovec *iov, int iov_count, int uncopy, > +- int do_free_page) > ++ struct sg_iovec *iov, int iov_count, > ++ int to_user, int from_user, int do_free_page) > + { > + int ret = 0, i; > + struct bio_vec *bvec; > + int iov_idx = 0; > + unsigned int iov_off = 0; > +- int read = bio_data_dir(bio) == READ; > + > + __bio_for_each_segment(bvec, bio, i, 0) { > + char *bv_addr = page_address(bvec->bv_page); > +@@ -728,13 +727,14 @@ static int __bio_copy_iov(struct bio *bio, struct > bio_vec *iovecs, > + iov_addr = iov[iov_idx].iov_base + iov_off; > + > + if (!ret) { > +- if (!read && !uncopy) > +- ret = copy_from_user(bv_addr, iov_addr, > +- bytes); > +- if (read && uncopy) > ++ if (to_user) > + ret = copy_to_user(iov_addr, bv_addr, > + bytes); > + > ++ if (from_user) > ++ ret = copy_from_user(bv_addr, iov_addr, > ++ bytes); > ++ > + if (ret) > + ret = -EFAULT; > + } > +@@ -771,7 +771,8 @@ int bio_uncopy_user(struct bio *bio) > + > + if (!bio_flagged(bio, BIO_NULL_MAPPED)) > + ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs, > +- bmd->nr_sgvecs, 1, bmd->is_our_pages); > ++ bmd->nr_sgvecs, bio_data_dir(bio) == READ, > ++ 0, bmd->is_our_pages); > + bio_free_map_data(bmd); > + bio_put(bio); > + return ret; > +@@ -876,8 +877,9 @@ struct bio *bio_copy_user_iov(struct request_queue *q, > + /* > + * success > + */ > +- if (!write_to_vm && (!map_data || !map_data->null_mapped)) { > +- ret = __bio_copy_iov(bio, bio->bi_io_vec, iov, iov_count, 0, 0); > ++ if ((!write_to_vm && (!map_data || !map_data->null_mapped)) || > ++ (map_data && map_data->from_user)) { > ++ ret = __bio_copy_iov(bio, bio->bi_io_vec, iov, iov_count, 0, 1, > 0); > + if (ret) > + goto cleanup; > + } > +diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c > +index 4aa81a5..1dc14f2 100644 > +--- a/fs/cifs/connect.c > ++++ b/fs/cifs/connect.c > +@@ -2745,6 +2745,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, > + strncpy(tcon->treeName, tree, MAX_TREE_SIZE); > + > + /* mostly informational -- no need to fail on error here */ > ++ kfree(tcon->nativeFileSystem); > + tcon->nativeFileSystem = cifs_strndup_from_ucs(bcc_ptr, > + bytes_left, is_unicode, > + nls_codepage); > +diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c > +index 3758965..83440ca 100644 > +--- a/fs/cifs/dir.c > ++++ b/fs/cifs/dir.c > +@@ -641,6 +641,15 @@ cifs_lookup(struct inode *parent_dir_inode, struct > dentry *direntry, > + } > + } > + > ++ /* > ++ * O_EXCL: optimize away the lookup, but don't hash the dentry. Let > ++ * the VFS handle the create. > ++ */ > ++ if (nd->flags & LOOKUP_EXCL) { > ++ d_instantiate(direntry, NULL); > ++ return 0; > ++ } > ++ > + /* can not grab the rename sem here since it would > + deadlock in the cases (beginning of sys_rename itself) > + in which we already have the sb rename sem */ > +diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c > +index af737bb..259525c 100644 > +--- a/fs/ecryptfs/keystore.c > ++++ b/fs/ecryptfs/keystore.c > +@@ -1303,6 +1303,13 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat > *crypt_stat, > + } > + (*new_auth_tok)->session_key.encrypted_key_size = > + (body_size - (ECRYPTFS_SALT_SIZE + 5)); > ++ if ((*new_auth_tok)->session_key.encrypted_key_size > ++ > ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES) { > ++ printk(KERN_WARNING "Tag 3 packet contains key larger " > ++ "than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES\n"); > ++ rc = -EINVAL; > ++ goto out_free; > ++ } > + if (unlikely(data[(*packet_size)++] != 0x04)) { > + printk(KERN_WARNING "Unknown version number [%d]\n", > + data[(*packet_size) - 1]); > +@@ -1449,6 +1456,12 @@ parse_tag_11_packet(unsigned char *data, unsigned > char *contents, > + rc = -EINVAL; > + goto out; > + } > ++ if (unlikely((*tag_11_contents_size) > max_contents_bytes)) { > ++ printk(KERN_ERR "Literal data section in tag 11 packet exceeds " > ++ "expected size\n"); > ++ rc = -EINVAL; > ++ goto out; > ++ } > + if (data[(*packet_size)++] != 0x62) { > + printk(KERN_WARNING "Unrecognizable packet\n"); > + rc = -EINVAL; > +diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c > +index b660435..7843755 100644 > +--- a/fs/nfsd/vfs.c > ++++ b/fs/nfsd/vfs.c > +@@ -677,7 +677,6 @@ __be32 > + nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, > + int access, struct file **filp) > + { > +- const struct cred *cred = current_cred(); > + struct dentry *dentry; > + struct inode *inode; > + int flags = O_RDONLY|O_LARGEFILE; > +@@ -732,7 +731,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, > int type, > + vfs_dq_init(inode); > + } > + *filp = dentry_open(dget(dentry), mntget(fhp->fh_export->ex_path.mnt), > +- flags, cred); > ++ flags, current_cred()); > + if (IS_ERR(*filp)) > + host_err = PTR_ERR(*filp); > + out_nfserr: > +diff --git a/fs/nilfs2/cpfile.c b/fs/nilfs2/cpfile.c > +index 300f1cd..2d81a4d 100644 > +--- a/fs/nilfs2/cpfile.c > ++++ b/fs/nilfs2/cpfile.c > +@@ -311,7 +311,7 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, > + ret = nilfs_cpfile_get_checkpoint_block(cpfile, cno, 0, &cp_bh); > + if (ret < 0) { > + if (ret != -ENOENT) > +- goto out_header; > ++ break; > + /* skip hole */ > + ret = 0; > + continue; > +@@ -344,7 +344,7 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, > + continue; > + printk(KERN_ERR "%s: cannot delete block\n", > + __func__); > +- goto out_header; > ++ break; > + } > + } > + > +@@ -362,7 +362,6 @@ int nilfs_cpfile_delete_checkpoints(struct inode *cpfile, > + kunmap_atomic(kaddr, KM_USER0); > + } > + > +- out_header: > + brelse(header_bh); > + > + out_sem: > +diff --git a/fs/nilfs2/dat.c b/fs/nilfs2/dat.c > +index bb8a581..e2646c3 100644 > +--- a/fs/nilfs2/dat.c > ++++ b/fs/nilfs2/dat.c > +@@ -149,15 +149,6 @@ void nilfs_dat_commit_start(struct inode *dat, struct > nilfs_palloc_req *req, > + entry = nilfs_palloc_block_get_entry(dat, req->pr_entry_nr, > + req->pr_entry_bh, kaddr); > + entry->de_start = cpu_to_le64(nilfs_mdt_cno(dat)); > +- if (entry->de_blocknr != cpu_to_le64(0) || > +- entry->de_end != cpu_to_le64(NILFS_CNO_MAX)) { > +- printk(KERN_CRIT > +- "%s: vbn = %llu, start = %llu, end = %llu, pbn = %llu\n", > +- __func__, (unsigned long long)req->pr_entry_nr, > +- (unsigned long long)le64_to_cpu(entry->de_start), > +- (unsigned long long)le64_to_cpu(entry->de_end), > +- (unsigned long long)le64_to_cpu(entry->de_blocknr)); > +- } > + entry->de_blocknr = cpu_to_le64(blocknr); > + kunmap_atomic(kaddr, KM_USER0); > + > +diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c > +index 22c7f65..1779ddc 100644 > +--- a/fs/nilfs2/segment.c > ++++ b/fs/nilfs2/segment.c > +@@ -1846,26 +1846,13 @@ static int nilfs_segctor_write(struct nilfs_sc_info > *sci, > + err = nilfs_segbuf_write(segbuf, &wi); > + > + res = nilfs_segbuf_wait(segbuf, &wi); > +- err = unlikely(err) ? : res; > +- if (unlikely(err)) > ++ err = err ? : res; > ++ if (err) > + return err; > + } > + return 0; > + } > + > +-static int nilfs_page_has_uncleared_buffer(struct page *page) > +-{ > +- struct buffer_head *head, *bh; > +- > +- head = bh = page_buffers(page); > +- do { > +- if (buffer_dirty(bh) && !list_empty(&bh->b_assoc_buffers)) > +- return 1; > +- bh = bh->b_this_page; > +- } while (bh != head); > +- return 0; > +-} > +- > + static void __nilfs_end_page_io(struct page *page, int err) > + { > + if (!err) { > +@@ -1889,12 +1876,11 @@ static void nilfs_end_page_io(struct page *page, int > err) > + if (!page) > + return; > + > +- if (buffer_nilfs_node(page_buffers(page)) && > +- nilfs_page_has_uncleared_buffer(page)) > +- /* For b-tree node pages, this function may be called twice > +- or more because they might be split in a segment. > +- This check assures that cleanup has been done for all > +- buffers in a split btnode page. */ > ++ if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(page)) > ++ /* > ++ * For b-tree node pages, this function may be called twice > ++ * or more because they might be split in a segment. > ++ */ > + return; > + > + __nilfs_end_page_io(page, err); > +@@ -1957,7 +1943,7 @@ static void nilfs_segctor_abort_write(struct > nilfs_sc_info *sci, > + } > + if (bh->b_page != fs_page) { > + nilfs_end_page_io(fs_page, err); > +- if (unlikely(fs_page == failed_page)) > ++ if (fs_page && fs_page == failed_page) > + goto done; > + fs_page = bh->b_page; > + } > +diff --git a/fs/partitions/check.c b/fs/partitions/check.c > +index 99e33ef..763c9e2 100644 > +--- a/fs/partitions/check.c > ++++ b/fs/partitions/check.c > +@@ -426,7 +426,7 @@ struct hd_struct *add_partition(struct gendisk *disk, > int partno, > + rcu_assign_pointer(ptbl->part[partno], p); > + > + /* suppress uevent if the disk supresses it */ > +- if (!dev_get_uevent_suppress(pdev)) > ++ if (!dev_get_uevent_suppress(ddev)) > + kobject_uevent(&pdev->kobj, KOBJ_ADD); > + > + return p; > +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h > +index b4f71f1..e590df0 100644 > +--- a/include/linux/blkdev.h > ++++ b/include/linux/blkdev.h > +@@ -723,6 +723,7 @@ struct rq_map_data { > + int nr_entries; > + unsigned long offset; > + int null_mapped; > ++ int from_user; > + }; > + > + struct req_iterator { > +diff --git a/include/linux/sched.h b/include/linux/sched.h > +index b4c38bc..03c6c36 100644 > +--- a/include/linux/sched.h > ++++ b/include/linux/sched.h > +@@ -206,7 +206,7 @@ extern unsigned long long time_sync_thresh; > + ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) > + #define task_contributes_to_load(task) \ > + ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \ > +- (task->flags & PF_FROZEN) == 0) > ++ (task->flags & PF_FREEZING) == 0) > + > + #define __set_task_state(tsk, state_value) \ > + do { (tsk)->state = (state_value); } while (0) > +@@ -1630,6 +1630,7 @@ extern cputime_t task_gtime(struct task_struct *p); > + #define PF_MEMALLOC 0x00000800 /* Allocating memory */ > + #define PF_FLUSHER 0x00001000 /* responsible for disk writeback */ > + #define PF_USED_MATH 0x00002000 /* if unset the fpu must be > initialized before use */ > ++#define PF_FREEZING 0x00004000 /* freeze in progress. do not account > to load */ > + #define PF_NOFREEZE 0x00008000 /* this thread should not be frozen */ > + #define PF_FROZEN 0x00010000 /* frozen for system suspend */ > + #define PF_FSTRANS 0x00020000 /* inside a filesystem transaction */ > +diff --git a/include/net/netfilter/nf_conntrack.h > b/include/net/netfilter/nf_conntrack.h > +index 6c3f964..5d9a848 100644 > +--- a/include/net/netfilter/nf_conntrack.h > ++++ b/include/net/netfilter/nf_conntrack.h > +@@ -255,8 +255,8 @@ static inline bool nf_ct_kill(struct nf_conn *ct) > + /* Update TCP window tracking data when NAT mangles the packet */ > + extern void nf_conntrack_tcp_update(const struct sk_buff *skb, > + unsigned int dataoff, > +- struct nf_conn *ct, > +- int dir); > ++ struct nf_conn *ct, int dir, > ++ s16 offset); > + > + /* Fake conntrack entry for untracked connections */ > + extern struct nf_conn nf_conntrack_untracked; > +diff --git a/kernel/freezer.c b/kernel/freezer.c > +index 2f4936c..bd1d42b 100644 > +--- a/kernel/freezer.c > ++++ b/kernel/freezer.c > +@@ -44,12 +44,19 @@ void refrigerator(void) > + recalc_sigpending(); /* We sent fake signal, clean it up */ > + spin_unlock_irq(¤t->sighand->siglock); > + > ++ /* prevent accounting of that task to load */ > ++ current->flags |= PF_FREEZING; > ++ > + for (;;) { > + set_current_state(TASK_UNINTERRUPTIBLE); > + if (!frozen(current)) > + break; > + schedule(); > + } > ++ > ++ /* Remove the accounting blocker */ > ++ current->flags &= ~PF_FREEZING; > ++ > + pr_debug("%s left refrigerator\n", current->comm); > + __set_current_state(save); > + } > +diff --git a/kernel/sched.c b/kernel/sched.c > +index 26efa47..0d3d47f 100644 > +--- a/kernel/sched.c > ++++ b/kernel/sched.c > +@@ -497,6 +497,7 @@ struct rt_rq { > + #endif > + #ifdef CONFIG_SMP > + unsigned long rt_nr_migratory; > ++ unsigned long rt_nr_total; > + int overloaded; > + struct plist_head pushable_tasks; > + #endif > +diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c > +index 9bf0d2a..3918e01 100644 > +--- a/kernel/sched_rt.c > ++++ b/kernel/sched_rt.c > +@@ -10,6 +10,8 @@ static inline struct task_struct *rt_task_of(struct > sched_rt_entity *rt_se) > + > + #ifdef CONFIG_RT_GROUP_SCHED > + > ++#define rt_entity_is_task(rt_se) (!(rt_se)->my_q) > ++ > + static inline struct rq *rq_of_rt_rq(struct rt_rq *rt_rq) > + { > + return rt_rq->rq; > +@@ -22,6 +24,8 @@ static inline struct rt_rq *rt_rq_of_se(struct > sched_rt_entity *rt_se) > + > + #else /* CONFIG_RT_GROUP_SCHED */ > + > ++#define rt_entity_is_task(rt_se) (1) > ++ > + static inline struct rq *rq_of_rt_rq(struct rt_rq *rt_rq) > + { > + return container_of(rt_rq, struct rq, rt); > +@@ -73,7 +77,7 @@ static inline void rt_clear_overload(struct rq *rq) > + > + static void update_rt_migration(struct rt_rq *rt_rq) > + { > +- if (rt_rq->rt_nr_migratory && (rt_rq->rt_nr_running > 1)) { > ++ if (rt_rq->rt_nr_migratory && rt_rq->rt_nr_total > 1) { > + if (!rt_rq->overloaded) { > + rt_set_overload(rq_of_rt_rq(rt_rq)); > + rt_rq->overloaded = 1; > +@@ -86,6 +90,12 @@ static void update_rt_migration(struct rt_rq *rt_rq) > + > + static void inc_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq > *rt_rq) > + { > ++ if (!rt_entity_is_task(rt_se)) > ++ return; > ++ > ++ rt_rq = &rq_of_rt_rq(rt_rq)->rt; > ++ > ++ rt_rq->rt_nr_total++; > + if (rt_se->nr_cpus_allowed > 1) > + rt_rq->rt_nr_migratory++; > + > +@@ -94,6 +104,12 @@ static void inc_rt_migration(struct sched_rt_entity > *rt_se, struct rt_rq *rt_rq) > + > + static void dec_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq > *rt_rq) > + { > ++ if (!rt_entity_is_task(rt_se)) > ++ return; > ++ > ++ rt_rq = &rq_of_rt_rq(rt_rq)->rt; > ++ > ++ rt_rq->rt_nr_total--; > + if (rt_se->nr_cpus_allowed > 1) > + rt_rq->rt_nr_migratory--; > + > +diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c > +index 90f1347..01e5c43 100644 > +--- a/kernel/trace/trace_functions.c > ++++ b/kernel/trace/trace_functions.c > +@@ -364,7 +364,7 @@ ftrace_trace_onoff_callback(char *glob, char *cmd, char > *param, int enable) > + out_reg: > + ret = register_ftrace_function_probe(glob, ops, count); > + > +- return ret; > ++ return ret < 0 ? ret : 0; > + } > + > + static struct ftrace_func_command ftrace_traceon_cmd = { > +diff --git a/mm/filemap.c b/mm/filemap.c > +index 1b60f30..0b20d1f 100644 > +--- a/mm/filemap.c > ++++ b/mm/filemap.c > +@@ -2249,6 +2249,7 @@ again: > + pagefault_enable(); > + flush_dcache_page(page); > + > ++ mark_page_accessed(page); > + status = a_ops->write_end(file, mapping, pos, bytes, copied, > + page, fsdata); > + if (unlikely(status < 0)) > +diff --git a/mm/internal.h b/mm/internal.h > +index 987bb03..090c267 100644 > +--- a/mm/internal.h > ++++ b/mm/internal.h > +@@ -284,4 +284,8 @@ int __get_user_pages(struct task_struct *tsk, struct > mm_struct *mm, > + unsigned long start, int len, int flags, > + struct page **pages, struct vm_area_struct **vmas); > + > ++#define ZONE_RECLAIM_NOSCAN -2 > ++#define ZONE_RECLAIM_FULL -1 > ++#define ZONE_RECLAIM_SOME 0 > ++#define ZONE_RECLAIM_SUCCESS 1 > + #endif > +diff --git a/mm/nommu.c b/mm/nommu.c > +index b571ef7..2fd2ad5 100644 > +--- a/mm/nommu.c > ++++ b/mm/nommu.c > +@@ -69,6 +69,9 @@ int sysctl_max_map_count = DEFAULT_MAX_MAP_COUNT; > + int sysctl_nr_trim_pages = CONFIG_NOMMU_INITIAL_TRIM_EXCESS; > + int heap_stack_gap = 0; > + > ++/* amount of vm to protect from userspace access */ > ++unsigned long mmap_min_addr = CONFIG_DEFAULT_MMAP_MIN_ADDR; > ++ > + atomic_long_t mmap_pages_allocated; > + > + EXPORT_SYMBOL(mem_map); > +diff --git a/mm/page_alloc.c b/mm/page_alloc.c > +index f820383..480907c 100644 > +--- a/mm/page_alloc.c > ++++ b/mm/page_alloc.c > +@@ -1420,20 +1420,38 @@ zonelist_scan: > + > + if (!(alloc_flags & ALLOC_NO_WATERMARKS)) { > + unsigned long mark; > ++ int ret; > + if (alloc_flags & ALLOC_WMARK_MIN) > + mark = zone->pages_min; > + else if (alloc_flags & ALLOC_WMARK_LOW) > + mark = zone->pages_low; > + else > + mark = zone->pages_high; > +- if (!zone_watermark_ok(zone, order, mark, > +- classzone_idx, alloc_flags)) { > +- if (!zone_reclaim_mode || > +- !zone_reclaim(zone, gfp_mask, order)) > ++ > ++ if (zone_watermark_ok(zone, order, mark, > ++ classzone_idx, alloc_flags)) > ++ goto try_this_zone; > ++ > ++ if (zone_reclaim_mode == 0) > ++ goto this_zone_full; > ++ > ++ ret = zone_reclaim(zone, gfp_mask, order); > ++ switch (ret) { > ++ case ZONE_RECLAIM_NOSCAN: > ++ /* did not scan */ > ++ goto try_next_zone; > ++ case ZONE_RECLAIM_FULL: > ++ /* scanned but unreclaimable */ > ++ goto this_zone_full; > ++ default: > ++ /* did we reclaim enough */ > ++ if (!zone_watermark_ok(zone, order, mark, > ++ classzone_idx, alloc_flags)) > + goto this_zone_full; > + } > + } > + > ++try_this_zone: > + page = buffered_rmqueue(preferred_zone, zone, order, gfp_mask); > + if (page) > + break; > +diff --git a/mm/slab.c b/mm/slab.c > +index 9a90b00..021d69f 100644 > +--- a/mm/slab.c > ++++ b/mm/slab.c > +@@ -2592,7 +2592,7 @@ void kmem_cache_destroy(struct kmem_cache *cachep) > + } > + > + if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU)) > +- synchronize_rcu(); > ++ rcu_barrier(); > + > + __kmem_cache_destroy(cachep); > + mutex_unlock(&cache_chain_mutex); > +diff --git a/mm/slob.c b/mm/slob.c > +index f92e66d..c80d982 100644 > +--- a/mm/slob.c > ++++ b/mm/slob.c > +@@ -590,6 +590,8 @@ EXPORT_SYMBOL(kmem_cache_create); > + > + void kmem_cache_destroy(struct kmem_cache *c) > + { > ++ if (c->flags & SLAB_DESTROY_BY_RCU) > ++ rcu_barrier(); > + slob_free(c, sizeof(struct kmem_cache)); > + } > + EXPORT_SYMBOL(kmem_cache_destroy); > +diff --git a/mm/slub.c b/mm/slub.c > +index 65ffda5..253016d 100644 > +--- a/mm/slub.c > ++++ b/mm/slub.c > +@@ -2490,6 +2490,8 @@ static inline int kmem_cache_close(struct kmem_cache > *s) > + */ > + void kmem_cache_destroy(struct kmem_cache *s) > + { > ++ if (s->flags & SLAB_DESTROY_BY_RCU) > ++ rcu_barrier(); > + down_write(&slub_lock); > + s->refcount--; > + if (!s->refcount) { > +diff --git a/mm/vmscan.c b/mm/vmscan.c > +index 2500b01..b3e39b5 100644 > +--- a/mm/vmscan.c > ++++ b/mm/vmscan.c > +@@ -2426,16 +2426,16 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, > unsigned int order) > + */ > + if (zone_pagecache_reclaimable(zone) <= zone->min_unmapped_pages && > + zone_page_state(zone, NR_SLAB_RECLAIMABLE) <= zone->min_slab_pages) > +- return 0; > ++ return ZONE_RECLAIM_FULL; > + > + if (zone_is_all_unreclaimable(zone)) > +- return 0; > ++ return ZONE_RECLAIM_FULL; > + > + /* > + * Do not scan if the allocation should not be delayed. > + */ > + if (!(gfp_mask & __GFP_WAIT) || (current->flags & PF_MEMALLOC)) > +- return 0; > ++ return ZONE_RECLAIM_NOSCAN; > + > + /* > + * Only run zone reclaim on the local zone or on zones that do not > +@@ -2445,10 +2445,11 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, > unsigned int order) > + */ > + node_id = zone_to_nid(zone); > + if (node_state(node_id, N_CPU) && node_id != numa_node_id()) > +- return 0; > ++ return ZONE_RECLAIM_NOSCAN; > + > + if (zone_test_and_set_flag(zone, ZONE_RECLAIM_LOCKED)) > +- return 0; > ++ return ZONE_RECLAIM_NOSCAN; > ++ > + ret = __zone_reclaim(zone, gfp_mask, order); > + zone_clear_flag(zone, ZONE_RECLAIM_LOCKED); > + > +diff --git a/net/dsa/mv88e6xxx.c b/net/dsa/mv88e6xxx.c > +index 4e4d8b5..efe661a 100644 > +--- a/net/dsa/mv88e6xxx.c > ++++ b/net/dsa/mv88e6xxx.c > +@@ -418,7 +418,7 @@ static int mv88e6xxx_stats_wait(struct dsa_switch *ds) > + int i; > + > + for (i = 0; i < 10; i++) { > +- ret = REG_READ(REG_GLOBAL2, 0x1d); > ++ ret = REG_READ(REG_GLOBAL, 0x1d); > + if ((ret & 0x8000) == 0) > + return 0; > + } > +diff --git a/net/ipv4/netfilter/nf_nat_helper.c > b/net/ipv4/netfilter/nf_nat_helper.c > +index cf7a42b..05ede41 100644 > +--- a/net/ipv4/netfilter/nf_nat_helper.c > ++++ b/net/ipv4/netfilter/nf_nat_helper.c > +@@ -191,7 +191,8 @@ nf_nat_mangle_tcp_packet(struct sk_buff *skb, > + ct, ctinfo); > + /* Tell TCP window tracking about seq change */ > + nf_conntrack_tcp_update(skb, ip_hdrlen(skb), > +- ct, CTINFO2DIR(ctinfo)); > ++ ct, CTINFO2DIR(ctinfo), > ++ (int)rep_len - (int)match_len); > + > + nf_conntrack_event_cache(IPCT_NATSEQADJ, ct); > + } > +@@ -377,6 +378,7 @@ nf_nat_seq_adjust(struct sk_buff *skb, > + struct tcphdr *tcph; > + int dir; > + __be32 newseq, newack; > ++ s16 seqoff, ackoff; > + struct nf_conn_nat *nat = nfct_nat(ct); > + struct nf_nat_seq *this_way, *other_way; > + > +@@ -390,15 +392,18 @@ nf_nat_seq_adjust(struct sk_buff *skb, > + > + tcph = (void *)skb->data + ip_hdrlen(skb); > + if (after(ntohl(tcph->seq), this_way->correction_pos)) > +- newseq = htonl(ntohl(tcph->seq) + this_way->offset_after); > ++ seqoff = this_way->offset_after; > + else > +- newseq = htonl(ntohl(tcph->seq) + this_way->offset_before); > ++ seqoff = this_way->offset_before; > + > + if (after(ntohl(tcph->ack_seq) - other_way->offset_before, > + other_way->correction_pos)) > +- newack = htonl(ntohl(tcph->ack_seq) - other_way->offset_after); > ++ ackoff = other_way->offset_after; > + else > +- newack = htonl(ntohl(tcph->ack_seq) - other_way->offset_before); > ++ ackoff = other_way->offset_before; > ++ > ++ newseq = htonl(ntohl(tcph->seq) + seqoff); > ++ newack = htonl(ntohl(tcph->ack_seq) - ackoff); > + > + inet_proto_csum_replace4(&tcph->check, skb, tcph->seq, newseq, 0); > + inet_proto_csum_replace4(&tcph->check, skb, tcph->ack_seq, newack, 0); > +@@ -413,7 +418,7 @@ nf_nat_seq_adjust(struct sk_buff *skb, > + if (!nf_nat_sack_adjust(skb, tcph, ct, ctinfo)) > + return 0; > + > +- nf_conntrack_tcp_update(skb, ip_hdrlen(skb), ct, dir); > ++ nf_conntrack_tcp_update(skb, ip_hdrlen(skb), ct, dir, seqoff); > + > + return 1; > + } > +diff --git a/net/netfilter/nf_conntrack_core.c > b/net/netfilter/nf_conntrack_core.c > +index 8020db6..0d961ee 100644 > +--- a/net/netfilter/nf_conntrack_core.c > ++++ b/net/netfilter/nf_conntrack_core.c > +@@ -295,7 +295,8 @@ begin: > + h = __nf_conntrack_find(net, tuple); > + if (h) { > + ct = nf_ct_tuplehash_to_ctrack(h); > +- if (unlikely(!atomic_inc_not_zero(&ct->ct_general.use))) > ++ if (unlikely(nf_ct_is_dying(ct) || > ++ !atomic_inc_not_zero(&ct->ct_general.use))) > + h = NULL; > + else { > + if (unlikely(!nf_ct_tuple_equal(tuple, &h->tuple))) { > +@@ -385,7 +386,6 @@ __nf_conntrack_confirm(struct sk_buff *skb) > + /* Remove from unconfirmed list */ > + hlist_nulls_del_rcu(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode); > + > +- __nf_conntrack_hash_insert(ct, hash, repl_hash); > + /* Timer relative to confirmation time, not original > + setting time, otherwise we'd get timer wrap in > + weird delay cases. */ > +@@ -393,8 +393,16 @@ __nf_conntrack_confirm(struct sk_buff *skb) > + add_timer(&ct->timeout); > + atomic_inc(&ct->ct_general.use); > + set_bit(IPS_CONFIRMED_BIT, &ct->status); > ++ > ++ /* Since the lookup is lockless, hash insertion must be done after > ++ * starting the timer and setting the CONFIRMED bit. The RCU barriers > ++ * guarantee that no other CPU can find the conntrack before the above > ++ * stores are visible. > ++ */ > ++ __nf_conntrack_hash_insert(ct, hash, repl_hash); > + NF_CT_STAT_INC(net, insert); > + spin_unlock_bh(&nf_conntrack_lock); > ++ > + help = nfct_help(ct); > + if (help && help->helper) > + nf_conntrack_event_cache(IPCT_HELPER, ct); > +@@ -467,7 +475,8 @@ static noinline int early_drop(struct net *net, unsigned > int hash) > + cnt++; > + } > + > +- if (ct && unlikely(!atomic_inc_not_zero(&ct->ct_general.use))) > ++ if (ct && unlikely(nf_ct_is_dying(ct) || > ++ !atomic_inc_not_zero(&ct->ct_general.use))) > + ct = NULL; > + if (ct || cnt >= NF_CT_EVICTION_RANGE) > + break; > +@@ -516,22 +525,37 @@ struct nf_conn *nf_conntrack_alloc(struct net *net, > + } > + } > + > +- ct = kmem_cache_zalloc(nf_conntrack_cachep, gfp); > ++ /* > ++ * Do not use kmem_cache_zalloc(), as this cache uses > ++ * SLAB_DESTROY_BY_RCU. > ++ */ > ++ ct = kmem_cache_alloc(nf_conntrack_cachep, gfp); > + if (ct == NULL) { > + pr_debug("nf_conntrack_alloc: Can't alloc conntrack.\n"); > + atomic_dec(&net->ct.count); > + return ERR_PTR(-ENOMEM); > + } > +- > +- atomic_set(&ct->ct_general.use, 1); > ++ /* > ++ * Let ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode.next > ++ * and ct->tuplehash[IP_CT_DIR_REPLY].hnnode.next unchanged. > ++ */ > ++ memset(&ct->tuplehash[IP_CT_DIR_MAX], 0, > ++ sizeof(*ct) - offsetof(struct nf_conn, > tuplehash[IP_CT_DIR_MAX])); > + ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig; > ++ ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode.pprev = NULL; > + ct->tuplehash[IP_CT_DIR_REPLY].tuple = *repl; > ++ ct->tuplehash[IP_CT_DIR_REPLY].hnnode.pprev = NULL; > + /* Don't set timer yet: wait for confirmation */ > + setup_timer(&ct->timeout, death_by_timeout, (unsigned long)ct); > + #ifdef CONFIG_NET_NS > + ct->ct_net = net; > + #endif > + > ++ /* > ++ * changes to lookup keys must be done before setting refcnt to 1 > ++ */ > ++ smp_wmb(); > ++ atomic_set(&ct->ct_general.use, 1); > + return ct; > + } > + EXPORT_SYMBOL_GPL(nf_conntrack_alloc); > +diff --git a/net/netfilter/nf_conntrack_proto_tcp.c > b/net/netfilter/nf_conntrack_proto_tcp.c > +index 97a6e93..a38bc22 100644 > +--- a/net/netfilter/nf_conntrack_proto_tcp.c > ++++ b/net/netfilter/nf_conntrack_proto_tcp.c > +@@ -706,8 +706,8 @@ static bool tcp_in_window(const struct nf_conn *ct, > + /* Caller must linearize skb at tcp header. */ > + void nf_conntrack_tcp_update(const struct sk_buff *skb, > + unsigned int dataoff, > +- struct nf_conn *ct, > +- int dir) > ++ struct nf_conn *ct, int dir, > ++ s16 offset) > + { > + const struct tcphdr *tcph = (const void *)skb->data + dataoff; > + const struct ip_ct_tcp_state *sender = &ct->proto.tcp.seen[dir]; > +@@ -720,7 +720,7 @@ void nf_conntrack_tcp_update(const struct sk_buff *skb, > + /* > + * We have to worry for the ack in the reply packet only... > + */ > +- if (after(end, ct->proto.tcp.seen[dir].td_end)) > ++ if (ct->proto.tcp.seen[dir].td_end + offset == end) > + ct->proto.tcp.seen[dir].td_end = end; > + ct->proto.tcp.last_end = end; > + write_unlock_bh(&tcp_lock); > +diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c > +index beb3731..4e62030 100644 > +--- a/net/netfilter/nf_log.c > ++++ b/net/netfilter/nf_log.c > +@@ -47,7 +47,6 @@ int nf_log_register(u_int8_t pf, struct nf_logger *logger) > + mutex_lock(&nf_log_mutex); > + > + if (pf == NFPROTO_UNSPEC) { > +- int i; > + for (i = NFPROTO_UNSPEC; i < NFPROTO_NUMPROTO; i++) > + list_add_tail(&(logger->list[i]), &(nf_loggers_l[i])); > + } else { > +@@ -216,7 +215,7 @@ static const struct file_operations nflog_file_ops = { > + #endif /* PROC_FS */ > + > + #ifdef CONFIG_SYSCTL > +-struct ctl_path nf_log_sysctl_path[] = { > ++static struct ctl_path nf_log_sysctl_path[] = { > + { .procname = "net", .ctl_name = CTL_NET, }, > + { .procname = "netfilter", .ctl_name = NET_NETFILTER, }, > + { .procname = "nf_log", .ctl_name = CTL_UNNUMBERED, }, > +@@ -228,19 +227,26 @@ static struct ctl_table > nf_log_sysctl_table[NFPROTO_NUMPROTO+1]; > + static struct ctl_table_header *nf_log_dir_header; > + > + static int nf_log_proc_dostring(ctl_table *table, int write, struct file > *filp, > +- void *buffer, size_t *lenp, loff_t *ppos) > ++ void __user *buffer, size_t *lenp, loff_t *ppos) > + { > + const struct nf_logger *logger; > ++ char buf[NFLOGGER_NAME_LEN]; > ++ size_t size = *lenp; > + int r = 0; > + int tindex = (unsigned long)table->extra1; > + > + if (write) { > +- if (!strcmp(buffer, "NONE")) { > ++ if (size > sizeof(buf)) > ++ size = sizeof(buf); > ++ if (copy_from_user(buf, buffer, size)) > ++ return -EFAULT; > ++ > ++ if (!strcmp(buf, "NONE")) { > + nf_log_unbind_pf(tindex); > + return 0; > + } > + mutex_lock(&nf_log_mutex); > +- logger = __find_logger(tindex, buffer); > ++ logger = __find_logger(tindex, buf); > + if (logger == NULL) { > + mutex_unlock(&nf_log_mutex); > + return -ENOENT; > +@@ -248,14 +254,14 @@ static int nf_log_proc_dostring(ctl_table *table, int > write, struct file *filp, > + rcu_assign_pointer(nf_loggers[tindex], logger); > + mutex_unlock(&nf_log_mutex); > + } else { > +- rcu_read_lock(); > +- logger = rcu_dereference(nf_loggers[tindex]); > ++ mutex_lock(&nf_log_mutex); > ++ logger = nf_loggers[tindex]; > + if (!logger) > + table->data = "NONE"; > + else > + table->data = logger->name; > + r = proc_dostring(table, write, filp, buffer, lenp, ppos); > +- rcu_read_unlock(); > ++ mutex_unlock(&nf_log_mutex); > + } > + > + return r; > +diff --git a/net/netfilter/xt_quota.c b/net/netfilter/xt_quota.c > +index 01dd07b..98fc190 100644 > +--- a/net/netfilter/xt_quota.c > ++++ b/net/netfilter/xt_quota.c > +@@ -54,6 +54,7 @@ static bool quota_mt_check(const struct xt_mtchk_param > *par) > + if (q->master == NULL) > + return -ENOMEM; > + > ++ q->master->quota = q->quota; > + return true; > + } > + > +diff --git a/net/netfilter/xt_rateest.c b/net/netfilter/xt_rateest.c > +index 220a1d5..4fc6a91 100644 > +--- a/net/netfilter/xt_rateest.c > ++++ b/net/netfilter/xt_rateest.c > +@@ -66,7 +66,7 @@ xt_rateest_mt(const struct sk_buff *skb, const struct > xt_match_param *par) > + if (info->flags & XT_RATEEST_MATCH_BPS) > + ret &= bps1 == bps2; > + if (info->flags & XT_RATEEST_MATCH_PPS) > +- ret &= pps2 == pps2; > ++ ret &= pps1 == pps2; > + break; > + } > + > +diff --git a/net/wireless/scan.c b/net/wireless/scan.c > +index 1f260c4..bc7f788 100644 > +--- a/net/wireless/scan.c > ++++ b/net/wireless/scan.c > +@@ -365,7 +365,6 @@ cfg80211_bss_update(struct cfg80211_registered_device > *dev, > + found = rb_find_bss(dev, res); > + > + if (found) { > +- kref_get(&found->ref); > + found->pub.beacon_interval = res->pub.beacon_interval; > + found->pub.tsf = res->pub.tsf; > + found->pub.signal = res->pub.signal; > +diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c > +index bfac30f..a31412b 100644 > +--- a/sound/pci/ca0106/ca0106_main.c > ++++ b/sound/pci/ca0106/ca0106_main.c > +@@ -325,9 +325,9 @@ static struct snd_pcm_hardware snd_ca0106_capture_hw = { > + .rate_max = 192000, > + .channels_min = 2, > + .channels_max = 2, > +- .buffer_bytes_max = ((65536 - 64) * 8), > ++ .buffer_bytes_max = 65536 - 128, > + .period_bytes_min = 64, > +- .period_bytes_max = (65536 - 64), > ++ .period_bytes_max = 32768 - 64, > + .periods_min = 2, > + .periods_max = 2, > + .fifo_size = 0, > +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c > +index f09324a..18e8dad 100644 > +--- a/sound/pci/hda/patch_realtek.c > ++++ b/sound/pci/hda/patch_realtek.c > +@@ -10204,6 +10204,18 @@ static void alc262_lenovo_3000_unsol_event(struct > hda_codec *codec, > + alc262_lenovo_3000_automute(codec, 1); > + } > + > ++static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid, > ++ int dir, int idx, long *valp) > ++{ > ++ int i, change = 0; > ++ > ++ for (i = 0; i < 2; i++, valp++) > ++ change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx, > ++ HDA_AMP_MUTE, > ++ *valp ? 0 : HDA_AMP_MUTE); > ++ return change; > ++} > ++ > + /* bind hp and internal speaker mute (with plug check) */ > + static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, > + struct snd_ctl_elem_value *ucontrol) > +@@ -10212,13 +10224,8 @@ static int alc262_fujitsu_master_sw_put(struct > snd_kcontrol *kcontrol, > + long *valp = ucontrol->value.integer.value; > + int change; > + > +- change = snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, > +- HDA_AMP_MUTE, > +- valp ? 0 : HDA_AMP_MUTE); > +- change |= snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, > +- HDA_AMP_MUTE, > +- valp ? 0 : HDA_AMP_MUTE); > +- > ++ change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp); > ++ change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); > + if (change) > + alc262_fujitsu_automute(codec, 0); > + return change; > +@@ -10253,10 +10260,7 @@ static int alc262_lenovo_3000_master_sw_put(struct > snd_kcontrol *kcontrol, > + long *valp = ucontrol->value.integer.value; > + int change; > + > +- change = snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, > +- HDA_AMP_MUTE, > +- valp ? 0 : HDA_AMP_MUTE); > +- > ++ change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); > + if (change) > + alc262_lenovo_3000_automute(codec, 0); > + return change; > +@@ -11377,12 +11381,7 @@ static int alc268_acer_master_sw_put(struct > snd_kcontrol *kcontrol, > + long *valp = ucontrol->value.integer.value; > + int change; > + > +- change = snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0, > +- HDA_AMP_MUTE, > +- valp[0] ? 0 : HDA_AMP_MUTE); > +- change |= snd_hda_codec_amp_update(codec, 0x14, 1, HDA_OUTPUT, 0, > +- HDA_AMP_MUTE, > +- valp[1] ? 0 : HDA_AMP_MUTE); > ++ change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp); > + if (change) > + alc268_acer_automute(codec, 0); > + return change; > +diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c > +index d2fd8ef..4e971b6 100644 > +--- a/sound/pci/hda/patch_sigmatel.c > ++++ b/sound/pci/hda/patch_sigmatel.c > +@@ -2325,6 +2325,7 @@ static struct snd_pci_quirk stac9205_cfg_tbl[] = { > + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228, > + "Dell Vostro 1500", STAC_9205_DELL_M42), > + /* Gateway */ > ++ SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD), > + SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD), > + {} /* terminator */ > + }; > +@@ -5661,6 +5662,8 @@ static unsigned int > *stac9872_brd_tbl[STAC_9872_MODELS] = { > + }; > + > + static struct snd_pci_quirk stac9872_cfg_tbl[] = { > ++ SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0, > ++ "Sony VAIO F/S", STAC_9872_VAIO), > + {} /* terminator */ > + }; > + > +@@ -5673,6 +5676,8 @@ static int patch_stac9872(struct hda_codec *codec) > + if (spec == NULL) > + return -ENOMEM; > + codec->spec = spec; > ++ spec->num_pins = ARRAY_SIZE(stac9872_pin_nids); > ++ spec->pin_nids = stac9872_pin_nids; > + > + spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS, > + stac9872_models, > +@@ -5684,8 +5689,6 @@ static int patch_stac9872(struct hda_codec *codec) > + stac92xx_set_config_regs(codec, > + stac9872_brd_tbl[spec->board_config]); > + > +- spec->num_pins = ARRAY_SIZE(stac9872_pin_nids); > +- spec->pin_nids = stac9872_pin_nids; > + spec->multiout.dac_nids = spec->dac_nids; > + spec->num_adcs = ARRAY_SIZE(stac9872_adc_nids); > + spec->adc_nids = stac9872_adc_nids; > +diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c > +index bc5ce11..b369504 100644 > +--- a/sound/pci/oxygen/virtuoso.c > ++++ b/sound/pci/oxygen/virtuoso.c > +@@ -621,6 +621,8 @@ static void xonar_d2_resume(struct oxygen *chip) > + > + static void xonar_d1_resume(struct oxygen *chip) > + { > ++ oxygen_set_bits8(chip, OXYGEN_FUNCTION, OXYGEN_FUNCTION_RESET_CODEC); > ++ msleep(1); > + cs43xx_init(chip); > + xonar_enable_output(chip); > + } > +diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c > +index a6e8f3f..40d4116 100644 > +--- a/sound/soc/codecs/wm8753.c > ++++ b/sound/soc/codecs/wm8753.c > +@@ -1664,7 +1664,7 @@ static int wm8753_register(struct wm8753_priv *wm8753) > + codec->reg_cache = &wm8753->reg_cache; > + codec->private_data = wm8753; > + > +- memcpy(codec->reg_cache, wm8753_reg, sizeof(codec->reg_cache)); > ++ memcpy(codec->reg_cache, wm8753_reg, sizeof(wm8753->reg_cache)); > + INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work); > + > + ret = wm8753_reset(codec); > +diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c > +index a6b8848..6ea6868 100644 > +--- a/sound/usb/usbaudio.c > ++++ b/sound/usb/usbaudio.c > +@@ -2649,7 +2649,7 @@ static int parse_audio_endpoints(struct snd_usb_audio > *chip, int iface_no) > + struct usb_interface_descriptor *altsd; > + int i, altno, err, stream; > + int format; > +- struct audioformat *fp; > ++ struct audioformat *fp = NULL; > + unsigned char *fmt, *csep; > + int num; > + > +@@ -2722,6 +2722,18 @@ static int parse_audio_endpoints(struct snd_usb_audio > *chip, int iface_no) > + continue; > + } > + > ++ /* > ++ * Blue Microphones workaround: The last altsetting is identical > ++ * with the previous one, except for a larger packet size, but > ++ * is actually a mislabeled two-channel setting; ignore it. > ++ */ > ++ if (fmt[4] == 1 && fmt[5] == 2 && altno == 2 && num == 3 && > ++ fp && fp->altsetting == 1 && fp->channels == 1 && > ++ fp->format == SNDRV_PCM_FORMAT_S16_LE && > ++ le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) == > ++ fp->maxpacksize * 2) > ++ continue; > ++ > + csep = snd_usb_find_desc(alts->endpoint[0].extra, > alts->endpoint[0].extralen, NULL, USB_DT_CS_ENDPOINT); > + /* Creamware Noah has this descriptor after the 2nd endpoint */ > + if (!csep && altsd->bNumEndpoints >= 2) > > Modified: dists/sid/linux-2.6/debian/patches/series/5 > ============================================================================== > --- dists/sid/linux-2.6/debian/patches/series/5 Fri Jul 31 06:25:10 > 2009 (r14059) > +++ dists/sid/linux-2.6/debian/patches/series/5 Fri Jul 31 11:38:53 > 2009 (r14060) > @@ -1,2 +1,3 @@ > -+ > bugfix/all/ecryptfs-parse_tag_3_packet-check-tag-3-package-encrypted-key-size.patch > -+ bugfix/all/ecryptfs-check-tag-11-literal-data-buffer-size.patch > +- bugfix/parisc/ensure-broadcast-tlb-purge-runs-single-threaded.patch > +- bugfix/parisc/fix-ldcw-inline-assembler.patch > ++ bugfix/all/stable/2.6.30.4.patch > > _______________________________________________ > Kernel-svn-changes mailing list > Kernel-svn-changes@xxxxxxxxxxxxxxxxxxxxxxx > http://lists.alioth.debian.org/mailman/listinfo/kernel-svn-changes > -- dann frazier -- To UNSUBSCRIBE, email to debian-kernel-REQUEST@xxxxxxxxxxxxxxxx with a subject of "unsubscribe". Trouble? Contact listmaster@xxxxxxxxxxxxxxxx
|
|
||||||||||||||||||||||||||
|
|
|
| News | Mail Home | sitemap | FAQ | advertise |