- Update to 3.4-rc6.
authorJeff Mahoney <jeffm@suse.com>
Mon, 7 May 2012 17:54:14 +0000 (13:54 -0400)
committerJeff Mahoney <jeffm@suse.com>
Mon, 7 May 2012 17:54:14 +0000 (13:54 -0400)
  - Eliminated 2 patches.

suse-commit: 749ea8f9e366dea70a04e209ba5339498625745f

15 files changed:
1  2 
Makefile
arch/x86/Kconfig
arch/x86/kernel/cpu/amd.c
drivers/acpi/scan.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/nouveau/nouveau_acpi.c
drivers/gpu/drm/radeon/radeon_device.c
drivers/input/mouse/synaptics.c
drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
drivers/net/ethernet/ibm/ehea/ehea_main.c
drivers/net/wireless/b43/main.c
drivers/scsi/scsi_lib.c
drivers/tty/vt/keyboard.c
fs/namei.c
include/linux/efi.h

diff --combined Makefile
+++ b/Makefile
@@@ -1,7 -1,7 +1,7 @@@
  VERSION = 3
  PATCHLEVEL = 4
  SUBLEVEL = 0
- EXTRAVERSION = -rc5
+ EXTRAVERSION = -rc6
  NAME = Saber-toothed Squirrel
  
  # *DOCUMENTATION*
@@@ -65,20 -65,6 +65,20 @@@ ifndef KBUILD_CHECKSR
    KBUILD_CHECKSRC = 0
  endif
  
 +# Call message checker as part of the C compilation
 +#
 +# Use 'make D=1' to enable checking
 +# Use 'make D=2' to create the message catalog
 +
 +ifdef D
 +  ifeq ("$(origin D)", "command line")
 +    KBUILD_KMSG_CHECK = $(D)
 +  endif
 +endif
 +ifndef KBUILD_KMSG_CHECK
 +  KBUILD_KMSG_CHECK = 0
 +endif
 +
  # Use make M=dir to specify directory of external module to build
  # Old syntax make ... SUBDIRS=$PWD is still supported
  # Setting the environment variable KBUILD_EXTMOD take precedence
@@@ -361,7 -347,6 +361,7 @@@ CHECK              = spars
  
  CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
                  -Wbitwise -Wno-return-void $(CF)
 +KMSG_CHECK    = $(srctree)/scripts/kmsg-doc
  CFLAGS_MODULE   =
  AFLAGS_MODULE   =
  LDFLAGS_MODULE  =
@@@ -391,11 -376,6 +391,11 @@@ KBUILD_AFLAGS_MODULE  := -DMODUL
  KBUILD_CFLAGS_MODULE  := -DMODULE
  KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
  
 +# Warn about unsupported modules in kernels built inside Autobuild
 +ifneq ($(wildcard /.buildenv),)
 +CFLAGS                += -DUNSUPPORTED_MODULES=2
 +endif
 +
  # Read KERNELRELEASE from include/config/kernel.release (if it exists)
  KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
  KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
@@@ -412,7 -392,6 +412,7 @@@ export KBUILD_AFLAGS AFLAGS_KERNEL AFLA
  export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
  export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
  export KBUILD_ARFLAGS
 +export KBUILD_KMSG_CHECK KMSG_CHECK
  
  # When compiling out-of-tree modules, put MODVERDIR in the module
  # tree rather than in the kernel tree. The kernel tree might
@@@ -613,11 -592,6 +613,11 @@@ KBUILD_CFLAGS    += -fomit-frame-pointe
  endif
  endif
  
 +ifdef CONFIG_UNWIND_INFO
 +KBUILD_CFLAGS += -fasynchronous-unwind-tables
 +LDFLAGS_vmlinux       += --eh-frame-hdr
 +endif
 +
  ifdef CONFIG_DEBUG_INFO
  KBUILD_CFLAGS += -g
  KBUILD_AFLAGS += -gdwarf-2
@@@ -1053,7 -1027,7 +1053,7 @@@ depend dep
  
  # ---------------------------------------------------------------------------
  # Firmware install
 -INSTALL_FW_PATH=$(INSTALL_MOD_PATH)/lib/firmware
 +INSTALL_FW_PATH=$(INSTALL_MOD_PATH)/lib/firmware/$(KERNELRELEASE)
  export INSTALL_FW_PATH
  
  PHONY += firmware_install
diff --combined arch/x86/Kconfig
@@@ -8,7 -8,7 +8,7 @@@ config 64BI
  
  config X86_32
        def_bool !64BIT
 -      select CLKSRC_I8253
 +      select CLKSRC_I8253 if !XEN
  
  config X86_64
        def_bool 64BIT
@@@ -20,7 -20,7 +20,7 @@@ config X8
        select HAVE_UNSTABLE_SCHED_CLOCK
        select HAVE_IDE
        select HAVE_OPROFILE
 -      select HAVE_PCSPKR_PLATFORM
 +      select HAVE_PCSPKR_PLATFORM if !XEN_UNPRIVILEGED_GUEST
        select HAVE_PERF_EVENTS
        select HAVE_IRQ_WORK
        select HAVE_IOREMAP_PROT
@@@ -42,8 -42,8 +42,8 @@@
        select HAVE_FUNCTION_TRACE_MCOUNT_TEST
        select HAVE_FTRACE_NMI_ENTER if DYNAMIC_FTRACE
        select HAVE_SYSCALL_TRACEPOINTS
 -      select HAVE_KVM
 -      select HAVE_ARCH_KGDB
 +      select HAVE_KVM if !XEN
 +      select HAVE_ARCH_KGDB if !XEN
        select HAVE_ARCH_TRACEHOOK
        select HAVE_GENERIC_DMA_COHERENT if X86_32
        select HAVE_EFFICIENT_UNALIGNED_ACCESS
        select HAVE_REGS_AND_STACK_ACCESS_API
        select HAVE_DMA_API_DEBUG
        select HAVE_KERNEL_GZIP
 -      select HAVE_KERNEL_BZIP2
 -      select HAVE_KERNEL_LZMA
 -      select HAVE_KERNEL_XZ
 -      select HAVE_KERNEL_LZO
 +      select HAVE_KERNEL_BZIP2 if !XEN
 +      select HAVE_KERNEL_LZMA if !XEN
 +      select HAVE_KERNEL_XZ if !XEN
 +      select HAVE_KERNEL_LZO if !XEN
        select HAVE_HW_BREAKPOINT
        select HAVE_MIXED_BREAKPOINTS_REGS
        select PERF_EVENTS
 -      select HAVE_PERF_EVENTS_NMI
 +      select HAVE_PERF_EVENTS_NMI if !XEN
        select ANON_INODES
        select HAVE_ALIGNED_STRUCT_PAGE if SLUB && !M386
        select HAVE_CMPXCHG_LOCAL if !M386
        select IRQ_FORCED_THREADING
        select USE_GENERIC_SMP_HELPERS if SMP
        select HAVE_BPF_JIT if (X86_64 && NET)
 -      select CLKEVT_I8253
 +      select CLKEVT_I8253 if !XEN
        select ARCH_HAVE_NMI_SAFE_CMPXCHG
        select GENERIC_IOMAP
-       select DCACHE_WORD_ACCESS if !DEBUG_PAGEALLOC
+       select DCACHE_WORD_ACCESS
  
  config INSTRUCTION_DECODER
        def_bool (KPROBES || PERF_EVENTS)
@@@ -101,19 -101,17 +101,19 @@@ config GENERIC_CMOS_UPDAT
  
  config CLOCKSOURCE_WATCHDOG
        def_bool y
 +      depends on !XEN
  
  config GENERIC_CLOCKEVENTS
        def_bool y
  
  config ARCH_CLOCKSOURCE_DATA
        def_bool y
 -      depends on X86_64
 +      depends on X86_64 && !XEN
  
  config GENERIC_CLOCKEVENTS_BROADCAST
        def_bool y
        depends on X86_64 || (X86_32 && X86_LOCAL_APIC)
 +      depends on !XEN
  
  config LOCKDEP_SUPPORT
        def_bool y
@@@ -131,7 -129,7 +131,7 @@@ config SBU
        bool
  
  config NEED_DMA_MAP_STATE
 -       def_bool (X86_64 || INTEL_IOMMU || DMA_API_DEBUG)
 +       def_bool (X86_64 || INTEL_IOMMU || DMA_API_DEBUG || SWIOTLB)
  
  config NEED_SG_DMA_LENGTH
        def_bool y
@@@ -195,7 -193,6 +195,7 @@@ config NEED_PER_CPU_PAGE_FIRST_CHUN
  
  config ARCH_HIBERNATION_POSSIBLE
        def_bool y
 +      depends on !XEN
  
  config ARCH_SUSPEND_POSSIBLE
        def_bool y
@@@ -228,15 -225,7 +228,15 @@@ config X86_64_SM
  
  config X86_HT
        def_bool y
 -      depends on SMP
 +      depends on SMP && !XEN
 +
 +config X86_NO_TSS
 +      def_bool y
 +      depends on XEN
 +
 +config X86_NO_IDT
 +      def_bool y
 +      depends on XEN
  
  config X86_32_LAZY_GS
        def_bool y
@@@ -252,7 -241,7 +252,7 @@@ config KTIME_SCALA
  
  config ARCH_CPU_PROBE_RELEASE
        def_bool y
 -      depends on HOTPLUG_CPU
 +      depends on HOTPLUG_CPU && !XEN
  
  source "init/Kconfig"
  source "kernel/Kconfig.freezer"
