[kernel] r11942 - in dists/sid/linux-2.6/debian: . patches/bugfix/all/stable patches/series

Bastian Blank waldi at alioth.debian.org
Sat Aug 2 07:03:49 UTC 2008


Author: waldi
Date: Sat Aug  2 07:03:47 2008
New Revision: 11942

Log:
Add stable release 2.6.26.1.

* debian/changelog: Update.
* debian/patches/bugfix/all/stable/2.6.26.1.patch: Add.
* debian/patches/series/2: Add new patch.


Added:
   dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.26.1.patch
   dists/sid/linux-2.6/debian/patches/series/2
Modified:
   dists/sid/linux-2.6/debian/changelog

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	(original)
+++ dists/sid/linux-2.6/debian/changelog	Sat Aug  2 07:03:47 2008
@@ -2,6 +2,69 @@
 
   * [powerpc] Install arch/powerpc/lib/crtsavres.o into the headers, it is
     used during module linking.
+  * Add stable release 2.6.26.1:
+    - Fix off-by-one error in iov_iter_advance()
+    - ath5k: don't enable MSI, we cannot handle it yet
+    - b43legacy: Release mutex in error handling code
+    - cpufreq acpi: only call _PPC after cpufreq ACPI init funcs got called already
+    - VFS: increase pseudo-filesystem block size to PAGE_SIZE
+    - markers: fix markers read barrier for multiple probes
+    - tmpfs: fix kernel BUG in shmem_delete_inode
+    - mpc52xx_psc_spi: fix block transfer
+    - ixgbe: remove device ID for unsupported device
+    - UML - Fix boot crash
+    - eCryptfs: use page_alloc not kmalloc to get a page of memory
+    - x86: fix kernel_physical_mapping_init() for large x86 systems
+    - DVB: cx23885: SRAM changes for the 885 and 887 silicon parts
+    - DVB: cx23885: Reallocated the sram to avoid concurrent VIDB/C issues
+    - DVB: cx23885: DVB Transport cards using DVB port VIDB/TS1 did not stream
+    - DVB: cx23885: Ensure PAD_CTRL is always reset to a sensible default
+    - V4L: cx23885: Bugfix for concurrent use of /dev/video0 and /dev/video1
+    - V4L: saa7134: Copy tuner data earlier to avoid overwriting manual tuner type
+    - V4L: uvcvideo: Add support for Medion Akoya Mini E1210 integrated webcam
+    - V4L: uvcvideo: Make input device support optional
+    - V4L: uvcvideo: Don't free URB buffers on suspend
+    - V4L: uvcvideo: Use GFP_NOIO when allocating memory during resume
+    - V4L: uvcvideo: Fix a buffer overflow in format descriptor parsing
+    - DVB: dib0700: add support for Hauppauge Nova-TD Stick 52009
+    - V4L: cx18: Upgrade to newer firmware & update documentation
+    - ALSA: trident - pause s/pdif output
+    - myri10ge: do not use mgp->max_intr_slots before loading the firmware
+    - myri10ge: do not forget to setup the single slice pointers
+    - iop-adma: fix platform driver hotplug/coldplug
+    - sparc64: Do not define BIO_VMERGE_BOUNDARY.
+    - sparc64: Fix cpufreq notifier registry.
+    - sparc64: Fix lockdep issues in LDC protocol layer.
+    - tcp: Clear probes_out more aggressively in tcp_ack().
+    - ARM: fix fls() for 64-bit arguments
+    - vmlinux.lds: move __attribute__((__cold__)) functions back into final .text section
+    - rtc-at91rm9200: avoid spurious irqs
+    - ide-cd: fix oops when using growisofs
+    - x86: fix crash due to missing debugctlmsr on AMD K6-3
+    - cpusets: fix wrong domain attr updates
+    - proc: fix /proc/*/pagemap some more
+    - Fix build on COMPAT platforms when CONFIG_EPOLL is disabled
+    - markers: fix duplicate modpost entry
+    - x86, suspend, acpi: enter Big Real Mode
+    - USB: fix usb serial pm counter decrement for disconnected interfaces
+    - x86 reboot quirks: add Dell Precision WorkStation T5400
+    - Fix typos from signal_32/64.h merge
+    - rcu: fix rcu_try_flip_waitack_needed() to prevent grace-period stall
+    - Patch Upstream: x86 ptrace: fix PTRACE_GETFPXREGS error
+    - KVM: MMU: Fix potential race setting upper shadow ptes on nonpae hosts
+    - KVM: MMU: nuke shadowed pgtable pages and ptes on memslot destruction
+    - KVM: x86 emulator: Fix HLT instruction
+    - KVM: VMX: Add ept_sync_context in flush_tlb
+    - KVM: mmu_shrink: kvm_mmu_zap_page requires slots_lock to be held
+    - KVM: SVM: fix suspend/resume support
+    - KVM: VMX: Fix a wrong usage of vmcs_config
+    - isofs: fix minor filesystem corruption
+    - quota: fix possible infinite loop in quota code
+    - hdlcdrv: Fix CRC calculation.
+    - ipv6: __KERNEL__ ifdef struct ipv6_devconf
+    - ipv6: use timer pending
+    - udplite: Protection against coverage value wrap-around
+    - pxamci: trivial fix of DMA alignment register bit clearing
 
  -- Bastian Blank <waldi at debian.org>  Thu, 31 Jul 2008 19:45:03 +0200
 

Added: dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.26.1.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.26.1.patch	Sat Aug  2 07:03:47 2008
@@ -0,0 +1,2187 @@
+diff --git a/Documentation/networking/udplite.txt b/Documentation/networking/udplite.txt
+index 3870f28..855d8da 100644
+--- a/Documentation/networking/udplite.txt
++++ b/Documentation/networking/udplite.txt
+@@ -148,7 +148,7 @@
+         getsockopt(sockfd, SOL_SOCKET, SO_NO_CHECK, &value, ...);
+ 
+   is meaningless (as in TCP). Packets with a zero checksum field are
+-  illegal (cf. RFC 3828, sec. 3.1) will be silently discarded.
++  illegal (cf. RFC 3828, sec. 3.1) and will be silently discarded.
+ 
+   4) Fragmentation
+ 
+diff --git a/Documentation/video4linux/cx18.txt b/Documentation/video4linux/cx18.txt
+index 6842c26..63f3aef 100644
+--- a/Documentation/video4linux/cx18.txt
++++ b/Documentation/video4linux/cx18.txt
+@@ -23,14 +23,8 @@ encoder chip:
+ 
+ Firmware:
+ 
+-The firmware needs to be extracted from the Windows Hauppauge HVR-1600
+-driver, available here:
++You can obtain the firmware files here:
+ 
+-http://hauppauge.lightpath.net/software/install_cd/hauppauge_cd_3.4d1.zip
++http://dl.ivtvdriver.org/ivtv/firmware/cx18-firmware.tar.gz
+ 
+-Unzip, then copy the following files to the firmware directory
+-and rename them as follows:
+-
+-Drivers/Driver18/hcw18apu.rom -> v4l-cx23418-apu.fw
+-Drivers/Driver18/hcw18enc.rom -> v4l-cx23418-cpu.fw
+-Drivers/Driver18/hcw18mlC.rom -> v4l-cx23418-dig.fw
++Untar and copy the .fw files to your firmware directory.
+diff --git a/Makefile b/Makefile
+index e3c5eb6..c536d7b 100644
+diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
+index 318b811..5152ba0 100644
+--- a/arch/ia64/kvm/kvm-ia64.c
++++ b/arch/ia64/kvm/kvm-ia64.c
+@@ -1460,6 +1460,9 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ 	return 0;
+ }
+ 
++void kvm_arch_flush_shadow(struct kvm *kvm)
++{
++}
+ 
+ long kvm_arch_dev_ioctl(struct file *filp,
+ 		unsigned int ioctl, unsigned long arg)
+diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
+index 777e0f3..1eaa3e4 100644
+--- a/arch/powerpc/kvm/powerpc.c
++++ b/arch/powerpc/kvm/powerpc.c
+@@ -167,6 +167,10 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ 	return 0;
+ }
+ 
++void kvm_arch_flush_shadow(struct kvm *kvm)
++{
++}
++
+ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
+ {
+ 	struct kvm_vcpu *vcpu;
+diff --git a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c b/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
+index 69288f6..3233fe8 100644
+--- a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
++++ b/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
+@@ -96,6 +96,12 @@ static int pmi_notifier(struct notifier_block *nb,
+ 	struct cpufreq_frequency_table *cbe_freqs;
+ 	u8 node;
+ 
++	/* Should this really be called for CPUFREQ_ADJUST, CPUFREQ_INCOMPATIBLE
++	 * and CPUFREQ_NOTIFY policy events?)
++	 */
++	if (event == CPUFREQ_START)
++		return 0;
++
+ 	cbe_freqs = cpufreq_frequency_get_table(policy->cpu);
+ 	node = cbe_cpu_to_node(policy->cpu);
+ 
+diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
+index 6558b09..b19c170 100644
+--- a/arch/s390/kvm/kvm-s390.c
++++ b/arch/s390/kvm/kvm-s390.c
+@@ -672,6 +672,10 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ 	return 0;
+ }
+ 
++void kvm_arch_flush_shadow(struct kvm *kvm)
++{
++}
++
+ gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
+ {
+ 	return gfn;
+diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c
+index b441a26..c481673 100644
+--- a/arch/sparc64/kernel/irq.c
++++ b/arch/sparc64/kernel/irq.c
+@@ -621,8 +621,9 @@ unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino)
+ unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino)
+ {
+ 	struct irq_handler_data *data;
+-	struct ino_bucket *bucket;
+ 	unsigned long hv_err, cookie;
++	struct ino_bucket *bucket;
++	struct irq_desc *desc;
+ 	unsigned int virt_irq;
+ 
+ 	bucket = kzalloc(sizeof(struct ino_bucket), GFP_ATOMIC);
+@@ -643,6 +644,13 @@ unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino)
+ 	if (unlikely(!data))
+ 		return 0;
+ 
++	/* In order to make the LDC channel startup sequence easier,
++	 * especially wrt. locking, we do not let request_irq() enable
++	 * the interrupt.
++	 */
++	desc = irq_desc + virt_irq;
++	desc->status |= IRQ_NOAUTOEN;
++
+ 	set_irq_chip_data(virt_irq, data);
+ 
+ 	/* Catch accidental accesses to these things.  IMAP/ICLR handling
+diff --git a/arch/sparc64/kernel/ldc.c b/arch/sparc64/kernel/ldc.c
+index 63969f6..d689823 100644
+--- a/arch/sparc64/kernel/ldc.c
++++ b/arch/sparc64/kernel/ldc.c
+@@ -1,6 +1,6 @@
+ /* ldc.c: Logical Domain Channel link-layer protocol driver.
+  *
+- * Copyright (C) 2007 David S. Miller <davem at davemloft.net>
++ * Copyright (C) 2007, 2008 David S. Miller <davem at davemloft.net>
+  */
+ 
+ #include <linux/kernel.h>
+@@ -23,8 +23,8 @@
+ 
+ #define DRV_MODULE_NAME		"ldc"
+ #define PFX DRV_MODULE_NAME	": "
+-#define DRV_MODULE_VERSION	"1.0"
+-#define DRV_MODULE_RELDATE	"June 25, 2007"
++#define DRV_MODULE_VERSION	"1.1"
++#define DRV_MODULE_RELDATE	"July 22, 2008"
+ 
+ static char version[] __devinitdata =
+ 	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
+@@ -1235,13 +1235,9 @@ int ldc_bind(struct ldc_channel *lp, const char *name)
+ 	unsigned long hv_err, flags;
+ 	int err = -EINVAL;
+ 
+-	spin_lock_irqsave(&lp->lock, flags);
+-
+-	if (!name)
+-		goto out_err;
+-
+-	if (lp->state != LDC_STATE_INIT)
+-		goto out_err;
++	if (!name ||
++	    (lp->state != LDC_STATE_INIT))
++		return -EINVAL;
+ 
+ 	snprintf(lp->rx_irq_name, LDC_IRQ_NAME_MAX, "%s RX", name);
+ 	snprintf(lp->tx_irq_name, LDC_IRQ_NAME_MAX, "%s TX", name);
+@@ -1250,25 +1246,32 @@ int ldc_bind(struct ldc_channel *lp, const char *name)
+ 			  IRQF_SAMPLE_RANDOM | IRQF_SHARED,
+ 			  lp->rx_irq_name, lp);
+ 	if (err)
+-		goto out_err;
++		return err;
+ 
+ 	err = request_irq(lp->cfg.tx_irq, ldc_tx,
+ 			  IRQF_SAMPLE_RANDOM | IRQF_SHARED,
+ 			  lp->tx_irq_name, lp);
+-	if (err)
+-		goto out_free_rx_irq;
++	if (err) {
++		free_irq(lp->cfg.rx_irq, lp);
++		return err;
++	}
++
+ 
++	spin_lock_irqsave(&lp->lock, flags);
++
++	enable_irq(lp->cfg.rx_irq);
++	enable_irq(lp->cfg.tx_irq);
+ 
+ 	lp->flags |= LDC_FLAG_REGISTERED_IRQS;
+ 
+ 	err = -ENODEV;
+ 	hv_err = sun4v_ldc_tx_qconf(lp->id, 0, 0);
+ 	if (hv_err)
+-		goto out_free_tx_irq;
++		goto out_free_irqs;
+ 
+ 	hv_err = sun4v_ldc_tx_qconf(lp->id, lp->tx_ra, lp->tx_num_entries);
+ 	if (hv_err)
+-		goto out_free_tx_irq;
++		goto out_free_irqs;
+ 
+ 	hv_err = sun4v_ldc_rx_qconf(lp->id, 0, 0);
+ 	if (hv_err)
+@@ -1304,14 +1307,11 @@ out_unmap_rx:
+ out_unmap_tx:
+ 	sun4v_ldc_tx_qconf(lp->id, 0, 0);
+ 
+-out_free_tx_irq:
++out_free_irqs:
+ 	lp->flags &= ~LDC_FLAG_REGISTERED_IRQS;
+ 	free_irq(lp->cfg.tx_irq, lp);
+-
+-out_free_rx_irq:
+ 	free_irq(lp->cfg.rx_irq, lp);
+ 
+-out_err:
+ 	spin_unlock_irqrestore(&lp->lock, flags);
+ 
+ 	return err;
+diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c
+index e5d2389..f464023 100644
+--- a/arch/sparc64/kernel/time.c
++++ b/arch/sparc64/kernel/time.c
+@@ -883,6 +883,16 @@ static struct notifier_block sparc64_cpufreq_notifier_block = {
+ 	.notifier_call	= sparc64_cpufreq_notifier
+ };
+ 
++static int __init register_sparc64_cpufreq_notifier(void)
++{
++
++	cpufreq_register_notifier(&sparc64_cpufreq_notifier_block,
++				  CPUFREQ_TRANSITION_NOTIFIER);
++	return 0;
++}
++
++core_initcall(register_sparc64_cpufreq_notifier);
++
+ #endif /* CONFIG_CPU_FREQ */
+ 
+ static int sparc64_next_event(unsigned long delta,
+@@ -1049,11 +1059,6 @@ void __init time_init(void)
+ 	       sparc64_clockevent.mult, sparc64_clockevent.shift);
+ 
+ 	setup_sparc64_timer();
+-
+-#ifdef CONFIG_CPU_FREQ
+-	cpufreq_register_notifier(&sparc64_cpufreq_notifier_block,
+-				  CPUFREQ_TRANSITION_NOTIFIER);
+-#endif
+ }
+ 
+ unsigned long long sched_clock(void)
+diff --git a/arch/um/include/init.h b/arch/um/include/init.h
+index b00a957..37dd097 100644
+--- a/arch/um/include/init.h
++++ b/arch/um/include/init.h
+@@ -45,6 +45,8 @@ typedef void (*exitcall_t)(void);
+ # define __section(S) __attribute__ ((__section__(#S)))
+ #endif
+ 
++#if __GNUC__ == 3
++
+ #if __GNUC_MINOR__ >= 3
+ # define __used			__attribute__((__used__))
+ #else
+@@ -52,6 +54,12 @@ typedef void (*exitcall_t)(void);
+ #endif
+ 
+ #else
++#if __GNUC__ == 4
++# define __used			__attribute__((__used__))
++#endif
++#endif
++
++#else
+ #include <linux/compiler.h>
+ #endif
+ /* These are for everybody (although not all archs will actually
+diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu
+index 2ad6301..dd138a2 100644
+--- a/arch/x86/Kconfig.cpu
++++ b/arch/x86/Kconfig.cpu
+@@ -414,4 +414,4 @@ config X86_MINIMUM_CPU_FAMILY
+ 
+ config X86_DEBUGCTLMSR
+ 	def_bool y
+-	depends on !(M586MMX || M586TSC || M586 || M486 || M386)
++	depends on !(MK6 || MWINCHIPC6 || MWINCHIP2 || MWINCHIP3D || MCYRIXIII || M586MMX || M586TSC || M586 || M486 || M386)
+diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
+index 36af01f..130711f 100644
+--- a/arch/x86/kernel/acpi/sleep.c
++++ b/arch/x86/kernel/acpi/sleep.c
+@@ -23,6 +23,15 @@ static unsigned long acpi_realmode;
+ static char temp_stack[10240];
+ #endif
+ 
++/* XXX: this macro should move to asm-x86/segment.h and be shared with the
++   boot code... */
++#define GDT_ENTRY(flags, base, limit)		\
++	(((u64)(base & 0xff000000) << 32) |	\
++	 ((u64)flags << 40) |			\
++	 ((u64)(limit & 0x00ff0000) << 32) |	\
++	 ((u64)(base & 0x00ffffff) << 16) |	\
++	 ((u64)(limit & 0x0000ffff)))
++
+ /**
+  * acpi_save_state_mem - save kernel state
+  *
+@@ -58,11 +67,11 @@ int acpi_save_state_mem(void)
+ 			((char *)&header->wakeup_gdt - (char *)acpi_realmode))
+ 				<< 16);
+ 	/* GDT[1]: real-mode-like code segment */
+-	header->wakeup_gdt[1] = (0x009bULL << 40) +
+-		((u64)acpi_wakeup_address << 16) + 0xffff;
++	header->wakeup_gdt[1] =
++		GDT_ENTRY(0x809b, acpi_wakeup_address, 0xfffff);
+ 	/* GDT[2]: real-mode-like data segment */
+-	header->wakeup_gdt[2] = (0x0093ULL << 40) +
+-		((u64)acpi_wakeup_address << 16) + 0xffff;
++	header->wakeup_gdt[2] =
++		GDT_ENTRY(0x8093, acpi_wakeup_address, 0xfffff);
+ 
+ #ifndef CONFIG_64BIT
+ 	store_gdt((struct desc_ptr *)&header->pmode_gdt);
+diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
+index 95e80e5..eb9ddd8 100644
+--- a/arch/x86/kernel/i387.c
++++ b/arch/x86/kernel/i387.c
+@@ -162,7 +162,7 @@ int xfpregs_get(struct task_struct *target, const struct user_regset *regset,
+ 	int ret;
+ 
+ 	if (!cpu_has_fxsr)
+-		return -EIO;
++		return -ENODEV;
+ 
+ 	ret = init_fpu(target);
+ 	if (ret)
+@@ -179,7 +179,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,
+ 	int ret;
+ 
+ 	if (!cpu_has_fxsr)
+-		return -EIO;
++		return -ENODEV;
+ 
+ 	ret = init_fpu(target);
+ 	if (ret)
+diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
+index a7835f2..77040b6 100644
+--- a/arch/x86/kernel/ptrace.c
++++ b/arch/x86/kernel/ptrace.c
+@@ -943,13 +943,13 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
+ 		return copy_regset_to_user(child, &user_x86_32_view,
+ 					   REGSET_XFP,
+ 					   0, sizeof(struct user_fxsr_struct),
+-					   datap);
++					   datap) ? -EIO : 0;
+ 
+ 	case PTRACE_SETFPXREGS:	/* Set the child extended FPU state. */
+ 		return copy_regset_from_user(child, &user_x86_32_view,
+ 					     REGSET_XFP,
+ 					     0, sizeof(struct user_fxsr_struct),
+-					     datap);
++					     datap) ? -EIO : 0;
+ #endif
+ 
+ #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
+diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
+index f6be7d5..d834b36 100644
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -177,6 +177,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
+ 			DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2400"),
+ 		},
+ 	},
++	{	/* Handle problems with rebooting on Dell T5400's */
++		.callback = set_bios_reboot,
++		.ident = "Dell Precision T5400",
++		.matches = {
++			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++			DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"),
++		},
++	},
+ 	{	/* Handle problems with rebooting on HP laptops */
+ 		.callback = set_bios_reboot,
+ 		.ident = "HP Compaq Laptop",
+diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
+index 7e7c396..c26d811 100644
+--- a/arch/x86/kvm/mmu.c
++++ b/arch/x86/kvm/mmu.c
+@@ -1171,9 +1171,10 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write,
+ 				return -ENOMEM;
+ 			}
+ 
+-			table[index] = __pa(new_table->spt)
+-				| PT_PRESENT_MASK | PT_WRITABLE_MASK
+-				| shadow_user_mask | shadow_x_mask;
++			set_shadow_pte(&table[index],
++				       __pa(new_table->spt)
++				       | PT_PRESENT_MASK | PT_WRITABLE_MASK
++				       | shadow_user_mask | shadow_x_mask);
+ 		}
+ 		table_addr = table[index] & PT64_BASE_ADDR_MASK;
+ 	}
+@@ -1968,6 +1969,8 @@ static int mmu_shrink(int nr_to_scan, gfp_t gfp_mask)
+ 	list_for_each_entry(kvm, &vm_list, vm_list) {
+ 		int npages;
+ 
++		if (!down_read_trylock(&kvm->slots_lock))
++			continue;
+ 		spin_lock(&kvm->mmu_lock);
+ 		npages = kvm->arch.n_alloc_mmu_pages -
+ 			 kvm->arch.n_free_mmu_pages;
+@@ -1980,6 +1983,7 @@ static int mmu_shrink(int nr_to_scan, gfp_t gfp_mask)
+ 		nr_to_scan--;
+ 
+ 		spin_unlock(&kvm->mmu_lock);
++		up_read(&kvm->slots_lock);
+ 	}
+ 	if (kvm_freed)
+ 		list_move_tail(&kvm_freed->vm_list, &vm_list);
+diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
+index 6b0d5fa..06992d6 100644
+--- a/arch/x86/kvm/svm.c
++++ b/arch/x86/kvm/svm.c
+@@ -270,19 +270,11 @@ static int has_svm(void)
+ 
+ static void svm_hardware_disable(void *garbage)
+ {
+-	struct svm_cpu_data *svm_data
+-		= per_cpu(svm_data, raw_smp_processor_id());
+-
+-	if (svm_data) {
+-		uint64_t efer;
++	uint64_t efer;
+ 
+-		wrmsrl(MSR_VM_HSAVE_PA, 0);
+-		rdmsrl(MSR_EFER, efer);
+-		wrmsrl(MSR_EFER, efer & ~MSR_EFER_SVME_MASK);
+-		per_cpu(svm_data, raw_smp_processor_id()) = NULL;
+-		__free_page(svm_data->save_area);
+-		kfree(svm_data);
+-	}
++	wrmsrl(MSR_VM_HSAVE_PA, 0);
++	rdmsrl(MSR_EFER, efer);
++	wrmsrl(MSR_EFER, efer & ~MSR_EFER_SVME_MASK);
+ }
+ 
+ static void svm_hardware_enable(void *garbage)
+@@ -321,6 +313,19 @@ static void svm_hardware_enable(void *garbage)
+ 	       page_to_pfn(svm_data->save_area) << PAGE_SHIFT);
+ }
+ 
++static void svm_cpu_uninit(int cpu)
++{
++	struct svm_cpu_data *svm_data
++		= per_cpu(svm_data, raw_smp_processor_id());
++
++	if (!svm_data)
++		return;
++
++	per_cpu(svm_data, raw_smp_processor_id()) = NULL;
++	__free_page(svm_data->save_area);
++	kfree(svm_data);
++}
++
+ static int svm_cpu_init(int cpu)
+ {
+ 	struct svm_cpu_data *svm_data;
+@@ -458,6 +463,11 @@ err:
+ 
+ static __exit void svm_hardware_unsetup(void)
+ {
++	int cpu;
++
++	for_each_online_cpu(cpu)
++		svm_cpu_uninit(cpu);
++
+ 	__free_pages(pfn_to_page(iopm_base >> PAGE_SHIFT), IOPM_ALLOC_ORDER);
+ 	iopm_base = 0;
+ }
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index 540e951..2ce9063 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -88,6 +88,7 @@ static inline struct vcpu_vmx *to_vmx(struct kvm_vcpu *vcpu)
+ }
+ 
+ static int init_rmode(struct kvm *kvm);
++static u64 construct_eptp(unsigned long root_hpa);
+ 
+ static DEFINE_PER_CPU(struct vmcs *, vmxarea);
+ static DEFINE_PER_CPU(struct vmcs *, current_vmcs);
+@@ -1389,6 +1390,8 @@ static void exit_lmode(struct kvm_vcpu *vcpu)
+ static void vmx_flush_tlb(struct kvm_vcpu *vcpu)
+ {
+ 	vpid_sync_vcpu_all(to_vmx(vcpu));
++	if (vm_need_ept())
++		ept_sync_context(construct_eptp(vcpu->arch.mmu.root_hpa));
+ }
+ 
+ static void vmx_decache_cr4_guest_bits(struct kvm_vcpu *vcpu)
+@@ -1420,7 +1423,7 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0,
+ 	if (!(cr0 & X86_CR0_PG)) {
+ 		/* From paging/starting to nonpaging */
+ 		vmcs_write32(CPU_BASED_VM_EXEC_CONTROL,
+-			     vmcs_config.cpu_based_exec_ctrl |
++			     vmcs_read32(CPU_BASED_VM_EXEC_CONTROL) |
+ 			     (CPU_BASED_CR3_LOAD_EXITING |
+ 			      CPU_BASED_CR3_STORE_EXITING));
+ 		vcpu->arch.cr0 = cr0;
+@@ -1430,7 +1433,7 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0,
+ 	} else if (!is_paging(vcpu)) {
+ 		/* From nonpaging to paging */
+ 		vmcs_write32(CPU_BASED_VM_EXEC_CONTROL,
+-			     vmcs_config.cpu_based_exec_ctrl &
++			     vmcs_read32(CPU_BASED_VM_EXEC_CONTROL) &
+ 			     ~(CPU_BASED_CR3_LOAD_EXITING |
+ 			       CPU_BASED_CR3_STORE_EXITING));
+ 		vcpu->arch.cr0 = cr0;
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 63a77ca..5a7406e 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -4016,6 +4016,11 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ 	return 0;
+ }
+ 
++void kvm_arch_flush_shadow(struct kvm *kvm)
++{
++	kvm_mmu_zap_all(kvm);
++}
++
+ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
+ {
+ 	return vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE
+diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
+index 932f216..d41b9bc 100644
+--- a/arch/x86/kvm/x86_emulate.c
++++ b/arch/x86/kvm/x86_emulate.c
+@@ -1666,7 +1666,7 @@ special_insn:
+ 		break;
+ 	case 0xf4:              /* hlt */
+ 		ctxt->vcpu->arch.halt_request = 1;
+-		goto done;
++		break;
+ 	case 0xf5:	/* cmc */
+ 		/* complement carry flag from eflags reg */
+ 		ctxt->eflags ^= EFLG_CF;
+diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
+index 819dad9..7b27710 100644
+--- a/arch/x86/mm/init_64.c
++++ b/arch/x86/mm/init_64.c
+@@ -579,7 +579,7 @@ unsigned long __init_refok init_memory_mapping(unsigned long start, unsigned lon
+ 		else
+ 			pud = alloc_low_page(&pud_phys);
+ 
+-		next = start + PGDIR_SIZE;
++		next = (start + PGDIR_SIZE) & PGDIR_MASK;
+ 		if (next > end)
+ 			next = end;
+ 		last_map_addr = phys_pud_init(pud, __pa(start), __pa(next));
+diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c
+index d80b2d1..8c06a53 100644
+--- a/drivers/acpi/processor_perflib.c
++++ b/drivers/acpi/processor_perflib.c
+@@ -64,7 +64,13 @@ static DEFINE_MUTEX(performance_mutex);
+  * policy is adjusted accordingly.
+  */
+ 
+-static unsigned int ignore_ppc = 0;
++/* ignore_ppc:
++ * -1 -> cpufreq low level drivers not initialized -> _PSS, etc. not called yet
++ *       ignore _PPC
++ *  0 -> cpufreq low level drivers initialized -> consider _PPC values
++ *  1 -> ignore _PPC totally -> forced by user through boot param
++ */
++static unsigned int ignore_ppc = -1;
+ module_param(ignore_ppc, uint, 0644);
+ MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \
+ 		 "limited by BIOS, this should help");
+@@ -72,7 +78,7 @@ MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \
+ #define PPC_REGISTERED   1
+ #define PPC_IN_USE       2
+ 
+-static int acpi_processor_ppc_status = 0;
++static int acpi_processor_ppc_status;
+ 
+ static int acpi_processor_ppc_notifier(struct notifier_block *nb,
+ 				       unsigned long event, void *data)
+@@ -81,6 +87,11 @@ static int acpi_processor_ppc_notifier(struct notifier_block *nb,
+ 	struct acpi_processor *pr;
+ 	unsigned int ppc = 0;
+ 
++	if (event == CPUFREQ_START && ignore_ppc <= 0) {
++		ignore_ppc = 0;
++		return 0;
++	}
++
+ 	if (ignore_ppc)
+ 		return 0;
+ 
+diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
+index 1d41496..0471ef5 100644
+--- a/drivers/cpufreq/cpufreq.c
++++ b/drivers/cpufreq/cpufreq.c
+@@ -825,6 +825,9 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
+ 	policy->user_policy.min = policy->cpuinfo.min_freq;
+ 	policy->user_policy.max = policy->cpuinfo.max_freq;
+ 
++	blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
++				     CPUFREQ_START, policy);
++
+ #ifdef CONFIG_SMP
+ 
+ #ifdef CONFIG_HOTPLUG_CPU
+diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c
+index 0ec0f43..4e6b052 100644
+--- a/drivers/dma/iop-adma.c
++++ b/drivers/dma/iop-adma.c
+@@ -1387,6 +1387,8 @@ static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan)
+ 	spin_unlock_bh(&iop_chan->lock);
+ }
+ 
++MODULE_ALIAS("platform:iop-adma");
++
+ static struct platform_driver iop_adma_driver = {
+ 	.probe		= iop_adma_probe,
+ 	.remove		= iop_adma_remove,
+diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
+index 68e7f19..0cc854e 100644
+--- a/drivers/ide/ide-cd.c
++++ b/drivers/ide/ide-cd.c
+@@ -1308,13 +1308,30 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
+ 	req.cmd_flags |= REQ_QUIET;
+ 
+ 	stat = ide_cd_queue_pc(drive, &req);
+-	if (stat == 0) {
+-		*capacity = 1 + be32_to_cpu(capbuf.lba);
+-		*sectors_per_frame =
+-			be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS;
++	if (stat)
++		return stat;
++
++	/*
++	 * Sanity check the given block size
++	 */
++	switch (capbuf.blocklen) {
++	case __constant_cpu_to_be32(512):
++	case __constant_cpu_to_be32(1024):
++	case __constant_cpu_to_be32(2048):
++	case __constant_cpu_to_be32(4096):
++		break;
++	default:
++		printk(KERN_ERR "%s: weird block size %u\n",
++			drive->name, capbuf.blocklen);
++		printk(KERN_ERR "%s: default to 2kb block size\n",
++			drive->name);
++		capbuf.blocklen = __constant_cpu_to_be32(2048);
++		break;
+ 	}
+ 
+-	return stat;
++	*capacity = 1 + be32_to_cpu(capbuf.lba);
++	*sectors_per_frame = be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS;
++	return 0;
+ }
+ 
+ static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag,
+diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c
+index c4d40fe..3dd20bf 100644
+--- a/drivers/media/dvb/dvb-usb/dib0700_devices.c
++++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c
+@@ -1117,6 +1117,7 @@ struct usb_device_id dib0700_usb_id_table[] = {
+ 	{ USB_DEVICE(USB_VID_TERRATEC,	USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
+ 	{ USB_DEVICE(USB_VID_TERRATEC,	USB_PID_TERRATEC_CINERGY_T_XXS) },
+ 	{ USB_DEVICE(USB_VID_LEADTEK,   USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
++	{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
+ 	{ 0 }		/* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
+@@ -1372,7 +1373,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
+ 			}
+ 		},
+ 
+-		.num_device_descs = 2,
++		.num_device_descs = 3,
+ 		.devices = {
+ 			{   "DiBcom STK7070PD reference design",
+ 				{ &dib0700_usb_id_table[17], NULL },
+@@ -1381,6 +1382,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
+ 			{   "Pinnacle PCTV Dual DVB-T Diversity Stick",
+ 				{ &dib0700_usb_id_table[18], NULL },
+ 				{ NULL },
++			},
++			{   "Hauppauge Nova-TD Stick (52009)",
++				{ &dib0700_usb_id_table[35], NULL },
++				{ NULL },
+ 			}
+ 		}
+ 	}, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
+diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+index 34245d1..31ded10 100644
+--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
++++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+@@ -132,6 +132,7 @@
+ #define USB_PID_HAUPPAUGE_NOVA_T_STICK_3		0x7070
+ #define USB_PID_HAUPPAUGE_MYTV_T			0x7080
+ #define USB_PID_HAUPPAUGE_NOVA_TD_STICK			0x9580
++#define USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009		0x5200
+ #define USB_PID_AVERMEDIA_EXPRESS			0xb568
+ #define USB_PID_AVERMEDIA_VOLAR				0xa807
+ #define USB_PID_AVERMEDIA_VOLAR_2			0xb808
+diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
+index 5ccb0ae..e00717d 100644
+--- a/drivers/media/video/Kconfig
++++ b/drivers/media/video/Kconfig
+@@ -793,13 +793,7 @@ menuconfig V4L_USB_DRIVERS
+ 
+ if V4L_USB_DRIVERS && USB
+ 
+-config USB_VIDEO_CLASS
+-	tristate "USB Video Class (UVC)"
+-	---help---
+-	  Support for the USB Video Class (UVC).  Currently only video
+-	  input devices, such as webcams, are supported.
+-
+-	  For more information see: <http://linux-uvc.berlios.de/>
++source "drivers/media/video/uvc/Kconfig"
+ 
+ source "drivers/media/video/pvrusb2/Kconfig"
+ 
+diff --git a/drivers/media/video/cx18/cx18-firmware.c b/drivers/media/video/cx18/cx18-firmware.c
+index 2694ce3..9dda2ca 100644
+--- a/drivers/media/video/cx18/cx18-firmware.c
++++ b/drivers/media/video/cx18/cx18-firmware.c
+@@ -90,7 +90,7 @@
+ #define CX18_DSP0_INTERRUPT_MASK     	0xd0004C
+ 
+ /* Encoder/decoder firmware sizes */
+-#define CX18_FW_CPU_SIZE 		(174716)
++#define CX18_FW_CPU_SIZE 		(158332)
+ #define CX18_FW_APU_SIZE 		(141200)
+ 
+ #define APU_ROM_SYNC1 0x6D676553 /* "mgeS" */
+diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c
+index c4cc2f3..ad143f1 100644
+--- a/drivers/media/video/cx23885/cx23885-core.c
++++ b/drivers/media/video/cx23885/cx23885-core.c
+@@ -76,6 +76,117 @@ LIST_HEAD(cx23885_devlist);
+  * 0x00010ea0 0x00010xxx Free
+  */
+ 
++static struct sram_channel cx23885_sram_channels[] = {
++	[SRAM_CH01] = {
++		.name		= "VID A",
++		.cmds_start	= 0x10000,
++		.ctrl_start	= 0x10380,
++		.cdt		= 0x104c0,
++		.fifo_start	= 0x40,
++		.fifo_size	= 0x2800,
++		.ptr1_reg	= DMA1_PTR1,
++		.ptr2_reg	= DMA1_PTR2,
++		.cnt1_reg	= DMA1_CNT1,
++		.cnt2_reg	= DMA1_CNT2,
++	},
++	[SRAM_CH02] = {
++		.name		= "ch2",
++		.cmds_start	= 0x0,
++		.ctrl_start	= 0x0,
++		.cdt		= 0x0,
++		.fifo_start	= 0x0,
++		.fifo_size	= 0x0,
++		.ptr1_reg	= DMA2_PTR1,
++		.ptr2_reg	= DMA2_PTR2,
++		.cnt1_reg	= DMA2_CNT1,
++		.cnt2_reg	= DMA2_CNT2,
++	},
++	[SRAM_CH03] = {
++		.name		= "TS1 B",
++		.cmds_start	= 0x100A0,
++		.ctrl_start	= 0x10400,
++		.cdt		= 0x10580,
++		.fifo_start	= 0x5000,
++		.fifo_size	= 0x1000,
++		.ptr1_reg	= DMA3_PTR1,
++		.ptr2_reg	= DMA3_PTR2,
++		.cnt1_reg	= DMA3_CNT1,
++		.cnt2_reg	= DMA3_CNT2,
++	},
++	[SRAM_CH04] = {
++		.name		= "ch4",
++		.cmds_start	= 0x0,
++		.ctrl_start	= 0x0,
++		.cdt		= 0x0,
++		.fifo_start	= 0x0,
++		.fifo_size	= 0x0,
++		.ptr1_reg	= DMA4_PTR1,
++		.ptr2_reg	= DMA4_PTR2,
++		.cnt1_reg	= DMA4_CNT1,
++		.cnt2_reg	= DMA4_CNT2,
++	},
++	[SRAM_CH05] = {
++		.name		= "ch5",
++		.cmds_start	= 0x0,
++		.ctrl_start	= 0x0,
++		.cdt		= 0x0,
++		.fifo_start	= 0x0,
++		.fifo_size	= 0x0,
++		.ptr1_reg	= DMA5_PTR1,
++		.ptr2_reg	= DMA5_PTR2,
++		.cnt1_reg	= DMA5_CNT1,
++		.cnt2_reg	= DMA5_CNT2,
++	},
++	[SRAM_CH06] = {
++		.name		= "TS2 C",
++		.cmds_start	= 0x10140,
++		.ctrl_start	= 0x10440,
++		.cdt		= 0x105e0,
++		.fifo_start	= 0x6000,
++		.fifo_size	= 0x1000,
++		.ptr1_reg	= DMA5_PTR1,
++		.ptr2_reg	= DMA5_PTR2,
++		.cnt1_reg	= DMA5_CNT1,
++		.cnt2_reg	= DMA5_CNT2,
++	},
++	[SRAM_CH07] = {
++		.name		= "ch7",
++		.cmds_start	= 0x0,
++		.ctrl_start	= 0x0,
++		.cdt		= 0x0,
++		.fifo_start	= 0x0,
++		.fifo_size	= 0x0,
++		.ptr1_reg	= DMA6_PTR1,
++		.ptr2_reg	= DMA6_PTR2,
++		.cnt1_reg	= DMA6_CNT1,
++		.cnt2_reg	= DMA6_CNT2,
++	},
++	[SRAM_CH08] = {
++		.name		= "ch8",
++		.cmds_start	= 0x0,
++		.ctrl_start	= 0x0,
++		.cdt		= 0x0,
++		.fifo_start	= 0x0,
++		.fifo_size	= 0x0,
++		.ptr1_reg	= DMA7_PTR1,
++		.ptr2_reg	= DMA7_PTR2,
++		.cnt1_reg	= DMA7_CNT1,
++		.cnt2_reg	= DMA7_CNT2,
++	},
++	[SRAM_CH09] = {
++		.name		= "ch9",
++		.cmds_start	= 0x0,
++		.ctrl_start	= 0x0,
++		.cdt		= 0x0,
++		.fifo_start	= 0x0,
++		.fifo_size	= 0x0,
++		.ptr1_reg	= DMA8_PTR1,
++		.ptr2_reg	= DMA8_PTR2,
++		.cnt1_reg	= DMA8_CNT1,
++		.cnt2_reg	= DMA8_CNT2,
++	},
++};
++
+ static struct sram_channel cx23887_sram_channels[] = {
+ 	[SRAM_CH01] = {
+ 		.name		= "VID A",
+@@ -104,8 +215,8 @@ static struct sram_channel cx23887_sram_channels[] = {
+ 	[SRAM_CH03] = {
+ 		.name		= "TS1 B",
+ 		.cmds_start	= 0x100A0,
+-		.ctrl_start	= 0x10780,
+-		.cdt		= 0x10400,
++		.ctrl_start	= 0x10630,
++		.cdt		= 0x10870,
+ 		.fifo_start	= 0x5000,
+ 		.fifo_size	= 0x1000,
+ 		.ptr1_reg	= DMA3_PTR1,
+@@ -140,7 +251,7 @@ static struct sram_channel cx23887_sram_channels[] = {
+ 	[SRAM_CH06] = {
+ 		.name		= "TS2 C",
+ 		.cmds_start	= 0x10140,
+-		.ctrl_start	= 0x10680,
++		.ctrl_start	= 0x10670,
+ 		.cdt		= 0x108d0,
+ 		.fifo_start	= 0x6000,
+ 		.fifo_size	= 0x1000,
+@@ -460,6 +571,7 @@ static void cx23885_reset(struct cx23885_dev *dev)
+ 	cx_write(AUDIO_INT_INT_STAT, 0xffffffff);
+ 	cx_write(AUDIO_EXT_INT_STAT, 0xffffffff);
+ 	cx_write(CLK_DELAY, cx_read(CLK_DELAY) & 0x80000000);
++	cx_write(PAD_CTRL, 0x00500300);
+ 
+ 	mdelay(100);
+ 
+@@ -625,7 +737,6 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
+ 	atomic_inc(&dev->refcount);
+ 
+ 	dev->nr = cx23885_devcount++;
+-	dev->sram_channels = cx23887_sram_channels;
+ 	sprintf(dev->name, "cx23885[%d]", dev->nr);
+ 
+ 	mutex_lock(&devlist);
+@@ -637,11 +748,13 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
+ 		dev->bridge = CX23885_BRIDGE_887;
+ 		/* Apply a sensible clock frequency for the PCIe bridge */
+ 		dev->clk_freq = 25000000;
++		dev->sram_channels = cx23887_sram_channels;
+ 	} else
+ 	if(dev->pci->device == 0x8852) {
+ 		dev->bridge = CX23885_BRIDGE_885;
+ 		/* Apply a sensible clock frequency for the PCIe bridge */
+ 		dev->clk_freq = 28000000;
++		dev->sram_channels = cx23885_sram_channels;
+ 	} else
+ 		BUG();
+ 
+@@ -1042,6 +1155,9 @@ static int cx23885_start_dma(struct cx23885_tsport *port,
+ 	dprintk(1, "%s() w: %d, h: %d, f: %d\n", __func__,
+ 		buf->vb.width, buf->vb.height, buf->vb.field);
+ 
++	/* Stop the fifo and risc engine for this port */
++	cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
++
+ 	/* setup fifo + format */
+ 	cx23885_sram_channel_setup(dev,
+ 				   &dev->sram_channels[ port->sram_chno ],
+@@ -1083,7 +1199,21 @@ static int cx23885_start_dma(struct cx23885_tsport *port,
+ 	cx_write(port->reg_gpcnt_ctl, 3);
+ 	q->count = 1;
+ 
+-	if (cx23885_boards[dev->board].portb & CX23885_MPEG_ENCODER) {
++	/* Set VIDB pins to input */
++	if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) {
++		reg = cx_read(PAD_CTRL);
++		reg &= ~0x3; /* Clear TS1_OE & TS1_SOP_OE */
++		cx_write(PAD_CTRL, reg);
++	}
++
++	/* Set VIDC pins to input */
++	if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB) {
++		reg = cx_read(PAD_CTRL);
++		reg &= ~0x4; /* Clear TS2_SOP_OE */
++		cx_write(PAD_CTRL, reg);
++	}
++
++	if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
+ 
+ 		reg = cx_read(PAD_CTRL);
+ 		reg = reg & ~0x1;    /* Clear TS1_OE */
+@@ -1133,7 +1263,7 @@ static int cx23885_stop_dma(struct cx23885_tsport *port)
+ 	cx_clear(port->reg_ts_int_msk, port->ts_int_msk_val);
+ 	cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
+ 
+-	if (cx23885_boards[dev->board].portb & CX23885_MPEG_ENCODER) {
++	if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
+ 
+ 		reg = cx_read(PAD_CTRL);
+ 
+diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
+index 2618cfa..0227cf9 100644
+--- a/drivers/media/video/saa7134/saa7134-cards.c
++++ b/drivers/media/video/saa7134/saa7134-cards.c
+@@ -5703,9 +5703,6 @@ int saa7134_board_init2(struct saa7134_dev *dev)
+ 	unsigned char buf;
+ 	int board;
+ 
+-	dev->tuner_type = saa7134_boards[dev->board].tuner_type;
+-	dev->tuner_addr = saa7134_boards[dev->board].tuner_addr;
+-
+ 	switch (dev->board) {
+ 	case SAA7134_BOARD_BMK_MPEX_NOTUNER:
+ 	case SAA7134_BOARD_BMK_MPEX_TUNER:
+diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
+index 2c19cd0..69f340d 100644
+--- a/drivers/media/video/saa7134/saa7134-core.c
++++ b/drivers/media/video/saa7134/saa7134-core.c
+@@ -946,11 +946,12 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
+ 		dev->board = SAA7134_BOARD_UNKNOWN;
+ 	}
+ 	dev->autodetected = card[dev->nr] != dev->board;
+-	dev->tuner_type   = saa7134_boards[dev->board].tuner_type;
++	dev->tuner_type = saa7134_boards[dev->board].tuner_type;
++	dev->tuner_addr = saa7134_boards[dev->board].tuner_addr;
+ 	dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf;
+ 	if (UNSET != tuner[dev->nr])
+ 		dev->tuner_type = tuner[dev->nr];
+-		printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
++	printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
+ 		dev->name,pci_dev->subsystem_vendor,
+ 		pci_dev->subsystem_device,saa7134_boards[dev->board].name,
+ 		dev->board, dev->autodetected ?
+diff --git a/drivers/media/video/uvc/Kconfig b/drivers/media/video/uvc/Kconfig
+new file mode 100644
+index 0000000..c2d9760
+--- /dev/null
++++ b/drivers/media/video/uvc/Kconfig
+@@ -0,0 +1,17 @@
++config USB_VIDEO_CLASS
++	tristate "USB Video Class (UVC)"
++	---help---
++	  Support for the USB Video Class (UVC).  Currently only video
++	  input devices, such as webcams, are supported.
++
++	  For more information see: <http://linux-uvc.berlios.de/>
++
++config USB_VIDEO_CLASS_INPUT_EVDEV
++	bool "UVC input events device support"
++	default y
++	depends on USB_VIDEO_CLASS && INPUT
++	---help---
++	  This option makes USB Video Class devices register an input device
++	  to report button events.
++
++	  If you are in doubt, say Y.
+diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
+index 60ced58..9d954d2 100644
+--- a/drivers/media/video/uvc/uvc_driver.c
++++ b/drivers/media/video/uvc/uvc_driver.c
+@@ -298,7 +298,8 @@ static int uvc_parse_format(struct uvc_device *dev,
+ 	switch (buffer[2]) {
+ 	case VS_FORMAT_UNCOMPRESSED:
+ 	case VS_FORMAT_FRAME_BASED:
+-		if (buflen < 27) {
++		n = buffer[2] == VS_FORMAT_UNCOMPRESSED ? 27 : 28;
++		if (buflen < n) {
+ 			uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming"
+ 			       "interface %d FORMAT error\n",
+ 			       dev->udev->devnum,
+@@ -1891,6 +1892,15 @@ static struct usb_device_id uvc_ids[] = {
+ 	  .bInterfaceSubClass	= 1,
+ 	  .bInterfaceProtocol	= 0,
+ 	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
++	/* Medion Akoya Mini E1210 */
++	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
++				| USB_DEVICE_ID_MATCH_INT_INFO,
++	  .idVendor		= 0x5986,
++	  .idProduct		= 0x0141,
++	  .bInterfaceClass	= USB_CLASS_VIDEO,
++	  .bInterfaceSubClass	= 1,
++	  .bInterfaceProtocol	= 0,
++	  .driver_info		= UVC_QUIRK_PROBE_MINMAX },
+ 	/* Acer OrbiCam - Unknown vendor */
+ 	{ .match_flags		= USB_DEVICE_ID_MATCH_DEVICE
+ 				| USB_DEVICE_ID_MATCH_INT_INFO,
+diff --git a/drivers/media/video/uvc/uvc_status.c b/drivers/media/video/uvc/uvc_status.c
+index be9084e..eb2f970 100644
+--- a/drivers/media/video/uvc/uvc_status.c
++++ b/drivers/media/video/uvc/uvc_status.c
+@@ -22,6 +22,7 @@
+ /* --------------------------------------------------------------------------
+  * Input device
+  */
++#ifdef CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV
+ static int uvc_input_init(struct uvc_device *dev)
+ {
+ 	struct usb_device *udev = dev->udev;
+@@ -67,6 +68,19 @@ static void uvc_input_cleanup(struct uvc_device *dev)
+ 		input_unregister_device(dev->input);
+ }
+ 
++static void uvc_input_report_key(struct uvc_device *dev, unsigned int code,
++	int value)
++{
++	if (dev->input)
++		input_report_key(dev->input, code, value);
++}
++
++#else
++#define uvc_input_init(dev)
++#define uvc_input_cleanup(dev)
++#define uvc_input_report_key(dev, code, value)
++#endif /* CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV */
++
+ /* --------------------------------------------------------------------------
+  * Status interrupt endpoint
+  */
+@@ -83,8 +97,7 @@ static void uvc_event_streaming(struct uvc_device *dev, __u8 *data, int len)
+ 			return;
+ 		uvc_trace(UVC_TRACE_STATUS, "Button (intf %u) %s len %d\n",
+ 			data[1], data[3] ? "pressed" : "released", len);
+-		if (dev->input)
+-			input_report_key(dev->input, BTN_0, data[3]);
++		uvc_input_report_key(dev, BTN_0, data[3]);
+ 	} else {
+ 		uvc_trace(UVC_TRACE_STATUS, "Stream %u error event %02x %02x "
+ 			"len %d.\n", data[1], data[2], data[3], len);
+@@ -203,5 +216,5 @@ int uvc_status_resume(struct uvc_device *dev)
+ 	if (dev->int_urb == NULL)
+ 		return 0;
+ 
+-	return usb_submit_urb(dev->int_urb, GFP_KERNEL);
++	return usb_submit_urb(dev->int_urb, GFP_NOIO);
+ }
+diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c
+index 6faf1fb..817af2e 100644
+--- a/drivers/media/video/uvc/uvc_video.c
++++ b/drivers/media/video/uvc/uvc_video.c
+@@ -554,9 +554,56 @@ static void uvc_video_complete(struct urb *urb)
+ }
+ 
+ /*
++ * Free transfer buffers.
++ */
++static void uvc_free_urb_buffers(struct uvc_video_device *video)
++{
++	unsigned int i;
++
++	for (i = 0; i < UVC_URBS; ++i) {
++		if (video->urb_buffer[i]) {
++			usb_buffer_free(video->dev->udev, video->urb_size,
++				video->urb_buffer[i], video->urb_dma[i]);
++			video->urb_buffer[i] = NULL;
++		}
++	}
++
++	video->urb_size = 0;
++}
++
++/*
++ * Allocate transfer buffers. This function can be called with buffers
++ * already allocated when resuming from suspend, in which case it will
++ * return without touching the buffers.
++ *
++ * Return 0 on success or -ENOMEM when out of memory.
++ */
++static int uvc_alloc_urb_buffers(struct uvc_video_device *video,
++	unsigned int size)
++{
++	unsigned int i;
++
++	/* Buffers are already allocated, bail out. */
++	if (video->urb_size)
++		return 0;
++
++	for (i = 0; i < UVC_URBS; ++i) {
++		video->urb_buffer[i] = usb_buffer_alloc(video->dev->udev,
++			size, GFP_KERNEL, &video->urb_dma[i]);
++		if (video->urb_buffer[i] == NULL) {
++			uvc_free_urb_buffers(video);
++			return -ENOMEM;
++		}
++	}
++
++	video->urb_size = size;
++	return 0;
++}
++
++/*
+  * Uninitialize isochronous/bulk URBs and free transfer buffers.
+  */
+-static void uvc_uninit_video(struct uvc_video_device *video)
++static void uvc_uninit_video(struct uvc_video_device *video, int free_buffers)
+ {
+ 	struct urb *urb;
+ 	unsigned int i;
+@@ -566,19 +613,12 @@ static void uvc_uninit_video(struct uvc_video_device *video)
+ 			continue;
+ 
+ 		usb_kill_urb(urb);
+-		/* urb->transfer_buffer_length is not touched by USB core, so
+-		 * we can use it here as the buffer length.
+-		 */
+-		if (video->urb_buffer[i]) {
+-			usb_buffer_free(video->dev->udev,
+-				urb->transfer_buffer_length,
+-				video->urb_buffer[i], urb->transfer_dma);
+-			video->urb_buffer[i] = NULL;
+-		}
+-
+ 		usb_free_urb(urb);
+ 		video->urb[i] = NULL;
+ 	}
++
++	if (free_buffers)
++		uvc_free_urb_buffers(video);
+ }
+ 
+ /*
+@@ -586,7 +626,7 @@ static void uvc_uninit_video(struct uvc_video_device *video)
+  * is given by the endpoint.
+  */
+ static int uvc_init_video_isoc(struct uvc_video_device *video,
+-	struct usb_host_endpoint *ep)
++	struct usb_host_endpoint *ep, gfp_t gfp_flags)
+ {
+ 	struct urb *urb;
+ 	unsigned int npackets, i, j;
+@@ -610,18 +650,13 @@ static int uvc_init_video_isoc(struct uvc_video_device *video,
+ 
+ 	size = npackets * psize;
+ 
++	if (uvc_alloc_urb_buffers(video, size) < 0)
++		return -ENOMEM;
++
+ 	for (i = 0; i < UVC_URBS; ++i) {
+-		urb = usb_alloc_urb(npackets, GFP_KERNEL);
++		urb = usb_alloc_urb(npackets, gfp_flags);
+ 		if (urb == NULL) {
+-			uvc_uninit_video(video);
+-			return -ENOMEM;
+-		}
+-
+-		video->urb_buffer[i] = usb_buffer_alloc(video->dev->udev,
+-			size, GFP_KERNEL, &urb->transfer_dma);
+-		if (video->urb_buffer[i] == NULL) {
+-			usb_free_urb(urb);
+-			uvc_uninit_video(video);
++			uvc_uninit_video(video, 1);
+ 			return -ENOMEM;
+ 		}
+ 
+@@ -632,6 +667,7 @@ static int uvc_init_video_isoc(struct uvc_video_device *video,
+ 		urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
+ 		urb->interval = ep->desc.bInterval;
+ 		urb->transfer_buffer = video->urb_buffer[i];
++		urb->transfer_dma = video->urb_dma[i];
+ 		urb->complete = uvc_video_complete;
+ 		urb->number_of_packets = npackets;
+ 		urb->transfer_buffer_length = size;
+@@ -652,7 +688,7 @@ static int uvc_init_video_isoc(struct uvc_video_device *video,
+  * given by the endpoint.
+  */
+ static int uvc_init_video_bulk(struct uvc_video_device *video,
+-	struct usb_host_endpoint *ep)
++	struct usb_host_endpoint *ep, gfp_t gfp_flags)
+ {
+ 	struct urb *urb;
+ 	unsigned int pipe, i;
+@@ -671,20 +707,15 @@ static int uvc_init_video_bulk(struct uvc_video_device *video,
+ 	if (size > psize * UVC_MAX_ISO_PACKETS)
+ 		size = psize * UVC_MAX_ISO_PACKETS;
+ 
++	if (uvc_alloc_urb_buffers(video, size) < 0)
++		return -ENOMEM;
++
+ 	pipe = usb_rcvbulkpipe(video->dev->udev, ep->desc.bEndpointAddress);
+ 
+ 	for (i = 0; i < UVC_URBS; ++i) {
+-		urb = usb_alloc_urb(0, GFP_KERNEL);
++		urb = usb_alloc_urb(0, gfp_flags);
+ 		if (urb == NULL) {
+-			uvc_uninit_video(video);
+-			return -ENOMEM;
+-		}
+-
+-		video->urb_buffer[i] = usb_buffer_alloc(video->dev->udev,
+-			size, GFP_KERNEL, &urb->transfer_dma);
+-		if (video->urb_buffer[i] == NULL) {
+-			usb_free_urb(urb);
+-			uvc_uninit_video(video);
++			uvc_uninit_video(video, 1);
+ 			return -ENOMEM;
+ 		}
+ 
+@@ -692,6 +723,7 @@ static int uvc_init_video_bulk(struct uvc_video_device *video,
+ 			video->urb_buffer[i], size, uvc_video_complete,
+ 			video);
+ 		urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
++		urb->transfer_dma = video->urb_dma[i];
+ 
+ 		video->urb[i] = urb;
+ 	}
+@@ -702,7 +734,7 @@ static int uvc_init_video_bulk(struct uvc_video_device *video,
+ /*
+  * Initialize isochronous/bulk URBs and allocate transfer buffers.
+  */
+-static int uvc_init_video(struct uvc_video_device *video)
++static int uvc_init_video(struct uvc_video_device *video, gfp_t gfp_flags)
+ {
+ 	struct usb_interface *intf = video->streaming->intf;
+ 	struct usb_host_interface *alts;
+@@ -747,7 +779,7 @@ static int uvc_init_video(struct uvc_video_device *video)
+ 		if ((ret = usb_set_interface(video->dev->udev, intfnum, i)) < 0)
+ 			return ret;
+ 
+-		ret = uvc_init_video_isoc(video, ep);
++		ret = uvc_init_video_isoc(video, ep, gfp_flags);
+ 	} else {
+ 		/* Bulk endpoint, proceed to URB initialization. */
+ 		ep = uvc_find_endpoint(&intf->altsetting[0],
+@@ -755,7 +787,7 @@ static int uvc_init_video(struct uvc_video_device *video)
+ 		if (ep == NULL)
+ 			return -EIO;
+ 
+-		ret = uvc_init_video_bulk(video, ep);
++		ret = uvc_init_video_bulk(video, ep, gfp_flags);
+ 	}
+ 
+ 	if (ret < 0)
+@@ -763,10 +795,10 @@ static int uvc_init_video(struct uvc_video_device *video)
+ 
+ 	/* Submit the URBs. */
+ 	for (i = 0; i < UVC_URBS; ++i) {
+-		if ((ret = usb_submit_urb(video->urb[i], GFP_KERNEL)) < 0) {
++		if ((ret = usb_submit_urb(video->urb[i], gfp_flags)) < 0) {
+ 			uvc_printk(KERN_ERR, "Failed to submit URB %u "
+ 					"(%d).\n", i, ret);
+-			uvc_uninit_video(video);
++			uvc_uninit_video(video, 1);
+ 			return ret;
+ 		}
+ 	}
+@@ -791,7 +823,7 @@ int uvc_video_suspend(struct uvc_video_device *video)
+ 		return 0;
+ 
+ 	video->frozen = 1;
+-	uvc_uninit_video(video);
++	uvc_uninit_video(video, 0);
+ 	usb_set_interface(video->dev->udev, video->streaming->intfnum, 0);
+ 	return 0;
+ }
+@@ -818,7 +850,7 @@ int uvc_video_resume(struct uvc_video_device *video)
+ 	if (!uvc_queue_streaming(&video->queue))
+ 		return 0;
+ 
+-	if ((ret = uvc_init_video(video)) < 0)
++	if ((ret = uvc_init_video(video, GFP_NOIO)) < 0)
+ 		uvc_queue_enable(&video->queue, 0);
+ 
+ 	return ret;
+@@ -920,7 +952,7 @@ int uvc_video_enable(struct uvc_video_device *video, int enable)
+ 	int ret;
+ 
+ 	if (!enable) {
+-		uvc_uninit_video(video);
++		uvc_uninit_video(video, 1);
+ 		usb_set_interface(video->dev->udev,
+ 			video->streaming->intfnum, 0);
+ 		uvc_queue_enable(&video->queue, 0);
+@@ -930,5 +962,5 @@ int uvc_video_enable(struct uvc_video_device *video, int enable)
+ 	if ((ret = uvc_queue_enable(&video->queue, 1)) < 0)
+ 		return ret;
+ 
+-	return uvc_init_video(video);
++	return uvc_init_video(video, GFP_KERNEL);
+ }
+diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h
+index a995a78..2444b8a 100644
+--- a/drivers/media/video/uvc/uvcvideo.h
++++ b/drivers/media/video/uvc/uvcvideo.h
+@@ -602,6 +602,8 @@ struct uvc_video_device {
+ 
+ 	struct urb *urb[UVC_URBS];
+ 	char *urb_buffer[UVC_URBS];
++	dma_addr_t urb_dma[UVC_URBS];
++	unsigned int urb_size;
+ 
+ 	__u8 last_fid;
+ };
+diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
+index d89475d..5c35e63 100644
+--- a/drivers/mmc/host/pxamci.c
++++ b/drivers/mmc/host/pxamci.c
+@@ -177,7 +177,7 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)
+ 	if (dalgn)
+ 		DALGN |= (1 << host->dma);
+ 	else
+-		DALGN &= (1 << host->dma);
++		DALGN &= ~(1 << host->dma);
+ 	DDADR(host->dma) = host->sg_dma;
+ 	DCSR(host->dma) = DCSR_RUN;
+ }
+diff --git a/drivers/net/hamradio/hdlcdrv.c b/drivers/net/hamradio/hdlcdrv.c
+index ae9629f..c258a05 100644
+--- a/drivers/net/hamradio/hdlcdrv.c
++++ b/drivers/net/hamradio/hdlcdrv.c
+@@ -88,6 +88,7 @@
+ static inline void append_crc_ccitt(unsigned char *buffer, int len)
+ {
+  	unsigned int crc = crc_ccitt(0xffff, buffer, len) ^ 0xffff;
++	buffer += len;
+ 	*buffer++ = crc;
+ 	*buffer++ = crc >> 8;
+ }
+diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
+index 8f04609..e248f80 100644
+--- a/drivers/net/ixgbe/ixgbe_main.c
++++ b/drivers/net/ixgbe/ixgbe_main.c
+@@ -70,8 +70,6 @@ static struct pci_device_id ixgbe_pci_tbl[] = {
+ 	 board_82598 },
+ 	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_SINGLE_PORT),
+ 	 board_82598 },
+-	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AT_DUAL_PORT),
+-	 board_82598 },
+ 	{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4),
+ 	 board_82598 },
+ 
+diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c
+index e0d76c7..9e28d91 100644
+--- a/drivers/net/myri10ge/myri10ge.c
++++ b/drivers/net/myri10ge/myri10ge.c
+@@ -3126,6 +3126,8 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 
+ 	mgp = netdev_priv(netdev);
+ 	mgp->dev = netdev;
++	mgp->ss.mgp = mgp;
++	mgp->ss.dev = mgp->dev;
+ 	netif_napi_add(netdev, &mgp->ss.napi, myri10ge_poll, myri10ge_napi_weight);
+ 	mgp->pdev = pdev;
+ 	mgp->csum_flag = MXGEFW_FLAGS_CKSUM;
+@@ -3213,26 +3215,26 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 	for (i = 0; i < ETH_ALEN; i++)
+ 		netdev->dev_addr[i] = mgp->mac_addr[i];
+ 
+-	/* allocate rx done ring */
+-	bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry);
+-	mgp->ss.rx_done.entry = dma_alloc_coherent(&pdev->dev, bytes,
+-						&mgp->ss.rx_done.bus, GFP_KERNEL);
+-	if (mgp->ss.rx_done.entry == NULL)
+-		goto abort_with_ioremap;
+-	memset(mgp->ss.rx_done.entry, 0, bytes);
+-
+ 	myri10ge_select_firmware(mgp);
+ 
+ 	status = myri10ge_load_firmware(mgp);
+ 	if (status != 0) {
+ 		dev_err(&pdev->dev, "failed to load firmware\n");
+-		goto abort_with_rx_done;
++		goto abort_with_ioremap;
+ 	}
+ 
++	/* allocate rx done ring */
++	bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry);
++	mgp->ss.rx_done.entry = dma_alloc_coherent(&pdev->dev, bytes,
++						&mgp->ss.rx_done.bus, GFP_KERNEL);
++	if (mgp->ss.rx_done.entry == NULL)
++		goto abort_with_firmware;
++	memset(mgp->ss.rx_done.entry, 0, bytes);
++
+ 	status = myri10ge_reset(mgp);
+ 	if (status != 0) {
+ 		dev_err(&pdev->dev, "failed reset\n");
+-		goto abort_with_firmware;
++		goto abort_with_rx_done;
+ 	}
+ 
+ 	pci_set_drvdata(pdev, mgp);
+@@ -3258,7 +3260,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 	 * is set to correct value if MSI is enabled */
+ 	status = myri10ge_request_irq(mgp);
+ 	if (status != 0)
+-		goto abort_with_firmware;
++		goto abort_with_rx_done;
+ 	netdev->irq = pdev->irq;
+ 	myri10ge_free_irq(mgp);
+ 
+@@ -3287,14 +3289,14 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ abort_with_state:
+ 	pci_restore_state(pdev);
+ 
+-abort_with_firmware:
+-	myri10ge_dummy_rdma(mgp, 0);
+-
+ abort_with_rx_done:
+ 	bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry);
+ 	dma_free_coherent(&pdev->dev, bytes,
+ 			  mgp->ss.rx_done.entry, mgp->ss.rx_done.bus);
+ 
++abort_with_firmware:
++	myri10ge_dummy_rdma(mgp, 0);
++
+ abort_with_ioremap:
+ 	iounmap(mgp->sram);
+ 
+diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
+index 635b9ac..e57905c 100644
+--- a/drivers/net/wireless/ath5k/base.c
++++ b/drivers/net/wireless/ath5k/base.c
+@@ -487,9 +487,6 @@ ath5k_pci_probe(struct pci_dev *pdev,
+ 	/* Set private data */
+ 	pci_set_drvdata(pdev, hw);
+ 
+-	/* Enable msi for devices that support it */
+-	pci_enable_msi(pdev);
+-
+ 	/* Setup interrupt handler */
+ 	ret = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc);
+ 	if (ret) {
+@@ -567,7 +564,6 @@ err_ah:
+ err_irq:
+ 	free_irq(pdev->irq, sc);
+ err_free:
+-	pci_disable_msi(pdev);
+ 	ieee80211_free_hw(hw);
+ err_map:
+ 	pci_iounmap(pdev, mem);
+@@ -589,7 +585,6 @@ ath5k_pci_remove(struct pci_dev *pdev)
+ 	ath5k_detach(pdev, hw);
+ 	ath5k_hw_detach(sc->ah);
+ 	free_irq(pdev->irq, sc);
+-	pci_disable_msi(pdev);
+ 	pci_iounmap(pdev, sc->iobase);
+ 	pci_release_region(pdev, 0);
+ 	pci_disable_device(pdev);
+diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
+index 3e612d0..9bba3ec 100644
+--- a/drivers/net/wireless/b43legacy/main.c
++++ b/drivers/net/wireless/b43legacy/main.c
+@@ -3862,10 +3862,10 @@ static int b43legacy_resume(struct ssb_device *dev)
+ 			goto out;
+ 		}
+ 	}
+-	mutex_unlock(&wl->mutex);
+ 
+ 	b43legacydbg(wl, "Device resumed.\n");
+ out:
++	mutex_unlock(&wl->mutex);
+ 	return err;
+ }
+ 
+diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c
+index 39e64ab..67c7a01 100644
+--- a/drivers/rtc/rtc-at91rm9200.c
++++ b/drivers/rtc/rtc-at91rm9200.c
+@@ -175,8 +175,10 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
+ 		| BIN2BCD(tm.tm_mday) << 24
+ 		| AT91_RTC_DATEEN | AT91_RTC_MTHEN);
+ 
+-	if (alrm->enabled)
++	if (alrm->enabled) {
++		at91_sys_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
+ 		at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM);
++	}
+ 
+ 	pr_debug("%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
+ 		at91_alarm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour,
+@@ -195,28 +197,22 @@ static int at91_rtc_ioctl(struct device *dev, unsigned int cmd,
+ 
+ 	pr_debug("%s(): cmd=%08x, arg=%08lx.\n", __func__, cmd, arg);
+ 
++	/* important:  scrub old status before enabling IRQs */
+ 	switch (cmd) {
+ 	case RTC_AIE_OFF:	/* alarm off */
+ 		at91_sys_write(AT91_RTC_IDR, AT91_RTC_ALARM);
+ 		break;
+ 	case RTC_AIE_ON:	/* alarm on */
++		at91_sys_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
+ 		at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM);
+ 		break;
+ 	case RTC_UIE_OFF:	/* update off */
+-	case RTC_PIE_OFF:	/* periodic off */
+ 		at91_sys_write(AT91_RTC_IDR, AT91_RTC_SECEV);
+ 		break;
+ 	case RTC_UIE_ON:	/* update on */
+-	case RTC_PIE_ON:	/* periodic on */
++		at91_sys_write(AT91_RTC_SCCR, AT91_RTC_SECEV);
+ 		at91_sys_write(AT91_RTC_IER, AT91_RTC_SECEV);
+ 		break;
+-	case RTC_IRQP_READ:	/* read periodic alarm frequency */
+-		ret = put_user(AT91_RTC_FREQ, (unsigned long *) arg);
+-		break;
+-	case RTC_IRQP_SET:	/* set periodic alarm frequency */
+-		if (arg != AT91_RTC_FREQ)
+-			ret = -EINVAL;
+-		break;
+ 	default:
+ 		ret = -ENOIOCTLCMD;
+ 		break;
+diff --git a/drivers/spi/mpc52xx_psc_spi.c b/drivers/spi/mpc52xx_psc_spi.c
+index 681d623..d8a1f91 100644
+--- a/drivers/spi/mpc52xx_psc_spi.c
++++ b/drivers/spi/mpc52xx_psc_spi.c
+@@ -148,7 +148,6 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi,
+ 	unsigned rfalarm;
+ 	unsigned send_at_once = MPC52xx_PSC_BUFSIZE;
+ 	unsigned recv_at_once;
+-	unsigned bpw = mps->bits_per_word / 8;
+ 
+ 	if (!t->tx_buf && !t->rx_buf && t->len)
+ 		return -EINVAL;
+@@ -164,22 +163,15 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi,
+ 		}
+ 
+ 		dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once);
+-		if (tx_buf) {
+-			for (; send_at_once; sb++, send_at_once--) {
+-				/* set EOF flag */
+-				if (mps->bits_per_word
+-						&& (sb + 1) % bpw == 0)
+-					out_8(&psc->ircr2, 0x01);
++		for (; send_at_once; sb++, send_at_once--) {
++			/* set EOF flag before the last word is sent */
++			if (send_at_once == 1)
++				out_8(&psc->ircr2, 0x01);
++
++			if (tx_buf)
+ 				out_8(&psc->mpc52xx_psc_buffer_8, tx_buf[sb]);
+-			}
+-		} else {
+-			for (; send_at_once; sb++, send_at_once--) {
+-				/* set EOF flag */
+-				if (mps->bits_per_word
+-						&& ((sb + 1) % bpw) == 0)
+-					out_8(&psc->ircr2, 0x01);
++			else
+ 				out_8(&psc->mpc52xx_psc_buffer_8, 0);
+-			}
+ 		}
+ 
+ 
+diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
+index 0cb0d77..db1db4c 100644
+--- a/drivers/usb/serial/usb-serial.c
++++ b/drivers/usb/serial/usb-serial.c
+@@ -283,7 +283,10 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
+ 	}
+ 
+ 	if (port->open_count == 0) {
+-		usb_autopm_put_interface(port->serial->interface);
++		mutex_lock(&port->serial->disc_mutex);
++		if (!port->serial->disconnected)
++			usb_autopm_put_interface(port->serial->interface);
++		mutex_unlock(&port->serial->disc_mutex);
+ 		module_put(port->serial->type->driver.owner);
+ 	}
+ 
+diff --git a/fs/dquot.c b/fs/dquot.c
+index 5ac77da..ad88cf6 100644
+--- a/fs/dquot.c
++++ b/fs/dquot.c
+@@ -562,6 +562,8 @@ static struct shrinker dqcache_shrinker = {
+  */
+ static void dqput(struct dquot *dquot)
+ {
++	int ret;
++
+ 	if (!dquot)
+ 		return;
+ #ifdef __DQUOT_PARANOIA
+@@ -594,7 +596,19 @@ we_slept:
+ 	if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && dquot_dirty(dquot)) {
+ 		spin_unlock(&dq_list_lock);
+ 		/* Commit dquot before releasing */
+-		dquot->dq_sb->dq_op->write_dquot(dquot);
++		ret = dquot->dq_sb->dq_op->write_dquot(dquot);
++		if (ret < 0) {
++			printk(KERN_ERR "VFS: cannot write quota structure on "
++				"device %s (error %d). Quota may get out of "
++				"sync!\n", dquot->dq_sb->s_id, ret);
++			/*
++			 * We clear dirty bit anyway, so that we avoid
++			 * infinite loop here
++			 */
++			spin_lock(&dq_list_lock);
++			clear_dquot_dirty(dquot);
++			spin_unlock(&dq_list_lock);
++		}
+ 		goto we_slept;
+ 	}
+ 	/* Clear flag in case dquot was inactive (something bad happened) */
+diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
+index e2832bc..a82e0cb 100644
+--- a/fs/ecryptfs/crypto.c
++++ b/fs/ecryptfs/crypto.c
+@@ -474,8 +474,8 @@ int ecryptfs_encrypt_page(struct page *page)
+ {
+ 	struct inode *ecryptfs_inode;
+ 	struct ecryptfs_crypt_stat *crypt_stat;
+-	char *enc_extent_virt = NULL;
+-	struct page *enc_extent_page;
++	char *enc_extent_virt;
++	struct page *enc_extent_page = NULL;
+ 	loff_t extent_offset;
+ 	int rc = 0;
+ 
+@@ -491,14 +491,14 @@ int ecryptfs_encrypt_page(struct page *page)
+ 			       page->index);
+ 		goto out;
+ 	}
+-	enc_extent_virt = kmalloc(PAGE_CACHE_SIZE, GFP_USER);
+-	if (!enc_extent_virt) {
++	enc_extent_page = alloc_page(GFP_USER);
++	if (!enc_extent_page) {
+ 		rc = -ENOMEM;
+ 		ecryptfs_printk(KERN_ERR, "Error allocating memory for "
+ 				"encrypted extent\n");
+ 		goto out;
+ 	}
+-	enc_extent_page = virt_to_page(enc_extent_virt);
++	enc_extent_virt = kmap(enc_extent_page);
+ 	for (extent_offset = 0;
+ 	     extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
+ 	     extent_offset++) {
+@@ -526,7 +526,10 @@ int ecryptfs_encrypt_page(struct page *page)
+ 		}
+ 	}
+ out:
+-	kfree(enc_extent_virt);
++	if (enc_extent_page) {
++		kunmap(enc_extent_page);
++		__free_page(enc_extent_page);
++	}
+ 	return rc;
+ }
+ 
+@@ -608,8 +611,8 @@ int ecryptfs_decrypt_page(struct page *page)
+ {
+ 	struct inode *ecryptfs_inode;
+ 	struct ecryptfs_crypt_stat *crypt_stat;
+-	char *enc_extent_virt = NULL;
+-	struct page *enc_extent_page;
++	char *enc_extent_virt;
++	struct page *enc_extent_page = NULL;
+ 	unsigned long extent_offset;
+ 	int rc = 0;
+ 
+@@ -626,14 +629,14 @@ int ecryptfs_decrypt_page(struct page *page)
+ 			       page->index);
+ 		goto out;
+ 	}
+-	enc_extent_virt = kmalloc(PAGE_CACHE_SIZE, GFP_USER);
+-	if (!enc_extent_virt) {
++	enc_extent_page = alloc_page(GFP_USER);
++	if (!enc_extent_page) {
+ 		rc = -ENOMEM;
+ 		ecryptfs_printk(KERN_ERR, "Error allocating memory for "
+ 				"encrypted extent\n");
+ 		goto out;
+ 	}
+-	enc_extent_page = virt_to_page(enc_extent_virt);
++	enc_extent_virt = kmap(enc_extent_page);
+ 	for (extent_offset = 0;
+ 	     extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
+ 	     extent_offset++) {
+@@ -661,7 +664,10 @@ int ecryptfs_decrypt_page(struct page *page)
+ 		}
+ 	}
+ out:
+-	kfree(enc_extent_virt);
++	if (enc_extent_page) {
++		kunmap(enc_extent_page);
++		__free_page(enc_extent_page);
++	}
+ 	return rc;
+ }
+ 
+diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c
+index 6bd48f0..c2fb2dd 100644
+--- a/fs/isofs/rock.c
++++ b/fs/isofs/rock.c
+@@ -209,6 +209,11 @@ repeat:
+ 
+ 	while (rs.len > 2) { /* There may be one byte for padding somewhere */
+ 		rr = (struct rock_ridge *)rs.chr;
++		/*
++		 * Ignore rock ridge info if rr->len is out of range, but
++		 * don't return -EIO because that would make the file
++		 * invisible.
++		 */
+ 		if (rr->len < 3)
+ 			goto out;	/* Something got screwed up here */
+ 		sig = isonum_721(rs.chr);
+@@ -216,8 +221,12 @@ repeat:
+ 			goto eio;
+ 		rs.chr += rr->len;
+ 		rs.len -= rr->len;
++		/*
++		 * As above, just ignore the rock ridge info if rr->len
++		 * is bogus.
++		 */
+ 		if (rs.len < 0)
+-			goto eio;	/* corrupted isofs */
++			goto out;	/* Something got screwed up here */
+ 
+ 		switch (sig) {
+ 		case SIG('R', 'R'):
+@@ -307,6 +316,11 @@ parse_rock_ridge_inode_internal(struct iso_directory_record *de,
+ repeat:
+ 	while (rs.len > 2) { /* There may be one byte for padding somewhere */
+ 		rr = (struct rock_ridge *)rs.chr;
++		/*
++		 * Ignore rock ridge info if rr->len is out of range, but
++		 * don't return -EIO because that would make the file
++		 * invisible.
++		 */
+ 		if (rr->len < 3)
+ 			goto out;	/* Something got screwed up here */
+ 		sig = isonum_721(rs.chr);
+@@ -314,8 +328,12 @@ repeat:
+ 			goto eio;
+ 		rs.chr += rr->len;
+ 		rs.len -= rr->len;
++		/*
++		 * As above, just ignore the rock ridge info if rr->len
++		 * is bogus.
++		 */
+ 		if (rs.len < 0)
+-			goto eio;	/* corrupted isofs */
++			goto out;	/* Something got screwed up here */
+ 
+ 		switch (sig) {
+ #ifndef CONFIG_ZISOFS		/* No flag for SF or ZF */
+diff --git a/fs/libfs.c b/fs/libfs.c
+index baeb71e..1add676 100644
+--- a/fs/libfs.c
++++ b/fs/libfs.c
+@@ -216,8 +216,8 @@ int get_sb_pseudo(struct file_system_type *fs_type, char *name,
+ 
+ 	s->s_flags = MS_NOUSER;
+ 	s->s_maxbytes = ~0ULL;
+-	s->s_blocksize = 1024;
+-	s->s_blocksize_bits = 10;
++	s->s_blocksize = PAGE_SIZE;
++	s->s_blocksize_bits = PAGE_SHIFT;
+ 	s->s_magic = magic;
+ 	s->s_op = ops ? ops : &simple_super_operations;
+ 	s->s_time_gran = 1;
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index c492449..1eaa39a 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -636,7 +636,7 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
+ 	struct pagemapread pm;
+ 	int pagecount;
+ 	int ret = -ESRCH;
+-	struct mm_walk pagemap_walk;
++	struct mm_walk pagemap_walk = {};
+ 	unsigned long src;
+ 	unsigned long svpfn;
+ 	unsigned long start_vaddr;
+diff --git a/include/asm-arm/bitops.h b/include/asm-arm/bitops.h
+index 5c60bfc..9a1db20 100644
+--- a/include/asm-arm/bitops.h
++++ b/include/asm-arm/bitops.h
+@@ -277,9 +277,16 @@ static inline int constant_fls(int x)
+  * the clz instruction for much better code efficiency.
+  */
+ 
+-#define fls(x) \
++#define __fls(x) \
+ 	( __builtin_constant_p(x) ? constant_fls(x) : \
+ 	  ({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
++
++/* Implement fls() in C so that 64-bit args are suitably truncated */
++static inline int fls(int x)
++{
++	return __fls(x);
++}
++
+ #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
+ #define __ffs(x) (ffs(x) - 1)
+ #define ffz(x) __ffs( ~(x) )
+diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
+index f054778..5a544bf 100644
+--- a/include/asm-generic/vmlinux.lds.h
++++ b/include/asm-generic/vmlinux.lds.h
+@@ -204,6 +204,7 @@
+  * during second ld run in second ld pass when generating System.map */
+ #define TEXT_TEXT							\
+ 		ALIGN_FUNCTION();					\
++		*(.text.hot)						\
+ 		*(.text)						\
+ 		*(.ref.text)						\
+ 		*(.text.init.refok)					\
+@@ -213,7 +214,8 @@
+ 	CPU_KEEP(init.text)						\
+ 	CPU_KEEP(exit.text)						\
+ 	MEM_KEEP(init.text)						\
+-	MEM_KEEP(exit.text)
++	MEM_KEEP(exit.text)						\
++		*(.text.unlikely)
+ 
+ 
+ /* sched.text is aling to function alignment to secure we have same
+diff --git a/include/asm-sparc64/io.h b/include/asm-sparc64/io.h
+index 3158960..38e7ba6 100644
+--- a/include/asm-sparc64/io.h
++++ b/include/asm-sparc64/io.h
+@@ -16,7 +16,6 @@
+ /* BIO layer definitions. */
+ extern unsigned long kern_base, kern_size;
+ #define page_to_phys(page)	(page_to_pfn(page) << PAGE_SHIFT)
+-#define BIO_VMERGE_BOUNDARY	8192
+ 
+ static inline u8 _inb(unsigned long addr)
+ {
+diff --git a/include/asm-x86/signal.h b/include/asm-x86/signal.h
+index f15186d..6dac493 100644
+--- a/include/asm-x86/signal.h
++++ b/include/asm-x86/signal.h
+@@ -181,12 +181,12 @@ typedef struct sigaltstack {
+ #ifdef __KERNEL__
+ #include <asm/sigcontext.h>
+ 
+-#ifdef __386__
++#ifdef __i386__
+ 
+ #define __HAVE_ARCH_SIG_BITOPS
+ 
+ #define sigaddset(set,sig)		    \
+-	(__builtin_constantp(sig)	    \
++	(__builtin_constant_p(sig)	    \
+ 	 ? __const_sigaddset((set), (sig))  \
+ 	 : __gen_sigaddset((set), (sig)))
+ 
+diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
+index e7e91db..07cb761 100644
+--- a/include/linux/cpufreq.h
++++ b/include/linux/cpufreq.h
+@@ -109,6 +109,7 @@ struct cpufreq_policy {
+ #define CPUFREQ_ADJUST		(0)
+ #define CPUFREQ_INCOMPATIBLE	(1)
+ #define CPUFREQ_NOTIFY		(2)
++#define CPUFREQ_START		(3)
+ 
+ #define CPUFREQ_SHARED_TYPE_NONE (0) /* None */
+ #define CPUFREQ_SHARED_TYPE_HW	 (1) /* HW does needed coordination */
+diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
+index cde056e..0bfd97f 100644
+--- a/include/linux/ipv6.h
++++ b/include/linux/ipv6.h
+@@ -123,6 +123,7 @@ struct ipv6hdr {
+ 	struct	in6_addr	daddr;
+ };
+ 
++#ifdef __KERNEL__
+ /*
+  * This structure contains configuration options per IPv6 link.
+  */
+@@ -165,6 +166,7 @@ struct ipv6_devconf {
+ #endif
+ 	void		*sysctl;
+ };
++#endif
+ 
+ /* index values for the variables in ipv6_devconf */
+ enum {
+diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
+index de9d1df..d413e89 100644
+--- a/include/linux/kvm_host.h
++++ b/include/linux/kvm_host.h
+@@ -166,6 +166,7 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ 				struct kvm_userspace_memory_region *mem,
+ 				struct kvm_memory_slot old,
+ 				int user_alloc);
++void kvm_arch_flush_shadow(struct kvm *kvm);
+ gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn);
+ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn);
+ unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn);
+diff --git a/kernel/cpuset.c b/kernel/cpuset.c
+index 798b3ab..2a028f5 100644
+--- a/kernel/cpuset.c
++++ b/kernel/cpuset.c
+@@ -679,7 +679,9 @@ restart:
+ 				if (apn == b->pn) {
+ 					cpus_or(*dp, *dp, b->cpus_allowed);
+ 					b->pn = -1;
+-					update_domain_attr(dattr, b);
++					if (dattr)
++						update_domain_attr(dattr
++								   + nslot, b);
+ 				}
+ 			}
+ 			nslot++;
+diff --git a/kernel/marker.c b/kernel/marker.c
+index b5a9fe1..39e7596 100644
+--- a/kernel/marker.c
++++ b/kernel/marker.c
+@@ -127,6 +127,11 @@ void marker_probe_cb(const struct marker *mdata, void *call_private,
+ 		struct marker_probe_closure *multi;
+ 		int i;
+ 		/*
++		 * Read mdata->ptype before mdata->multi.
++		 */
++		smp_rmb();
++		multi = mdata->multi;
++		/*
+ 		 * multi points to an array, therefore accessing the array
+ 		 * depends on reading multi. However, even in this case,
+ 		 * we must insure that the pointer is read _before_ the array
+@@ -134,7 +139,6 @@ void marker_probe_cb(const struct marker *mdata, void *call_private,
+ 		 * in the fast path, so put the explicit barrier here.
+ 		 */
+ 		smp_read_barrier_depends();
+-		multi = mdata->multi;
+ 		for (i = 0; multi[i].func; i++) {
+ 			va_start(args, fmt);
+ 			multi[i].func(multi[i].probe_private, call_private, fmt,
+@@ -177,6 +181,11 @@ void marker_probe_cb_noarg(const struct marker *mdata,
+ 		struct marker_probe_closure *multi;
+ 		int i;
+ 		/*
++		 * Read mdata->ptype before mdata->multi.
++		 */
++		smp_rmb();
++		multi = mdata->multi;
++		/*
+ 		 * multi points to an array, therefore accessing the array
+ 		 * depends on reading multi. However, even in this case,
+ 		 * we must insure that the pointer is read _before_ the array
+@@ -184,7 +193,6 @@ void marker_probe_cb_noarg(const struct marker *mdata,
+ 		 * in the fast path, so put the explicit barrier here.
+ 		 */
+ 		smp_read_barrier_depends();
+-		multi = mdata->multi;
+ 		for (i = 0; multi[i].func; i++)
+ 			multi[i].func(multi[i].probe_private, call_private, fmt,
+ 				&args);
+diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c
+index 41d275a..379c25e 100644
+--- a/kernel/rcupreempt.c
++++ b/kernel/rcupreempt.c
+@@ -567,7 +567,7 @@ rcu_try_flip_waitack_needed(int cpu)
+ 	 * that this CPU already acknowledged the counter.
+ 	 */
+ 
+-	if ((curr - snap) > 2 || (snap & 0x1) == 0)
++	if ((curr - snap) > 2 || (curr & 0x1) == 0)
+ 		return 0;
+ 
+ 	/* We need this CPU to explicitly acknowledge the counter flip. */
+diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
+index 5b9b467..0fea0ee 100644
+--- a/kernel/sys_ni.c
++++ b/kernel/sys_ni.c
+@@ -59,6 +59,7 @@ cond_syscall(sys_epoll_create);
+ cond_syscall(sys_epoll_ctl);
+ cond_syscall(sys_epoll_wait);
+ cond_syscall(sys_epoll_pwait);
++cond_syscall(compat_sys_epoll_pwait);
+ cond_syscall(sys_semget);
+ cond_syscall(sys_semop);
+ cond_syscall(sys_semtimedop);
+diff --git a/mm/filemap.c b/mm/filemap.c
+index 1e6a7d3..4f32423 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -1778,7 +1778,7 @@ void iov_iter_advance(struct iov_iter *i, size_t bytes)
+ 		 * The !iov->iov_len check ensures we skip over unlikely
+ 		 * zero-length segments (without overruning the iovec).
+ 		 */
+-		while (bytes || unlikely(!iov->iov_len && i->count)) {
++		while (bytes || unlikely(i->count && !iov->iov_len)) {
+ 			int copy;
+ 
+ 			copy = min(bytes, iov->iov_len - base);
+diff --git a/mm/shmem.c b/mm/shmem.c
+index e2a6ae1..8f8412b 100644
+--- a/mm/shmem.c
++++ b/mm/shmem.c
+@@ -1503,7 +1503,6 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
+ 		inode->i_uid = current->fsuid;
+ 		inode->i_gid = current->fsgid;
+ 		inode->i_blocks = 0;
+-		inode->i_mapping->a_ops = &shmem_aops;
+ 		inode->i_mapping->backing_dev_info = &shmem_backing_dev_info;
+ 		inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+ 		inode->i_generation = get_seconds();
+@@ -1518,6 +1517,7 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
+ 			init_special_inode(inode, mode, dev);
+ 			break;
+ 		case S_IFREG:
++			inode->i_mapping->a_ops = &shmem_aops;
+ 			inode->i_op = &shmem_inode_operations;
+ 			inode->i_fop = &shmem_file_operations;
+ 			mpol_shared_policy_init(&info->policy,
+@@ -1907,6 +1907,7 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s
+ 			return error;
+ 		}
+ 		unlock_page(page);
++		inode->i_mapping->a_ops = &shmem_aops;
+ 		inode->i_op = &shmem_symlink_inode_operations;
+ 		kaddr = kmap_atomic(page, KM_USER0);
+ 		memcpy(kaddr, symname, len);
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index cad73b7..c443a7f 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -3273,6 +3273,7 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag)
+ 	 * log. Something worked...
+ 	 */
+ 	sk->sk_err_soft = 0;
++	icsk->icsk_probes_out = 0;
+ 	tp->rcv_tstamp = tcp_time_stamp;
+ 	prior_packets = tp->packets_out;
+ 	if (!prior_packets)
+@@ -3305,8 +3306,6 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag)
+ 	return 1;
+ 
+ no_queue:
+-	icsk->icsk_probes_out = 0;
+-
+ 	/* If this ack opens up a zero window, clear backoff.  It was
+ 	 * being used to time the probes, and is probably far higher than
+ 	 * it needs to be for normal retransmission.
+diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
+index 56fcda3..9f3f7ba 100644
+--- a/net/ipv4/udp.c
++++ b/net/ipv4/udp.c
+@@ -1319,6 +1319,8 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
+ 			return -ENOPROTOOPT;
+ 		if (val != 0 && val < 8) /* Illegal coverage: use default (8) */
+ 			val = 8;
++		else if (val > USHORT_MAX)
++			val = USHORT_MAX;
+ 		up->pcslen = val;
+ 		up->pcflag |= UDPLITE_SEND_CC;
+ 		break;
+@@ -1331,6 +1333,8 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
+ 			return -ENOPROTOOPT;
+ 		if (val != 0 && val < 8) /* Avoid silly minimal values.       */
+ 			val = 8;
++		else if (val > USHORT_MAX)
++			val = USHORT_MAX;
+ 		up->pcrlen = val;
+ 		up->pcflag |= UDPLITE_RECV_CC;
+ 		break;
+diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
+index 1ee4fa1..918fde4 100644
+--- a/net/ipv6/ip6_fib.c
++++ b/net/ipv6/ip6_fib.c
+@@ -663,7 +663,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
+ 
+ static __inline__ void fib6_start_gc(struct net *net, struct rt6_info *rt)
+ {
+-	if (net->ipv6.ip6_fib_timer->expires == 0 &&
++	if (!timer_pending(net->ipv6.ip6_fib_timer) &&
+ 	    (rt->rt6i_flags & (RTF_EXPIRES|RTF_CACHE)))
+ 		mod_timer(net->ipv6.ip6_fib_timer, jiffies +
+ 			  net->ipv6.sysctl.ip6_rt_gc_interval);
+@@ -671,7 +671,7 @@ static __inline__ void fib6_start_gc(struct net *net, struct rt6_info *rt)
+ 
+ void fib6_force_start_gc(struct net *net)
+ {
+-	if (net->ipv6.ip6_fib_timer->expires == 0)
++	if (!timer_pending(net->ipv6.ip6_fib_timer))
+ 		mod_timer(net->ipv6.ip6_fib_timer, jiffies +
+ 			  net->ipv6.sysctl.ip6_rt_gc_interval);
+ }
+diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
+index 17092d6..9ee9783 100644
+--- a/scripts/Makefile.modpost
++++ b/scripts/Makefile.modpost
+@@ -101,6 +101,7 @@ quiet_cmd_kernel-mod = MODPOST $@
+       cmd_kernel-mod = $(modpost) $@
+ 
+ vmlinux.o: FORCE
++	@rm -fr $(kernelmarkersfile)
+ 	$(call cmd,kernel-mod)
+ 
+ # Declare generated files as targets for modpost
+diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
+index a07f91a..8f038e6 100644
+--- a/scripts/mod/modpost.c
++++ b/scripts/mod/modpost.c
+@@ -1992,7 +1992,8 @@ static void read_markers(const char *fname)
+ 			mod->skip = 1;
+ 		}
+ 
+-		add_marker(mod, marker, fmt);
++		if (!mod->skip)
++			add_marker(mod, marker, fmt);
+ 	}
+ 	return;
+ fail:
+diff --git a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c
+index bbcee2c..a69b420 100644
+--- a/sound/pci/trident/trident_main.c
++++ b/sound/pci/trident/trident_main.c
+@@ -1590,7 +1590,10 @@ static int snd_trident_trigger(struct snd_pcm_substream *substream,
+ 	if (spdif_flag) {
+ 		if (trident->device != TRIDENT_DEVICE_ID_SI7018) {
+ 			outl(trident->spdif_pcm_bits, TRID_REG(trident, NX_SPCSTATUS));
+-			outb(trident->spdif_pcm_ctrl, TRID_REG(trident, NX_SPCTRL_SPCSO + 3));
++			val = trident->spdif_pcm_ctrl;
++			if (!go)
++				val &= ~(0x28);
++			outb(val, TRID_REG(trident, NX_SPCTRL_SPCSO + 3));
+ 		} else {
+ 			outl(trident->spdif_pcm_bits, TRID_REG(trident, SI_SPDIF_CS));
+ 			val = inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) | SPDIF_EN;
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index 2d29e26..0262847 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -377,6 +377,9 @@ int __kvm_set_memory_region(struct kvm *kvm,
+ 	if (mem->slot >= kvm->nmemslots)
+ 		kvm->nmemslots = mem->slot + 1;
+ 
++	if (!npages)
++		kvm_arch_flush_shadow(kvm);
++
+ 	*memslot = new;
+ 
+ 	r = kvm_arch_set_memory_region(kvm, mem, old, user_alloc);

Added: dists/sid/linux-2.6/debian/patches/series/2
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/series/2	Sat Aug  2 07:03:47 2008
@@ -0,0 +1,2 @@
+- bugfix/all/x86-acpi-sleep-x61s.patch
++ bugfix/all/stable/2.6.26.1.patch



More information about the Kernel-svn-changes mailing list