@@@ -318,22 -307,13 +318,22 @@@ config X86_MPPARS
          For old smp systems that do not have proper acpi support. Newer systems
          (esp with 64bit cpus) with acpi support, MADT and DSDT will override it
  
 +config X86_XEN
 +      bool "Xen-compatible"
 +      depends on X86_32
 +      select XEN
 +      select X86_PAE
 +      help
 +        Choose this option if you plan to run this kernel on top of the
 +        Xen Hypervisor.
 +
  config X86_BIGSMP
        bool "Support for big SMP systems with more than 8 CPUs"
 -      depends on X86_32 && SMP
 +      depends on X86_32 && SMP && !XEN
        ---help---
          This option is needed for the systems that have more than 8 CPUs
  
 -if X86_32
 +if X86_32 && !XEN
  config X86_EXTENDED_PLATFORM
        bool "Support for extended (non-PC) x86 platforms"
        default y
          generic distribution kernel, say Y here - otherwise say N.
  endif
  
 -if X86_64
 +config X86_64_XEN
 +      bool "Enable Xen compatible kernel"
 +      depends on X86_64
 +      select XEN
 +      help
 +        This option will compile a kernel compatible with Xen hypervisor
 +
 +if X86_64 && !XEN
  config X86_EXTENDED_PLATFORM
        bool "Support for extended (non-PC) x86 platforms"
        default y
@@@ -546,7 -519,7 +546,7 @@@ config X86_ES700
  
  config X86_32_IRIS
        tristate "Eurobraille/Iris poweroff module"
 -      depends on X86_32
 +      depends on X86_32 && !XEN
        ---help---
          The Iris machines from EuroBraille do not have APM or ACPI support
          to shut themselves down properly.  A special I/O sequence is
  config SCHED_OMIT_FRAME_POINTER
        def_bool y
        prompt "Single-depth WCHAN output"
 -      depends on X86
 +      depends on X86 && !STACK_UNWIND
        ---help---
          Calculate simpler /proc/<PID>/wchan values. If this option
          is disabled then wchan values will recurse back to the
  
  menuconfig PARAVIRT_GUEST
        bool "Paravirtualized guest support"
 +      depends on !XEN
        ---help---
          Say Y here to get to see options related to running Linux under
          various hypervisors.  This option alone does not add any kernel code.
@@@ -652,7 -624,6 +652,7 @@@ config NO_BOOTME
  
  config MEMTEST
        bool "Memtest"
 +      depends on !XEN
        ---help---
          This option adds a kernel parameter 'memtest', which allows memtest
          to be set.
@@@ -675,7 -646,6 +675,7 @@@ source "arch/x86/Kconfig.cpu
  config HPET_TIMER
        def_bool X86_64
        prompt "HPET Timer Support" if X86_32
 +      depends on !XEN
        ---help---
          Use the IA-PC HPET (High Precision Event Timer) to manage
          time in preference to the PIT and RTC, if a HPET is
@@@ -713,7 -683,6 +713,7 @@@ config APB_TIME
  config DMI
        default y
        bool "Enable DMI scanning" if EXPERT
 +      depends on !XEN_UNPRIVILEGED_GUEST
        ---help---
          Enabled scanning of DMI to identify machine quirks. Say Y
          here unless you have verified that your setup is not
@@@ -724,7 -693,7 +724,7 @@@ config GART_IOMM
        bool "GART IOMMU support" if EXPERT
        default y
        select SWIOTLB
 -      depends on X86_64 && PCI && AMD_NB
 +      depends on X86_64 && PCI && AMD_NB && !X86_64_XEN
        ---help---
          Support for full DMA access of devices with 32bit memory access only
          on systems with more than 3GB. This is usually needed for USB,
  config CALGARY_IOMMU
        bool "IBM Calgary IOMMU support"
        select SWIOTLB
 -      depends on X86_64 && PCI && EXPERIMENTAL
 +      depends on X86_64 && PCI && !X86_64_XEN && EXPERIMENTAL
        ---help---
          Support for hardware IOMMUs in IBM's xSeries x366 and x460
          systems. Needed to run systems with more than 3GB of memory
@@@ -767,8 -736,7 +767,8 @@@ config CALGARY_IOMMU_ENABLED_BY_DEFAUL
  
  # need this always selected by IOMMU for the VIA workaround
  config SWIOTLB
 -      def_bool y if X86_64
 +      def_bool y if X86_64 || XEN
 +      prompt "Software I/O TLB" if XEN_UNPRIVILEGED_GUEST && !XEN_PCIDEV_FRONTEND
        ---help---
          Support for software bounce buffers used on x86-64 systems
          which don't have a hardware IOMMU (e.g. the current generation
@@@ -789,12 -757,11 +789,12 @@@ config MAXSM
  
  config NR_CPUS
        int "Maximum number of CPUs" if SMP && !MAXSMP
 -      range 2 8 if SMP && X86_32 && !X86_BIGSMP
 +      range 2 8 if SMP && X86_32 && !X86_BIGSMP && !X86_XEN
        range 2 512 if SMP && !MAXSMP
        default "1" if !SMP
        default "4096" if MAXSMP
        default "32" if SMP && (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000)
 +      default "16" if X86_64_XEN
        default "8" if SMP
        ---help---
          This allows you to specify the maximum number of CPUs which this
@@@ -837,7 -804,7 +837,7 @@@ source "kernel/Kconfig.preempt
  
  config X86_UP_APIC
        bool "Local APIC support on uniprocessors"
 -      depends on X86_32 && !SMP && !X86_32_NON_STANDARD
 +      depends on X86_32 && !SMP && !X86_32_NON_STANDARD && !XEN_UNPRIVILEGED_GUEST
        ---help---
          A local APIC (Advanced Programmable Interrupt Controller) is an
          integrated interrupt controller in the CPU. If you have a single-CPU
@@@ -863,12 -830,10 +863,12 @@@ config X86_UP_IOAPI
  config X86_LOCAL_APIC
        def_bool y
        depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC
 +      depends on !XEN_UNPRIVILEGED_GUEST
  
  config X86_IO_APIC
        def_bool y
        depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_IOAPIC
 +      depends on !XEN_UNPRIVILEGED_GUEST
  
  config X86_VISWS_APIC
        def_bool y
  
  config X86_REROUTE_FOR_BROKEN_BOOT_IRQS
        bool "Reroute for broken boot IRQs"
 -      depends on X86_IO_APIC
 +      depends on X86_IO_APIC && !XEN
        ---help---
          This option enables a workaround that fixes a source of
          spurious interrupts. This is recommended when threaded
  
  config X86_MCE
        bool "Machine Check / overheating reporting"
 +      depends on !XEN_UNPRIVILEGED_GUEST
        ---help---
          Machine Check support allows the processor to notify the
          kernel if it detects a problem (e.g. overheating, data corruption).
  config X86_MCE_INTEL
        def_bool y
        prompt "Intel MCE features"
 -      depends on X86_MCE && X86_LOCAL_APIC
 +      depends on X86_MCE && X86_LOCAL_APIC && !XEN
        ---help---
           Additional support for intel specific MCE features such as
           the thermal monitor.
  config X86_MCE_AMD
        def_bool y
        prompt "AMD MCE features"
 -      depends on X86_MCE && X86_LOCAL_APIC
 +      depends on X86_MCE && X86_LOCAL_APIC && !XEN
        ---help---
           Additional support for AMD specific MCE features such as
           the DRAM Error Threshold.
  
  config X86_ANCIENT_MCE
        bool "Support for old Pentium 5 / WinChip machine checks"
 -      depends on X86_32 && X86_MCE
 +      depends on X86_32 && X86_MCE && !XEN
        ---help---
          Include support for machine check handling on old Pentium 5 or WinChip
          systems. These typically need to be enabled explicitely on the command
@@@ -942,10 -906,6 +942,10 @@@ config X86_MCE_INJEC
          If you don't know what a machine check is and you don't do kernel
          QA it is safe to say n.
  
 +config X86_XEN_MCE
 +      def_bool y
 +      depends on XEN && X86_MCE
 +
  config X86_THERMAL_VECTOR
        def_bool y
        depends on X86_MCE_INTEL
@@@ -999,7 -959,7 +999,7 @@@ config I8
  
  config X86_REBOOTFIXUPS
        bool "Enable X86 board specific fixups for reboot"
 -      depends on X86_32
 +      depends on X86_32 && !XEN
        ---help---
          This enables chipset and/or board specific fixups to be done
          in order to get reboot to work correctly. This is only needed on
  
  config MICROCODE
        tristate "/dev/cpu/microcode - microcode support"
 +      depends on !XEN_UNPRIVILEGED_GUEST
        select FW_LOADER
        ---help---
          If you say Y here, you will be able to update the microcode on
  
  config MICROCODE_INTEL
        bool "Intel microcode patch loading support"
 -      depends on MICROCODE
 +      depends on MICROCODE && !XEN
        default MICROCODE
        select FW_LOADER
        ---help---
  
  config MICROCODE_AMD
        bool "AMD microcode patch loading support"
 -      depends on MICROCODE
 +      depends on MICROCODE && !XEN
        select FW_LOADER
        ---help---
          If you select this option, microcode patch loading support for AMD
@@@ -1060,7 -1019,6 +1060,7 @@@ config MICROCODE_OLD_INTERFAC
  
  config X86_MSR
        tristate "/dev/cpu/*/msr - Model-specific register support"
 +      select XEN_DOMCTL if XEN_PRIVILEGED_GUEST
        ---help---
          This device gives privileged processes access to the x86
          Model-Specific Registers (MSRs).  It is a character device with
@@@ -1078,7 -1036,7 +1078,7 @@@ config X86_CPUI
  
  choice
        prompt "High Memory Support"
 -      default HIGHMEM64G if X86_NUMAQ
 +      default HIGHMEM64G if X86_NUMAQ || XEN
        default HIGHMEM4G
        depends on X86_32
  
@@@ -1121,7 -1079,7 +1121,7 @@@ config NOHIGHME
  
  config HIGHMEM4G
        bool "4GB"
 -      depends on !X86_NUMAQ
 +      depends on !X86_NUMAQ && !XEN
        ---help---
          Select this if you have a 32-bit processor and between 1 and 4
          gigabytes of physical RAM.
@@@ -1197,12 -1155,12 +1197,12 @@@ config ARCH_PHYS_ADDR_T_64BI
        def_bool X86_64 || X86_PAE
  
  config ARCH_DMA_ADDR_T_64BIT
 -      def_bool X86_64 || HIGHMEM64G
 +      def_bool X86_64 || XEN || HIGHMEM64G
  
  config DIRECT_GBPAGES
        bool "Enable 1GB pages for kernel pagetables" if EXPERT
        default y
 -      depends on X86_64
 +      depends on X86_64 && !XEN
        ---help---
          Allow the kernel linear mapping to use 1GB pages on CPUs that
          support it. This can improve the kernel's performance a tiny bit by
  # Common NUMA Features
  config NUMA
        bool "Numa Memory Allocation and Scheduler Support"
 -      depends on SMP
 +      depends on SMP && !XEN
        depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL)
        default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP)
        ---help---
@@@ -1312,13 -1270,12 +1312,13 @@@ config ARCH_DISCONTIGMEM_DEFAUL
  config ARCH_SPARSEMEM_ENABLE
        def_bool y
        depends on X86_64 || NUMA || (EXPERIMENTAL && X86_32) || X86_32_NON_STANDARD
 +      depends on !XEN
        select SPARSEMEM_STATIC if X86_32
        select SPARSEMEM_VMEMMAP_ENABLE if X86_64
  
  config ARCH_SPARSEMEM_DEFAULT
        def_bool y
 -      depends on X86_64
 +      depends on X86_64 && !X86_64_XEN
  
  config ARCH_SELECT_MEMORY_MODEL
        def_bool y
@@@ -1350,7 -1307,6 +1350,7 @@@ config HIGHPT
  
  config X86_CHECK_BIOS_CORRUPTION
        bool "Check for low memory corruption"
 +      depends on !XEN
        ---help---
          Periodically check for memory corruption in low memory, which
          is suspected to be caused by BIOS.  Even when enabled in the
@@@ -1381,7 -1337,6 +1381,7 @@@ config X86_BOOTPARAM_MEMORY_CORRUPTION_
  
  config X86_RESERVE_LOW
        int "Amount of low memory, in kilobytes, to reserve for the BIOS"
 +      depends on !XEN
        default 64
        range 4 640
        ---help---
  config MATH_EMULATION
        bool
        prompt "Math emulation" if X86_32
 +      depends on !XEN
        ---help---
          Linux can emulate a math coprocessor (used for floating point
          operations) if you don't have one. 486DX and Pentium processors have
  config MTRR
        def_bool y
        prompt "MTRR (Memory Type Range Register) support" if EXPERT
 +      depends on !XEN_UNPRIVILEGED_GUEST
        ---help---
          On Intel P6 family processors (Pentium Pro, Pentium II and later)
          the Memory Type Range Registers (MTRRs) may be used to control
  config MTRR_SANITIZER
        def_bool y
        prompt "MTRR cleanup support"
 -      depends on MTRR
 +      depends on MTRR && !XEN
        ---help---
          Convert MTRR layout from continuous to discrete, so X drivers can
          add writeback entries.
@@@ -1505,8 -1458,8 +1505,8 @@@ config MTRR_SANITIZER_SPARE_REG_NR_DEFA
  
  config X86_PAT
        def_bool y
 -      prompt "x86 PAT support" if EXPERT
 -      depends on MTRR
 +      prompt "x86 PAT support" if EXPERT || XEN_UNPRIVILEGED_GUEST
 +      depends on MTRR || (XEN_UNPRIVILEGED_GUEST && XEN_PCIDEV_FRONTEND)
        ---help---
          Use PAT attributes to setup page level cache control.
  
@@@ -1533,7 -1486,7 +1533,7 @@@ config ARCH_RANDO
  
  config EFI
        bool "EFI runtime service support"
 -      depends on ACPI
 +      depends on ACPI && !XEN_UNPRIVILEGED_GUEST
        ---help---
          This enables the kernel to use EFI runtime services that are
          available (such as the EFI variable services).
  
  config EFI_STUB
         bool "EFI stub support"
 -       depends on EFI
 +       depends on EFI && !XEN
         ---help---
            This kernel feature allows a bzImage to be loaded directly
          by EFI firmware without the use of a bootloader.
@@@ -1588,7 -1541,6 +1588,7 @@@ source kernel/Kconfig.h
  
  config KEXEC
        bool "kexec system call"
 +      depends on !XEN_UNPRIVILEGED_GUEST
        ---help---
          kexec is a system call that implements the ability to shutdown your
          current kernel, and to start another kernel.  It is like a reboot
  config CRASH_DUMP
        bool "kernel crash dumps"
        depends on X86_64 || (X86_32 && HIGHMEM)
 +      depends on !XEN
        ---help---
          Generate crash dump after being started by kexec.
          This should be normally only set in special crash dump kernels
@@@ -1627,8 -1578,7 +1627,8 @@@ config KEXEC_JUM
          code in physical address mode via KEXEC
  
  config PHYSICAL_START
 -      hex "Physical address where the kernel is loaded" if (EXPERT || CRASH_DUMP)
 +      hex "Physical address where the kernel is loaded" if (EXPERT || CRASH_DUMP || XEN)
 +      default 0x100000 if XEN
        default "0x1000000"
        ---help---
          This gives the physical address where the kernel is loaded.
  
  config RELOCATABLE
        bool "Build a relocatable kernel"
 +      depends on !XEN
        default y
        ---help---
          This builds a kernel image that retains relocation information
@@@ -1692,8 -1641,7 +1692,8 @@@ config X86_NEED_RELOC
        depends on X86_32 && RELOCATABLE
  
  config PHYSICAL_ALIGN
 -      hex "Alignment value to which kernel should be aligned" if X86_32
 +      hex "Alignment value to which kernel should be aligned" if X86_32 && !XEN
 +      default 0x2000 if XEN
        default "0x1000000"
        range 0x2000 0x1000000
        ---help---
@@@ -1786,7 -1734,6 +1786,7 @@@ endmen
  config ARCH_ENABLE_MEMORY_HOTPLUG
        def_bool y
        depends on X86_64 || (X86_32 && HIGHMEM)
 +      depends on !XEN
  
  config ARCH_ENABLE_MEMORY_HOTREMOVE
        def_bool y
@@@ -1804,8 -1751,6 +1804,8 @@@ config ARCH_HIBERNATION_HEADE
  
  source "kernel/power/Kconfig"
  
 +if !XEN_UNPRIVILEGED_GUEST
 +
  source "drivers/acpi/Kconfig"
  
  source "drivers/sfi/Kconfig"
@@@ -1816,7 -1761,7 +1816,7 @@@ config X86_APM_BOO
  
  menuconfig APM
        tristate "APM (Advanced Power Management) BIOS support"
 -      depends on X86_32 && PM_SLEEP
 +      depends on X86_32 && PM_SLEEP && !XEN
        ---help---
          APM is a BIOS specification for saving power using several different
          techniques. This is mostly useful for battery powered laptops with
@@@ -1941,8 -1886,6 +1941,8 @@@ source "drivers/cpuidle/Kconfig
  
  source "drivers/idle/Kconfig"
  
 +endif # !XEN_UNPRIVILEGED_GUEST
 +
  endmenu
  
  
@@@ -1952,7 -1895,6 +1952,7 @@@ config PC
        bool "PCI support"
        default y
        select ARCH_SUPPORTS_MSI if (X86_LOCAL_APIC && X86_IO_APIC)
 +      select ARCH_SUPPORTS_MSI if (XEN_UNPRIVILEGED_GUEST && XEN_PCIDEV_FRONTEND)
        ---help---
          Find out whether you have a PCI motherboard. PCI is the name of a
          bus system, i.e. the way the CPU talks to the other stuff inside
@@@ -1980,36 -1922,25 +1980,36 @@@ choic
  
  config PCI_GOBIOS
        bool "BIOS"
 +      depends on !XEN
  
  config PCI_GOMMCONFIG
        bool "MMConfig"
 +      depends on !XEN_UNPRIVILEGED_GUEST
  
  config PCI_GODIRECT
        bool "Direct"
 +      depends on !XEN_UNPRIVILEGED_GUEST
  
  config PCI_GOOLPC
        bool "OLPC XO-1"
 -      depends on OLPC
 +      depends on OLPC && !XEN_UNPRIVILEGED_GUEST
 +
 +config PCI_GOXEN_FE
 +      bool "Xen PCI Frontend"
 +      depends on X86_XEN
 +      help
 +        The PCI device frontend driver allows the kernel to import arbitrary
 +        PCI devices from a PCI backend to support PCI driver domains.
  
  config PCI_GOANY
        bool "Any"
 +      depends on !XEN_UNPRIVILEGED_GUEST
  
  endchoice
  
  config PCI_BIOS
        def_bool y
 -      depends on X86_32 && PCI && (PCI_GOBIOS || PCI_GOANY)
 +      depends on X86_32 && PCI && !XEN && (PCI_GOBIOS || PCI_GOANY)
  
  # x86-64 doesn't support PCI BIOS access from long mode so always go direct.
  config PCI_DIRECT
@@@ -2026,7 -1957,7 +2026,7 @@@ config PCI_OLP
  
  config PCI_XEN
        def_bool y
 -      depends on PCI && XEN
 +      depends on PCI && PARAVIRT_XEN
        select SWIOTLB_XEN
  
  config PCI_DOMAINS
@@@ -2057,7 -1988,7 +2057,7 @@@ source "drivers/pci/Kconfig
  
  # x86_64 have no ISA slots, but can have ISA-style DMA.
  config ISA_DMA_API
 -      bool "ISA-style DMA support" if (X86_64 && EXPERT)
 +      bool "ISA-style DMA support" if ((X86_64 || XEN) && EXPERT) || XEN_UNPRIVILEGED_GUEST
        default y
        help
          Enables ISA-style DMA support for devices requiring such controllers.
@@@ -2067,7 -1998,6 +2067,7 @@@ if X86_3
  
  config ISA
        bool "ISA support"
 +      depends on !XEN
        ---help---
          Find out whether you have ISA slots on your motherboard.  ISA is the
          name of a bus system, i.e. the way the CPU talks to the other stuff
@@@ -2095,7 -2025,6 +2095,7 @@@ source "drivers/eisa/Kconfig
  
  config MCA
        bool "MCA support"
 +      depends on !XEN
        ---help---
          MicroChannel Architecture is found in some IBM PS/2 machines and
          laptops.  It is a bus system similar to PCI or ISA. See
@@@ -2127,7 -2056,7 +2127,7 @@@ config SCx200HR_TIME
  
  config OLPC
        bool "One Laptop Per Child support"
 -      depends on !X86_PAE
 +      depends on !X86_PAE && !XEN
        select GPIOLIB
        select OF
        select OF_PROMTREE
@@@ -2206,7 -2135,7 +2206,7 @@@ endif # X86_3
  
  config AMD_NB
        def_bool y
 -      depends on CPU_SUP_AMD && PCI
 +      depends on CPU_SUP_AMD && PCI && !XEN_UNPRIVILEGED_GUEST
  
  source "drivers/pcmcia/Kconfig"
  
@@@ -2290,9 -2219,7 +2290,9 @@@ source "net/Kconfig
  
  source "drivers/Kconfig"
  
 +if !XEN_UNPRIVILEGED_GUEST
  source "drivers/firmware/Kconfig"
 +endif
  
  source "fs/Kconfig"
  
@@@ -334,7 -334,7 +334,7 @@@ static void __cpuinit amd_detect_cmp(st
  int amd_get_nb_id(int cpu)
  {
        int id = 0;
 -#ifdef CONFIG_SMP
 +#if defined(CONFIG_SMP) && !defined(CONFIG_XEN)
        id = per_cpu(cpu_llc_id, cpu);
  #endif
        return id;
@@@ -458,10 -458,8 +458,10 @@@ static void __cpuinit early_init_amd(st
        if (c->x86_power & (1 << 8)) {
                set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
                set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC);
 +#ifndef CONFIG_XEN
                if (!check_tsc_unstable())
                        sched_clock_stable = 1;
 +#endif
        }
  
  #ifdef CONFIG_X86_64
                    (c->x86_model == 8 && c->x86_mask >= 8))
                        set_cpu_cap(c, X86_FEATURE_K6_MTRR);
  #endif
 -#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_PCI)
 +#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_PCI) && !defined(CONFIG_XEN)
        /* check CPU config space for extended APIC ID */
        if (cpu_has_apic && c->x86 >= 0xf) {
                unsigned int val;
  
  static void __cpuinit init_amd(struct cpuinfo_x86 *c)
  {
 +#ifndef CONFIG_XEN
        u32 dummy;
 +#endif
  
  #ifdef CONFIG_SMP
        unsigned long long value;
                        u64 val;
  
                        clear_cpu_cap(c, X86_FEATURE_LAHF_LM);
 +#ifndef CONFIG_XEN
                        if (!rdmsrl_amd_safe(0xc001100d, &val)) {
                                val &= ~(1ULL << 32);
                                wrmsrl_amd_safe(0xc001100d, val);
                        }
 +#else
 +                      pr_warning("Long-mode LAHF feature wrongly enabled -"
 +                                 "hypervisor update needed\n");
 +                      (void)&val;
 +#endif
                }
  
        }
        if (c->x86 >= 0x10)
                set_cpu_cap(c, X86_FEATURE_REP_GOOD);
  
 +#ifndef CONFIG_XEN
        /* get apicid instead of initial apic id from cpuid */
        c->apicid = hard_smp_processor_id();
 +#endif
  #else
  
        /*
                }
        }
  
+       /* re-enable TopologyExtensions if switched off by BIOS */
+       if ((c->x86 == 0x15) &&
+           (c->x86_model >= 0x10) && (c->x86_model <= 0x1f) &&
+           !cpu_has(c, X86_FEATURE_TOPOEXT)) {
+               u64 val;
+               if (!rdmsrl_amd_safe(0xc0011005, &val)) {
+                       val |= 1ULL << 54;
+                       wrmsrl_amd_safe(0xc0011005, val);
+                       rdmsrl(0xc0011005, val);
+                       if (val & (1ULL << 54)) {
+                               set_cpu_cap(c, X86_FEATURE_TOPOEXT);
+                               printk(KERN_INFO FW_INFO "CPU: Re-enabling "
+                                 "disabled Topology Extensions Support\n");
+                       }
+               }
+       }
        cpu_detect_cache_sizes(c);
  
        /* Multi core CPU? */
                fam10h_check_enable_mmcfg();
        }
  
 +#ifndef CONFIG_XEN
        if (c == &boot_cpu_data && c->x86 >= 0xf) {
                unsigned long long tseg;
  
                }
        }
  #endif
 +#endif
  
        /*
         * Family 0x12 and above processors have APIC timer
        if (c->x86 > 0x11)
                set_cpu_cap(c, X86_FEATURE_ARAT);
  
 +#ifndef CONFIG_XEN
        /*
         * Disable GART TLB Walk Errors on Fam10h. We do this here
         * because this is always needed when GART is enabled, even in a
        }
  
        rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy);
 +#endif
  }
  
  #ifdef CONFIG_X86_32
diff --combined drivers/acpi/scan.c
@@@ -175,16 -175,6 +175,16 @@@ acpi_device_hid_show(struct device *dev
  }
  static DEVICE_ATTR(hid, 0444, acpi_device_hid_show, NULL);
  
 +#ifdef CONFIG_PCI_GUESTDEV
 +static ssize_t
 +acpi_device_uid_show(struct device *dev, struct device_attribute *attr, char *buf) {
 +      struct acpi_device *acpi_dev = to_acpi_device(dev);
 +
 +      return sprintf(buf, "%s\n", acpi_dev->pnp.unique_id);
 +}
 +static DEVICE_ATTR(uid, 0444, acpi_device_uid_show, NULL);
 +#endif
 +
  static ssize_t
  acpi_device_path_show(struct device *dev, struct device_attribute *attr, char *buf) {
        struct acpi_device *acpi_dev = to_acpi_device(dev);
@@@ -227,13 -217,6 +227,13 @@@ static int acpi_device_setup_files(stru
                        goto end;
        }
  
 +#ifdef CONFIG_PCI_GUESTDEV
 +      if(dev->pnp.unique_id) {
 +              result = device_create_file(&dev->dev, &dev_attr_uid);
 +              if(result)
 +                      goto end;
 +      }
 +#endif
          /*
           * If device has _EJ0, 'eject' file is created that is used to trigger
           * hot-removal function from userland.
@@@ -297,9 -280,6 +297,9 @@@ static void acpi_free_ids(struct acpi_d
                kfree(id->id);
                kfree(id);
        }
 +#ifdef CONFIG_PCI_GUESTDEV
 +      kfree(device->pnp.unique_id);
 +#endif
  }
  
  static void acpi_device_release(struct device *dev)
@@@ -889,7 -869,7 +889,7 @@@ static int acpi_bus_get_power_flags(str
        /*
         * Enumerate supported power management states
         */
-       for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3; i++) {
+       for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3_HOT; i++) {
                struct acpi_device_power_state *ps = &device->power.states[i];
                char object_name[5] = { '_', 'P', 'R', '0' + i, '\0' };
  
                                acpi_bus_add_power_resource(ps->resources.handles[j]);
                }
  
-               /* The exist of _PR3 indicates D3Cold support */
-               if (i == ACPI_STATE_D3) {
-                       status = acpi_get_handle(device->handle, object_name, &handle);
-                       if (ACPI_SUCCESS(status))
-                               device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1;
-               }
                /* Evaluate "_PSx" to see if we can do explicit sets */
                object_name[2] = 'S';
                status = acpi_get_handle(device->handle, object_name, &handle);
                if (ACPI_SUCCESS(status))
                        ps->flags.explicit_set = 1;
  
-               /* State is valid if we have some power control */
-               if (ps->resources.count || ps->flags.explicit_set)
+               /*
+                * State is valid if there are means to put the device into it.
+                * D3hot is only valid if _PR3 present.
+                */
+               if (ps->resources.count ||
+                   (ps->flags.explicit_set && i < ACPI_STATE_D3_HOT))
                        ps->flags.valid = 1;
  
                ps->power = -1; /* Unknown - driver assigned */
@@@ -1157,11 -1134,6 +1154,11 @@@ static void acpi_device_set_id(struct a
                        for (i = 0; i < cid_list->count; i++)
                                acpi_add_id(device, cid_list->ids[i].string);
                }
 +#ifdef CONFIG_PCI_GUESTDEV
 +              if (info->valid & ACPI_VALID_UID)
 +                      device->pnp.unique_id = kstrdup(info->unique_id.string,
 +                                                      GFP_KERNEL);
 +#endif
                if (info->valid & ACPI_VALID_ADR) {
                        device->pnp.bus_address = info->address;
                        device->flags.bus_address = 1;
@@@ -7072,9 -7072,6 +7072,6 @@@ static void intel_decrease_pllclock(str
        struct drm_device *dev = crtc->dev;
        drm_i915_private_t *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       int pipe = intel_crtc->pipe;
-       int dpll_reg = DPLL(pipe);
-       int dpll = I915_READ(dpll_reg);
  
        if (HAS_PCH_SPLIT(dev))
                return;
         * the manual case.
         */
        if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) {
+               int pipe = intel_crtc->pipe;
+               int dpll_reg = DPLL(pipe);
+               u32 dpll;
                DRM_DEBUG_DRIVER("downclocking LVDS\n");
  
                assert_panel_unlocked(dev_priv, pipe);
  
+               dpll = I915_READ(dpll_reg);
                dpll |= DISPLAY_RATE_SELECT_FPA1;
                I915_WRITE(dpll_reg, dpll);
                intel_wait_for_vblank(dev, pipe);
                if (!(dpll & DISPLAY_RATE_SELECT_FPA1))
                        DRM_DEBUG_DRIVER("failed to downclock LVDS!\n");
        }
  }
  
  /**
@@@ -8439,11 -8440,7 +8440,11 @@@ void gen6_update_ring_freq(struct drm_i
         * over
         */
        if (!max_ia_freq)
 +#ifndef CONFIG_XEN
                max_ia_freq = tsc_khz;
 +#else
 +              max_ia_freq = cpu_khz;
 +#endif
  
        /* Convert from kHz to MHz */
        max_ia_freq /= 1000;
@@@ -42,7 -42,6 +42,7 @@@ static struct nouveau_dsm_priv 
  #define NOUVEAU_DSM_HAS_MUX 0x1
  #define NOUVEAU_DSM_HAS_OPT 0x2
  
 +#ifdef CONFIG_VGA_SWITCHEROO
  static const char nouveau_dsm_muid[] = {
        0xA0, 0xA0, 0x95, 0x9D, 0x60, 0x00, 0x48, 0x4D,
        0xB3, 0x4D, 0x7E, 0x5F, 0xEA, 0x12, 0x9F, 0xD4,
@@@ -271,7 -270,7 +271,7 @@@ static bool nouveau_dsm_detect(void
        struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name};
        struct pci_dev *pdev = NULL;
        int has_dsm = 0;
-       int has_optimus;
+       int has_optimus = 0;
        int vga_count = 0;
        bool guid_valid;
        int retval;
@@@ -341,10 -340,6 +341,10 @@@ void nouveau_unregister_dsm_handler(voi
  {
        vga_switcheroo_unregister_handler();
  }
 +#else
 +void nouveau_register_dsm_handler(void) {}
 +void nouveau_unregister_dsm_handler(void) {}
 +#endif
  
  /* retrieve the ROM in 4k blocks */
  static int nouveau_rom_call(acpi_handle rom_handle, uint8_t *bios,
@@@ -241,8 -241,8 +241,8 @@@ int radeon_wb_init(struct radeon_devic
                                rdev->wb.use_event = true;
                }
        }
-       /* always use writeback/events on NI */
-       if (ASIC_IS_DCE5(rdev)) {
+       /* always use writeback/events on NI, APUs */
+       if (rdev->family >= CHIP_PALM) {
                rdev->wb.enabled = true;
                rdev->wb.use_event = true;
        }
@@@ -448,18 -448,6 +448,18 @@@ int radeon_dummy_page_init(struct radeo
        rdev->dummy_page.page = alloc_page(GFP_DMA32 | GFP_KERNEL | __GFP_ZERO);
        if (rdev->dummy_page.page == NULL)
                return -ENOMEM;
 +#ifdef CONFIG_XEN
 +      {
 +              int ret = xen_limit_pages_to_max_mfn(rdev->dummy_page.page,
 +                                                   0, 32);
 +
 +              if (!ret)
 +                      clear_page(page_address(rdev->dummy_page.page));
 +              else
 +                      dev_warn(rdev->dev,
 +                               "Error restricting dummy page: %d\n", ret);
 +      }
 +#endif
        rdev->dummy_page.addr = pci_map_page(rdev->pdev, rdev->dummy_page.page,
                                        0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
        if (pci_dma_mapping_error(rdev->pdev, rdev->dummy_page.addr)) {
@@@ -29,7 -29,6 +29,7 @@@
  #include <linux/input/mt.h>
  #include <linux/serio.h>
  #include <linux/libps2.h>
 +#include <linux/leds.h>
  #include <linux/slab.h>
  #include "psmouse.h"
  #include "synaptics.h"
@@@ -275,7 -274,8 +275,8 @@@ static int synaptics_set_advanced_gestu
        static unsigned char param = 0xc8;
        struct synaptics_data *priv = psmouse->private;
  
-       if (!SYN_CAP_ADV_GESTURE(priv->ext_cap_0c))
+       if (!(SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) ||
+             SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)))
                return 0;
  
        if (psmouse_sliced_command(psmouse, SYN_QUE_MODEL))
@@@ -431,110 -431,6 +432,110 @@@ static void synaptics_pt_create(struct 
        serio_register_port(serio);
  }
  
 +#ifdef CONFIG_MOUSE_PS2_SYNAPTICS_LED
 +/*
 + * LED handling:
 + * Some Synaptics devices have an embeded LED at the top-left corner.
 + */
 +
 +struct synaptics_led {
 +      struct psmouse *psmouse;
 +      struct work_struct work;
 +      struct led_classdev cdev;
 +};
 +
 +static void synaptics_set_led(struct psmouse *psmouse, int on)
 +{
 +      int i;
 +      unsigned char cmd = on ? 0x88 : 0x10;
 +
 +      ps2_begin_command(&psmouse->ps2dev);
 +      if (__ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11))
 +              goto out;
 +      for (i = 6; i >= 0; i -= 2) {
 +              unsigned char d = (cmd >> i) & 3;
 +              if (__ps2_command(&psmouse->ps2dev, &d, PSMOUSE_CMD_SETRES))
 +                      goto out;
 +      }
 +      cmd = 0x0a;
 +      __ps2_command(&psmouse->ps2dev, &cmd, PSMOUSE_CMD_SETRATE);
 + out:
 +      ps2_end_command(&psmouse->ps2dev);
 +}
 +
 +static void synaptics_led_work(struct work_struct *work)
 +{
 +      struct synaptics_led *led;
 +
 +      led = container_of(work, struct synaptics_led, work);
 +      synaptics_set_led(led->psmouse, led->cdev.brightness);
 +}
 +
 +static void synaptics_led_cdev_brightness_set(struct led_classdev *cdev,
 +                                            enum led_brightness value)
 +{
 +      struct synaptics_led *led;
 +
 +      led = container_of(cdev, struct synaptics_led, cdev);
 +      schedule_work(&led->work);
 +}
 +
 +static void synaptics_sync_led(struct psmouse *psmouse)
 +{
 +      struct synaptics_data *priv = psmouse->private;
 +
 +      if (priv->led)
 +              synaptics_set_led(psmouse, priv->led->cdev.brightness);
 +}
 +
 +static int synaptics_init_led(struct psmouse *psmouse)
 +{
 +      struct synaptics_data *priv = psmouse->private;
 +      struct synaptics_led *led;
 +      int err;
 +
 +      /* FIXME: LED is supposedly detectable in cap0c[1] 0x20, but it seems
 +       * not working on real machines.
 +       * So we check the product id to be sure.
 +       */
 +      if (!priv->ext_cap_0c || SYN_CAP_PRODUCT_ID(priv->ext_cap) != 0xe4)
 +              return 0;
 +
 +      printk(KERN_INFO "synaptics: support LED control\n");
 +      led = kzalloc(sizeof(struct synaptics_led), GFP_KERNEL);
 +      if (!led)
 +              return -ENOMEM;
 +      led->psmouse = psmouse;
 +      INIT_WORK(&led->work, synaptics_led_work);
 +      led->cdev.name = "psmouse::synaptics";
 +      led->cdev.brightness_set = synaptics_led_cdev_brightness_set;
 +      led->cdev.flags = LED_CORE_SUSPENDRESUME;
 +      err = led_classdev_register(NULL, &led->cdev);
 +      if (err < 0) {
 +              kfree(led);
 +              return err;
 +      }
 +      priv->led = led;
 +      return 0;
 +}
 +
 +static void synaptics_free_led(struct psmouse *psmouse)
 +{
 +      struct synaptics_data *priv = psmouse->private;
 +
 +      if (!priv->led)
 +              return;
 +      cancel_work_sync(&priv->led->work);
 +      synaptics_set_led(psmouse, 0);
 +      led_classdev_unregister(&priv->led->cdev);
 +      kfree(priv->led);
 +}
 +#else
 +#define synaptics_init_led(ps)        0
 +#define synaptics_free_led(ps)        do {} while (0)
 +#define synaptics_sync_led(ps)        do {} while (0)
 +#endif
 +
  /*****************************************************************************
   *    Functions to interpret the absolute mode packets
   ****************************************************************************/
@@@ -1380,7 -1276,6 +1381,7 @@@ static void synaptics_disconnect(struc
                device_remove_file(&psmouse->ps2dev.serio->dev,
                                   &psmouse_attr_disable_gesture.dattr);
  
 +      synaptics_free_led(psmouse);
        synaptics_reset(psmouse);
        kfree(priv);
        psmouse->private = NULL;
@@@ -1437,8 -1332,6 +1438,8 @@@ static int synaptics_reconnect(struct p
                return -1;
        }
  
 +      synaptics_sync_led(psmouse);
 +
        return 0;
  }
  
@@@ -1548,9 -1441,6 +1549,9 @@@ static int __synaptics_init(struct psmo
                     priv->model_id,
                     priv->capabilities, priv->ext_cap, priv->ext_cap_0c);
  
 +      if (synaptics_init_led(psmouse) < 0)
 +              goto init_fail;
 +
        set_input_params(psmouse->dev, priv);
  
        /*
@@@ -1150,6 -1150,48 +1150,48 @@@ release_tpsram
  }
  
  /**
+  * t3_synchronize_rx - wait for current Rx processing on a port to complete
+  * @adap: the adapter
+  * @p: the port
+  *
+  * Ensures that current Rx processing on any of the queues associated with
+  * the given port completes before returning.  We do this by acquiring and
+  * releasing the locks of the response queues associated with the port.
+  */
+ static void t3_synchronize_rx(struct adapter *adap, const struct port_info *p)
+ {
+       int i;
+       for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) {
+               struct sge_rspq *q = &adap->sge.qs[i].rspq;
+               spin_lock_irq(&q->lock);
+               spin_unlock_irq(&q->lock);
+       }
+ }
+ static void cxgb_vlan_mode(struct net_device *dev, netdev_features_t features)
+ {
+       struct port_info *pi = netdev_priv(dev);
+       struct adapter *adapter = pi->adapter;
+       if (adapter->params.rev > 0) {
+               t3_set_vlan_accel(adapter, 1 << pi->port_id,
+                                 features & NETIF_F_HW_VLAN_RX);
+       } else {
+               /* single control for all ports */
+               unsigned int i, have_vlans = features & NETIF_F_HW_VLAN_RX;
+               for_each_port(adapter, i)
+                       have_vlans |=
+                               adapter->port[i]->features & NETIF_F_HW_VLAN_RX;
+               t3_set_vlan_accel(adapter, 1, have_vlans);
+       }
+       t3_synchronize_rx(adapter, pi);
+ }
+ /**
   *    cxgb_up - enable the adapter
   *    @adapter: adapter being enabled
   *
   */
  static int cxgb_up(struct adapter *adap)
  {
-       int err;
+       int i, err;
  
        if (!(adap->flags & FULL_INIT_DONE)) {
                err = t3_check_fw_version(adap);
                if (err)
                        goto out;
  
+               for_each_port(adap, i)
+                       cxgb_vlan_mode(adap->port[i], adap->port[i]->features);
                setup_rss(adap);
                if (!(adap->flags & NAPI_INIT))
                        init_napi(adap);
@@@ -2508,48 -2553,6 +2553,6 @@@ static int cxgb_set_mac_addr(struct net
        return 0;
  }
  
- /**
-  * t3_synchronize_rx - wait for current Rx processing on a port to complete
-  * @adap: the adapter
-  * @p: the port
-  *
-  * Ensures that current Rx processing on any of the queues associated with
-  * the given port completes before returning.  We do this by acquiring and
-  * releasing the locks of the response queues associated with the port.
-  */
- static void t3_synchronize_rx(struct adapter *adap, const struct port_info *p)
- {
-       int i;
-       for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) {
-               struct sge_rspq *q = &adap->sge.qs[i].rspq;
-               spin_lock_irq(&q->lock);
-               spin_unlock_irq(&q->lock);
-       }
- }
- static void cxgb_vlan_mode(struct net_device *dev, netdev_features_t features)
- {
-       struct port_info *pi = netdev_priv(dev);
-       struct adapter *adapter = pi->adapter;
-       if (adapter->params.rev > 0) {
-               t3_set_vlan_accel(adapter, 1 << pi->port_id,
-                                 features & NETIF_F_HW_VLAN_RX);
-       } else {
-               /* single control for all ports */
-               unsigned int i, have_vlans = features & NETIF_F_HW_VLAN_RX;
-               for_each_port(adapter, i)
-                       have_vlans |=
-                               adapter->port[i]->features & NETIF_F_HW_VLAN_RX;
-               t3_set_vlan_accel(adapter, 1, have_vlans);
-       }
-       t3_synchronize_rx(adapter, pi);
- }
  static netdev_features_t cxgb_fix_features(struct net_device *dev,
        netdev_features_t features)
  {
@@@ -3310,17 -3313,7 +3313,17 @@@ static int __devinit init_one(struct pc
         * register at least one net device.
         */
        for_each_port(adapter, i) {
 +#ifndef CONFIG_XEN
                err = register_netdev(adapter->port[i]);
 +#else
 +              rtnl_lock();
 +              err = register_netdevice(adapter->port[i]);
 +              if (!err) {
 +                      adapter->port[i]->wanted_features &= ~NETIF_F_GRO;
 +                      netdev_update_features(adapter->port[i]);
 +              }
 +              rtnl_unlock();
 +#endif
                if (err)
                        dev_warn(&pdev->dev,
                                 "cannot register net device %s, skipping\n",
        err = sysfs_create_group(&adapter->port[0]->dev.kobj,
                                 &cxgb3_attr_group);
  
-       for_each_port(adapter, i)
-               cxgb_vlan_mode(adapter->port[i], adapter->port[i]->features);
        print_port_info(adapter, ai);
        return 0;
  
@@@ -103,19 -103,6 +103,19 @@@ static int __devinit ehea_probe_adapter
  
  static int __devexit ehea_remove(struct platform_device *dev);
  
 +static struct of_device_id ehea_module_device_table[] = {
 +      {
 +              .name = "lhea",
 +              .compatible = "IBM,lhea",
 +      },
 +      {
 +              .type = "network",
 +              .compatible = "IBM,lhea-ethernet",
 +      },
 +      {},
 +};
 +MODULE_DEVICE_TABLE(of, ehea_module_device_table);
 +
  static struct of_device_id ehea_device_table[] = {
        {
                .name = "lhea",
        },
        {},
  };
 -MODULE_DEVICE_TABLE(of, ehea_device_table);
  
  static struct of_platform_driver ehea_driver = {
        .driver = {
@@@ -302,16 -290,18 +302,18 @@@ static void ehea_update_bcmc_registrati
  
                                arr[i].adh = adapter->handle;
                                arr[i].port_id = port->logical_port_id;
-                               arr[i].reg_type = EHEA_BCMC_SCOPE_ALL |
-                                                 EHEA_BCMC_MULTICAST |
+                               arr[i].reg_type = EHEA_BCMC_MULTICAST |
                                                  EHEA_BCMC_UNTAGGED;
+                               if (mc_entry->macaddr == 0)
+                                       arr[i].reg_type |= EHEA_BCMC_SCOPE_ALL;
                                arr[i++].macaddr = mc_entry->macaddr;
  
                                arr[i].adh = adapter->handle;
                                arr[i].port_id = port->logical_port_id;
-                               arr[i].reg_type = EHEA_BCMC_SCOPE_ALL |
-                                                 EHEA_BCMC_MULTICAST |
+                               arr[i].reg_type = EHEA_BCMC_MULTICAST |
                                                  EHEA_BCMC_VLANID_ALL;
+                               if (mc_entry->macaddr == 0)
+                                       arr[i].reg_type |= EHEA_BCMC_SCOPE_ALL;
                                arr[i++].macaddr = mc_entry->macaddr;
                                num_registrations -= 2;
                        }
@@@ -1850,8 -1840,9 +1852,9 @@@ static u64 ehea_multicast_reg_helper(st
        u64 hret;
        u8 reg_type;
  
-       reg_type = EHEA_BCMC_SCOPE_ALL | EHEA_BCMC_MULTICAST
-                | EHEA_BCMC_UNTAGGED;
+       reg_type = EHEA_BCMC_MULTICAST | EHEA_BCMC_UNTAGGED;
+       if (mc_mac_addr == 0)
+               reg_type |= EHEA_BCMC_SCOPE_ALL;
  
        hret = ehea_h_reg_dereg_bcmc(port->adapter->handle,
                                     port->logical_port_id,
        if (hret)
                goto out;
  
-       reg_type = EHEA_BCMC_SCOPE_ALL | EHEA_BCMC_MULTICAST
-                | EHEA_BCMC_VLANID_ALL;
+       reg_type = EHEA_BCMC_MULTICAST | EHEA_BCMC_VLANID_ALL;
+       if (mc_mac_addr == 0)
+               reg_type |= EHEA_BCMC_SCOPE_ALL;
  
        hret = ehea_h_reg_dereg_bcmc(port->adapter->handle,
                                     port->logical_port_id,
@@@ -1910,7 -1902,7 +1914,7 @@@ static void ehea_allmulti(struct net_de
                                netdev_err(dev,
                                           "failed enabling IFF_ALLMULTI\n");
                }
-       } else
+       } else {
                if (!enable) {
                        /* Disable ALLMULTI */
                        hret = ehea_multicast_reg_helper(port, 0, H_DEREG_BCMC);
                                netdev_err(dev,
                                           "failed disabling IFF_ALLMULTI\n");
                }
+       }
  }
  
  static void ehea_add_multicast_entry(struct ehea_port *port, u8 *mc_mac_addr)
@@@ -1953,11 -1946,7 +1958,7 @@@ static void ehea_set_multicast_list(str
        struct netdev_hw_addr *ha;
        int ret;
  
-       if (port->promisc) {
-               ehea_promiscuous(dev, 1);
-               return;
-       }
-       ehea_promiscuous(dev, 0);
+       ehea_promiscuous(dev, !!(dev->flags & IFF_PROMISC));
  
        if (dev->flags & IFF_ALLMULTI) {
                ehea_allmulti(dev, 1);
@@@ -2475,6 -2464,7 +2476,7 @@@ static int ehea_down(struct net_device 
                return 0;
  
        ehea_drop_multicast_list(dev);
+       ehea_allmulti(dev, 0);
        ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
  
        ehea_free_interrupts(dev);
@@@ -3273,6 -3263,7 +3275,7 @@@ static int __devinit ehea_probe_adapter
        struct ehea_adapter *adapter;
        const u64 *adapter_handle;
        int ret;
+       int i;
  
        if (!dev || !dev->dev.of_node) {
                pr_err("Invalid ibmebus device probed\n");
        tasklet_init(&adapter->neq_tasklet, ehea_neq_tasklet,
                     (unsigned long)adapter);
  
-       ret = ibmebus_request_irq(adapter->neq->attr.ist1,
-                                 ehea_interrupt_neq, IRQF_DISABLED,
-                                 "ehea_neq", adapter);
-       if (ret) {
-               dev_err(&dev->dev, "requesting NEQ IRQ failed\n");
-               goto out_kill_eq;
-       }
        ret = ehea_create_device_sysfs(dev);
        if (ret)
-               goto out_free_irq;
+               goto out_kill_eq;
  
        ret = ehea_setup_ports(adapter);
        if (ret) {
                goto out_rem_dev_sysfs;
        }
  
+       ret = ibmebus_request_irq(adapter->neq->attr.ist1,
+                                 ehea_interrupt_neq, IRQF_DISABLED,
+                                 "ehea_neq", adapter);
+       if (ret) {
+               dev_err(&dev->dev, "requesting NEQ IRQ failed\n");
+               goto out_shutdown_ports;
+       }
        ret = 0;
        goto out;
  
+ out_shutdown_ports:
+       for (i = 0; i < EHEA_MAX_PORTS; i++)
+               if (adapter->port[i]) {
+                       ehea_shutdown_single_port(adapter->port[i]);
+                       adapter->port[i] = NULL;
+               }
  out_rem_dev_sysfs:
        ehea_remove_device_sysfs(dev);
  
- out_free_irq:
-       ibmebus_free_irq(adapter->neq->attr.ist1, adapter);
  out_kill_eq:
        ehea_destroy_eq(adapter->neq);
  
@@@ -2077,13 -2077,10 +2077,13 @@@ static void b43_release_firmware(struc
  static void b43_print_fw_helptext(struct b43_wl *wl, bool error)
  {
        const char text[] =
 -              "You must go to " \
 -              "http://wireless.kernel.org/en/users/Drivers/b43#devicefirmware " \
 -              "and download the correct firmware for this driver version. " \
 -              "Please carefully read all instructions on this website.\n";
 +              "Please open a terminal and enter the command " \
 +              "\"sudo /usr/sbin/install_bcm43xx_firmware\" to download " \
 +              "the correct firmware for this driver version. " \
 +              "For an off-line installation, go to " \
 +              "http://en.opensuse.org/HCL/Network_Adapters_(Wireless)/" \
 +              "Broadcom_BCM43xx and follow the instructions in the " \
 +              "\"Installing firmware from RPM packages\" section.\n";
  
        if (error)
                b43err(wl, text);
@@@ -4830,8 -4827,14 +4830,14 @@@ static int b43_op_start(struct ieee8021
   out_mutex_unlock:
        mutex_unlock(&wl->mutex);
  
-       /* reload configuration */
-       b43_op_config(hw, ~0);
+       /*
+        * Configuration may have been overwritten during initialization.
+        * Reload the configuration, but only if initialization was
+        * successful. Reloading the configuration after a failed init
+        * may hang the system.
+        */
+       if (!err)
+               b43_op_config(hw, ~0);
  
        return err;
  }
diff --combined drivers/scsi/scsi_lib.c
        spin_lock_irq(q->queue_lock);
  }
  
 +struct scsi_device *scsi_device_from_queue(struct request_queue *q)
 +{
 +      struct scsi_device *sdev = NULL;
 +
 +      if (q->request_fn == scsi_request_fn)
 +              sdev = q->queuedata;
 +
 +      return sdev;
 +}
 +EXPORT_SYMBOL_GPL(scsi_device_from_queue);
 +
  u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost)
  {
        struct device *host_dev;
@@@ -1649,7 -1638,7 +1649,7 @@@ struct request_queue *__scsi_alloc_queu
                                         request_fn_proc *request_fn)
  {
        struct request_queue *q;
-       struct device *dev = shost->shost_gendev.parent;
+       struct device *dev = shost->dma_dev;
  
        q = blk_init_queue(request_fn, NULL);
        if (!q)
@@@ -45,8 -45,6 +45,8 @@@
  
  #include <asm/irq_regs.h>
  
 +#include <linux/bootsplash.h>
 +
  extern void ctrl_alt_del(void);
  
  /*
@@@ -1087,15 -1085,21 +1087,21 @@@ void vt_set_led_state(int console, int 
   *
   *    Handle console start. This is a wrapper for the VT layer
   *    so that we can keep kbd knowledge internal
+  *
+  *    FIXME: We eventually need to hold the kbd lock here to protect
+  *    the LED updating. We can't do it yet because fn_hold calls stop_tty
+  *    and start_tty under the kbd_event_lock, while normal tty paths
+  *    don't hold the lock. We probably need to split out an LED lock
+  *    but not during an -rc release!
   */
  void vt_kbd_con_start(int console)
  {
        struct kbd_struct * kbd = kbd_table + console;
-       unsigned long flags;
-       spin_lock_irqsave(&kbd_event_lock, flags);
+ /*    unsigned long flags; */
+ /*    spin_lock_irqsave(&kbd_event_lock, flags); */
        clr_vc_kbd_led(kbd, VC_SCROLLOCK);
        set_leds();
-       spin_unlock_irqrestore(&kbd_event_lock, flags);
+ /*    spin_unlock_irqrestore(&kbd_event_lock, flags); */
  }
  
  /**
   *
   *    Handle console stop. This is a wrapper for the VT layer
   *    so that we can keep kbd knowledge internal
+  *
+  *    FIXME: We eventually need to hold the kbd lock here to protect
+  *    the LED updating. We can't do it yet because fn_hold calls stop_tty
+  *    and start_tty under the kbd_event_lock, while normal tty paths
+  *    don't hold the lock. We probably need to split out an LED lock
+  *    but not during an -rc release!
   */
  void vt_kbd_con_stop(int console)
  {
        struct kbd_struct * kbd = kbd_table + console;
-       unsigned long flags;
-       spin_lock_irqsave(&kbd_event_lock, flags);
+ /*    unsigned long flags; */
+ /*    spin_lock_irqsave(&kbd_event_lock, flags); */
        set_vc_kbd_led(kbd, VC_SCROLLOCK);
        set_leds();
-       spin_unlock_irqrestore(&kbd_event_lock, flags);
+ /*    spin_unlock_irqrestore(&kbd_event_lock, flags); */
  }
  
  /*
   * This is the tasklet that updates LED state on all keyboards
   * attached to the box. The reason we use tasklet is that we
   * need to handle the scenario when keyboard handler is not
-  * registered yet but we already getting updates form VT to
+  * registered yet but we already getting updates from the VT to
   * update led state.
   */
  static void kbd_bh(unsigned long dummy)
@@@ -1282,13 -1292,6 +1294,13 @@@ static void kbd_keycode(unsigned int ke
                                pr_warning("can't emulate rawmode for keycode %d\n",
                                           keycode);
  
 +      /* This code has to be redone for some non-x86 platforms */
 +      if (down == 1 && (keycode == 0x3c || keycode == 0x01)) {
 +              /* F2 and ESC on PC keyboard */
 +              if (splash_verbose())
 +                      return;
 +      }
 +
  #ifdef CONFIG_SPARC
        if (keycode == KEY_A && sparc_l1_a_state) {
                sparc_l1_a_state = false;
diff --combined fs/namei.c
@@@ -1429,7 -1429,7 +1429,7 @@@ unsigned int full_name_hash(const unsig
        unsigned long hash = 0;
  
        for (;;) {
-               a = *(unsigned long *)name;
+               a = load_unaligned_zeropad(name);
                if (len < sizeof(unsigned long))
                        break;
                hash += a;
@@@ -1459,7 -1459,7 +1459,7 @@@ static inline unsigned long hash_name(c
        do {
                hash = (hash + a) * 9;
                len += sizeof(unsigned long);
-               a = *(unsigned long *)(name+len);
+               a = load_unaligned_zeropad(name+len);
                /* Do we have any NUL or '/' bytes in this word? */
                mask = has_zero(a) | has_zero(a ^ REPEAT_BYTE('/'));
        } while (!mask);
@@@ -1947,26 -1947,6 +1947,26 @@@ other_userns
  }
  
  /*
 + * Do the directory specific tests of inode_permission() and call the
 + * may_delete inode operation.  The may_delete inode operation must do the
 + * sticky check when needed.
 + */
 +static int may_delete_iop(struct inode *dir, struct inode *inode, int replace)
 +{
 +      int error;
 +
 +      if (IS_RDONLY(dir))
 +              return -EROFS;
 +      if (IS_IMMUTABLE(dir))
 +              return -EACCES;
 +      error = dir->i_op->may_delete(dir, inode, replace);
 +      if (!error)
 +              error = security_inode_permission(dir, MAY_WRITE | MAY_EXEC);
 +
 +      return error;
 +}
 +
 +/*
   *    Check whether we can remove a link victim from directory dir, check
   *  whether the type of victim is right.
   *  1. We can't do it if dir is read-only (done in permission())
   * 10. We don't allow removal of NFS sillyrenamed files; it's handled by
   *     nfs_async_unlink().
   */
 -static int may_delete(struct inode *dir,struct dentry *victim,int isdir)
 +static int may_delete(struct inode *dir, struct dentry *victim,
 +                    int isdir, int replace)
  {
        int error;
  
  
        BUG_ON(victim->d_parent->d_inode != dir);
        audit_inode_child(victim, dir);
 -
 -      error = inode_permission(dir, MAY_WRITE | MAY_EXEC);
 +      if (dir->i_op->may_delete)
 +              error = may_delete_iop(dir, victim->d_inode, replace);
 +      else {
 +              error = inode_permission(dir, MAY_WRITE | MAY_EXEC);
 +              if (!error && check_sticky(dir, victim->d_inode))
 +                      error = -EPERM;
 +      }
        if (error)
                return error;
        if (IS_APPEND(dir))
                return -EPERM;
 -      if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)||
 -          IS_IMMUTABLE(victim->d_inode) || IS_SWAPFILE(victim->d_inode))
 +      if (IS_APPEND(victim->d_inode) || IS_IMMUTABLE(victim->d_inode) ||
 +              IS_SWAPFILE(victim->d_inode))
                return -EPERM;
        if (isdir) {
                if (!S_ISDIR(victim->d_inode->i_mode))
        return 0;
  }
  
 +/*
 + * Do the directory specific tests of inode_permission() and call the
 + * may_create inode operation.
 + */
 +static int may_create_iop(struct inode *dir, int isdir)
 +{
 +      int error;
 +
 +      if (IS_RDONLY(dir))
 +              return -EROFS;
 +      if (IS_IMMUTABLE(dir))
 +              return -EACCES;
 +      error = dir->i_op->may_create(dir, isdir);
 +      if (!error)
 +              error = security_inode_permission(dir, MAY_WRITE | MAY_EXEC);
 +
 +      return error;
 +}
 +
  /*    Check whether we can create an object with dentry child in directory
   *  dir.
   *  1. We can't do it if child already exists (open has special treatment for
   *  3. We should have write and exec permissions on dir
   *  4. We can't do it if dir is immutable (done in permission())
   */
 -static inline int may_create(struct inode *dir, struct dentry *child)
 +static inline int may_create(struct inode *dir, struct dentry *child, int isdir)
  {
        if (child->d_inode)
                return -EEXIST;
        if (IS_DEADDIR(dir))
                return -ENOENT;
 -      return inode_permission(dir, MAY_WRITE | MAY_EXEC);
 +      if (dir->i_op->may_create)
 +              return may_create_iop(dir, isdir);
 +      else
 +              return inode_permission(dir, MAY_WRITE | MAY_EXEC);
  }
  
  /*
@@@ -2107,7 -2059,7 +2107,7 @@@ void unlock_rename(struct dentry *p1, s
  int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode,
                struct nameidata *nd)
  {
 -      int error = may_create(dir, dentry);
 +      int error = may_create(dir, dentry, 0);
  
        if (error)
                return error;
@@@ -2306,7 -2258,7 +2306,7 @@@ static struct file *do_last(struct name
        /* Negative dentry, just create the file */
        if (!dentry->d_inode) {
                umode_t mode = op->mode;
 -              if (!IS_POSIXACL(dir->d_inode))
 +              if (!IS_ACL(dir->d_inode))
                        mode &= ~current_umask();
                /*
                 * This write is needed to ensure that a
@@@ -2574,7 -2526,7 +2574,7 @@@ EXPORT_SYMBOL(user_path_create)
  
  int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
  {
 -      int error = may_create(dir, dentry);
 +      int error = may_create(dir, dentry, 0);
  
        if (error)
                return error;
@@@ -2631,7 -2583,7 +2631,7 @@@ SYSCALL_DEFINE4(mknodat, int, dfd, cons
        if (IS_ERR(dentry))
                return PTR_ERR(dentry);
  
 -      if (!IS_POSIXACL(path.dentry->d_inode))
 +      if (!IS_ACL(path.dentry->d_inode))
                mode &= ~current_umask();
        error = may_mknod(mode);
        if (error)
@@@ -2671,7 -2623,7 +2671,7 @@@ SYSCALL_DEFINE3(mknod, const char __use
  
  int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
  {
 -      int error = may_create(dir, dentry);
 +      int error = may_create(dir, dentry, 1);
        unsigned max_links = dir->i_sb->s_max_links;
  
        if (error)
@@@ -2704,7 -2656,7 +2704,7 @@@ SYSCALL_DEFINE3(mkdirat, int, dfd, cons
        if (IS_ERR(dentry))
                return PTR_ERR(dentry);
  
 -      if (!IS_POSIXACL(path.dentry->d_inode))
 +      if (!IS_ACL(path.dentry->d_inode))
                mode &= ~current_umask();
        error = mnt_want_write(path.mnt);
        if (error)
@@@ -2753,7 -2705,7 +2753,7 @@@ void dentry_unhash(struct dentry *dentr
  
  int vfs_rmdir(struct inode *dir, struct dentry *dentry)
  {
 -      int error = may_delete(dir, dentry, 1);
 +      int error = may_delete(dir, dentry, 1, 0);
  
        if (error)
                return error;
@@@ -2848,7 -2800,7 +2848,7 @@@ SYSCALL_DEFINE1(rmdir, const char __use
  
  int vfs_unlink(struct inode *dir, struct dentry *dentry)
  {
 -      int error = may_delete(dir, dentry, 0);
 +      int error = may_delete(dir, dentry, 0, 0);
  
        if (error)
                return error;
@@@ -2957,7 -2909,7 +2957,7 @@@ SYSCALL_DEFINE1(unlink, const char __us
  
  int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
  {
 -      int error = may_create(dir, dentry);
 +      int error = may_create(dir, dentry, 0);
  
        if (error)
                return error;
@@@ -3024,7 -2976,7 +3024,7 @@@ int vfs_link(struct dentry *old_dentry
        if (!inode)
                return -ENOENT;
  
 -      error = may_create(dir, new_dentry);
 +      error = may_create(dir, new_dentry, S_ISDIR(inode->i_mode));
        if (error)
                return error;
  
@@@ -3252,14 -3204,14 +3252,14 @@@ int vfs_rename(struct inode *old_dir, s
        if (old_dentry->d_inode == new_dentry->d_inode)
                return 0;
   
 -      error = may_delete(old_dir, old_dentry, is_dir);
 +      error = may_delete(old_dir, old_dentry, is_dir, 0);
        if (error)
                return error;
  
        if (!new_dentry->d_inode)
 -              error = may_create(new_dir, new_dentry);
 +              error = may_create(new_dir, new_dentry, is_dir);
        else
 -              error = may_delete(new_dir, new_dentry, is_dir);
 +              error = may_delete(new_dir, new_dentry, is_dir, 1);
        if (error)
                return error;
  
diff --combined include/linux/efi.h
@@@ -451,9 -451,7 +451,9 @@@ typedef struct 
   * All runtime access to EFI goes through this structure:
   */
  extern struct efi {
 +#ifndef CONFIG_XEN
        efi_system_table_t *systab;     /* EFI system table */
 +#endif
        unsigned int runtime_version;   /* Runtime services version */
        unsigned long mps;              /* MPS table */
        unsigned long acpi;             /* ACPI table  (IA64 ext 0.71) */
        efi_update_capsule_t *update_capsule;
        efi_query_capsule_caps_t *query_capsule_caps;
        efi_get_next_high_mono_count_t *get_next_high_mono_count;
 +#ifndef CONFIG_XEN
        efi_reset_system_t *reset_system;
        efi_set_virtual_address_map_t *set_virtual_address_map;
 +#endif
  } efi;
  
  static inline int
@@@ -558,7 -554,18 +558,18 @@@ extern int __init efi_setup_pcdp_consol
  #define EFI_VARIABLE_NON_VOLATILE       0x0000000000000001
  #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
  #define EFI_VARIABLE_RUNTIME_ACCESS     0x0000000000000004
+ #define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008
+ #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010
+ #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020
+ #define EFI_VARIABLE_APPEND_WRITE     0x0000000000000040
+ #define EFI_VARIABLE_MASK     (EFI_VARIABLE_NON_VOLATILE | \
+                               EFI_VARIABLE_BOOTSERVICE_ACCESS | \
+                               EFI_VARIABLE_RUNTIME_ACCESS | \
+                               EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
+                               EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
+                               EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
+                               EFI_VARIABLE_APPEND_WRITE)
  /*
   * The type of search to perform when calling boottime->locate_handle
   */