lkml.org 
[lkml]   [2012]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: Linux 3.0.33
    diff --git a/Documentation/HOWTO b/Documentation/HOWTO
    index f7ade3b..59c080f 100644
    --- a/Documentation/HOWTO
    +++ b/Documentation/HOWTO
    @@ -218,16 +218,16 @@ The development process
    Linux kernel development process currently consists of a few different
    main kernel "branches" and lots of different subsystem-specific kernel
    branches. These different branches are:
    - - main 2.6.x kernel tree
    - - 2.6.x.y -stable kernel tree
    - - 2.6.x -git kernel patches
    + - main 3.x kernel tree
    + - 3.x.y -stable kernel tree
    + - 3.x -git kernel patches
    - subsystem specific kernel trees and patches
    - - the 2.6.x -next kernel tree for integration tests
    + - the 3.x -next kernel tree for integration tests

    -2.6.x kernel tree
    +3.x kernel tree
    -----------------
    -2.6.x kernels are maintained by Linus Torvalds, and can be found on
    -kernel.org in the pub/linux/kernel/v2.6/ directory. Its development
    +3.x kernels are maintained by Linus Torvalds, and can be found on
    +kernel.org in the pub/linux/kernel/v3.x/ directory. Its development
    process is as follows:
    - As soon as a new kernel is released a two weeks window is open,
    during this period of time maintainers can submit big diffs to
    @@ -262,20 +262,20 @@ mailing list about kernel releases:
    released according to perceived bug status, not according to a
    preconceived timeline."

    -2.6.x.y -stable kernel tree
    +3.x.y -stable kernel tree
    ---------------------------
    -Kernels with 4-part versions are -stable kernels. They contain
    +Kernels with 3-part versions are -stable kernels. They contain
    relatively small and critical fixes for security problems or significant
    -regressions discovered in a given 2.6.x kernel.
    +regressions discovered in a given 3.x kernel.

    This is the recommended branch for users who want the most recent stable
    kernel and are not interested in helping test development/experimental
    versions.

    -If no 2.6.x.y kernel is available, then the highest numbered 2.6.x
    +If no 3.x.y kernel is available, then the highest numbered 3.x
    kernel is the current stable kernel.

    -2.6.x.y are maintained by the "stable" team <stable@vger.kernel.org>, and
    +3.x.y are maintained by the "stable" team <stable@vger.kernel.org>, and
    are released as needs dictate. The normal release period is approximately
    two weeks, but it can be longer if there are no pressing problems. A
    security-related problem, instead, can cause a release to happen almost
    @@ -285,7 +285,7 @@ The file Documentation/stable_kernel_rules.txt in the kernel tree
    documents what kinds of changes are acceptable for the -stable tree, and
    how the release process works.

    -2.6.x -git patches
    +3.x -git patches
    ------------------
    These are daily snapshots of Linus' kernel tree which are managed in a
    git repository (hence the name.) These patches are usually released
    @@ -317,13 +317,13 @@ revisions to it, and maintainers can mark patches as under review,
    accepted, or rejected. Most of these patchwork sites are listed at
    http://patchwork.kernel.org/.

    -2.6.x -next kernel tree for integration tests
    +3.x -next kernel tree for integration tests
    ---------------------------------------------
    -Before updates from subsystem trees are merged into the mainline 2.6.x
    +Before updates from subsystem trees are merged into the mainline 3.x
    tree, they need to be integration-tested. For this purpose, a special
    testing repository exists into which virtually all subsystem trees are
    pulled on an almost daily basis:
    - http://git.kernel.org/?p=linux/kernel/git/sfr/linux-next.git
    + http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git
    http://linux.f-seidel.de/linux-next/pmwiki/

    This way, the -next kernel gives a summary outlook onto what will be
    diff --git a/Makefile b/Makefile
    index 16b9abf..c621c70 100644
    --- a/Makefile
    +++ b/Makefile
    @@ -1,6 +1,6 @@
    VERSION = 3
    PATCHLEVEL = 0
    -SUBLEVEL = 32
    +SUBLEVEL = 33
    EXTRAVERSION =
    NAME = Sneaky Weasel

    diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
    index d5d8d5c..1252a26 100644
    --- a/arch/arm/include/asm/cacheflush.h
    +++ b/arch/arm/include/asm/cacheflush.h
    @@ -249,7 +249,7 @@ extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr
    * Harvard caches are synchronised for the user space address range.
    * This is used for the ARM private sys_cacheflush system call.
    */
    -#define flush_cache_user_range(vma,start,end) \
    +#define flush_cache_user_range(start,end) \
    __cpuc_coherent_user_range((start) & PAGE_MASK, PAGE_ALIGN(end))

    /*
    diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
    index 6807cb1..56b2715 100644
    --- a/arch/arm/kernel/traps.c
    +++ b/arch/arm/kernel/traps.c
    @@ -451,7 +451,9 @@ do_cache_op(unsigned long start, unsigned long end, int flags)
    if (end > vma->vm_end)
    end = vma->vm_end;

    - flush_cache_user_range(vma, start, end);
    + up_read(&mm->mmap_sem);
    + flush_cache_user_range(start, end);
    + return;
    }
    up_read(&mm->mmap_sem);
    }
    diff --git a/arch/parisc/include/asm/prefetch.h b/arch/parisc/include/asm/prefetch.h
    index c5edc60..1ee7c82 100644
    --- a/arch/parisc/include/asm/prefetch.h
    +++ b/arch/parisc/include/asm/prefetch.h
    @@ -21,7 +21,12 @@
    #define ARCH_HAS_PREFETCH
    static inline void prefetch(const void *addr)
    {
    - __asm__("ldw 0(%0), %%r0" : : "r" (addr));
    + __asm__(
    +#ifndef CONFIG_PA20
    + /* Need to avoid prefetch of NULL on PA7300LC */
    + " extrw,u,= %0,31,32,%%r0\n"
    +#endif
    + " ldw 0(%0), %%r0" : : "r" (addr));
    }

    /* LDD is a PA2.0 addition. */
    diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
    index 6f05944..5350342 100644
    --- a/arch/parisc/kernel/entry.S
    +++ b/arch/parisc/kernel/entry.S
    @@ -581,7 +581,11 @@
    */
    cmpiclr,= 0x01,\tmp,%r0
    ldi (_PAGE_DIRTY|_PAGE_READ|_PAGE_WRITE),\prot
    +#ifdef CONFIG_64BIT
    depd,z \prot,8,7,\prot
    +#else
    + depw,z \prot,8,7,\prot
    +#endif
    /*
    * OK, it is in the temp alias region, check whether "from" or "to".
    * Check "subtle" note in pacache.S re: r23/r26.
    diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S
    index 93ff3d9..5d7218a 100644
    --- a/arch/parisc/kernel/pacache.S
    +++ b/arch/parisc/kernel/pacache.S
    @@ -692,7 +692,7 @@ ENTRY(flush_icache_page_asm)

    /* Purge any old translation */

    - pitlb (%sr0,%r28)
    + pitlb (%sr4,%r28)

    ldil L%icache_stride, %r1
    ldw R%icache_stride(%r1), %r1
    @@ -706,27 +706,29 @@ ENTRY(flush_icache_page_asm)
    sub %r25, %r1, %r25


    -1: fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    - fic,m %r1(%r28)
    + /* fic only has the type 26 form on PA1.1, requiring an
    + * explicit space specification, so use %sr4 */
    +1: fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    + fic,m %r1(%sr4,%r28)
    cmpb,COND(<<) %r28, %r25,1b
    - fic,m %r1(%r28)
    + fic,m %r1(%sr4,%r28)

    sync
    bv %r0(%r2)
    - pitlb (%sr0,%r25)
    + pitlb (%sr4,%r25)
    .exit

    .procend
    diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
    index d814f79..6903d44 100644
    --- a/arch/s390/mm/fault.c
    +++ b/arch/s390/mm/fault.c
    @@ -567,6 +567,7 @@ static void pfault_interrupt(unsigned int ext_int_code,
    tsk->thread.pfault_wait = 0;
    list_del(&tsk->thread.list);
    wake_up_process(tsk);
    + put_task_struct(tsk);
    } else {
    /* Completion interrupt was faster than initial
    * interrupt. Set pfault_wait to -1 so the initial
    @@ -576,14 +577,22 @@ static void pfault_interrupt(unsigned int ext_int_code,
    put_task_struct(tsk);
    } else {
    /* signal bit not set -> a real page is missing. */
    - if (tsk->thread.pfault_wait == -1) {
    + if (tsk->thread.pfault_wait == 1) {
    + /* Already on the list with a reference: put to sleep */
    + set_task_state(tsk, TASK_UNINTERRUPTIBLE);
    + set_tsk_need_resched(tsk);
    + } else if (tsk->thread.pfault_wait == -1) {
    /* Completion interrupt was faster than the initial
    * interrupt (pfault_wait == -1). Set pfault_wait
    * back to zero and exit. */
    tsk->thread.pfault_wait = 0;
    } else {
    /* Initial interrupt arrived before completion
    - * interrupt. Let the task sleep. */
    + * interrupt. Let the task sleep.
    + * An extra task reference is needed since a different
    + * cpu may set the task state to TASK_RUNNING again
    + * before the scheduler is reached. */
    + get_task_struct(tsk);
    tsk->thread.pfault_wait = 1;
    list_add(&tsk->thread.list, &pfault_list);
    set_task_state(tsk, TASK_UNINTERRUPTIBLE);
    @@ -608,6 +617,7 @@ static int __cpuinit pfault_cpu_notify(struct notifier_block *self,
    list_del(&thread->list);
    tsk = container_of(thread, struct task_struct, thread);
    wake_up_process(tsk);
    + put_task_struct(tsk);
    }
    spin_unlock_irq(&pfault_lock);
    break;
    diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
    index 2e79419..9e70257 100644
    --- a/arch/sparc/Kconfig
    +++ b/arch/sparc/Kconfig
    @@ -590,6 +590,9 @@ config SYSVIPC_COMPAT
    depends on COMPAT && SYSVIPC
    default y

    +config KEYS_COMPAT
    + def_bool y if COMPAT && KEYS
    +
    endmenu

    source "net/Kconfig"
    diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S
    index f566518..248fb67 100644
    --- a/arch/sparc/kernel/systbls_64.S
    +++ b/arch/sparc/kernel/systbls_64.S
    @@ -74,7 +74,7 @@ sys_call_table32:
    .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy
    /*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink
    .word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid
    -/*280*/ .word sys32_tee, sys_add_key, sys_request_key, sys_keyctl, compat_sys_openat
    +/*280*/ .word sys32_tee, sys_add_key, sys_request_key, compat_sys_keyctl, compat_sys_openat
    .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64
    /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
    .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare
    diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig
    index 0249b8b..532a2a4 100644
    --- a/arch/tile/Kconfig
    +++ b/arch/tile/Kconfig
    @@ -11,6 +11,7 @@ config TILE
    select GENERIC_IRQ_PROBE
    select GENERIC_PENDING_IRQ if SMP
    select GENERIC_IRQ_SHOW
    + select HAVE_SYSCALL_WRAPPERS if TILEGX
    select SYS_HYPERVISOR

    # FIXME: investigate whether we need/want these options.
    diff --git a/arch/tile/include/asm/bitops.h b/arch/tile/include/asm/bitops.h
    index 16f1fa5..bd186c4 100644
    --- a/arch/tile/include/asm/bitops.h
    +++ b/arch/tile/include/asm/bitops.h
    @@ -77,6 +77,11 @@ static inline int ffs(int x)
    return __builtin_ffs(x);
    }

    +static inline int fls64(__u64 w)
    +{
    + return (sizeof(__u64) * 8) - __builtin_clzll(w);
    +}
    +
    /**
    * fls - find last set bit in word
    * @x: the word to search
    @@ -90,12 +95,7 @@ static inline int ffs(int x)
    */
    static inline int fls(int x)
    {
    - return (sizeof(int) * 8) - __builtin_clz(x);
    -}
    -
    -static inline int fls64(__u64 w)
    -{
    - return (sizeof(__u64) * 8) - __builtin_clzll(w);
    + return fls64((unsigned int) x);
    }

    static inline unsigned int __arch_hweight32(unsigned int w)
    diff --git a/arch/um/include/asm/pgtable.h b/arch/um/include/asm/pgtable.h
    index 41474fb..aa365c5 100644
    --- a/arch/um/include/asm/pgtable.h
    +++ b/arch/um/include/asm/pgtable.h
    @@ -271,6 +271,12 @@ static inline void set_pte(pte_t *pteptr, pte_t pteval)
    }
    #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)

    +#define __HAVE_ARCH_PTE_SAME
    +static inline int pte_same(pte_t pte_a, pte_t pte_b)
    +{
    + return !((pte_val(pte_a) ^ pte_val(pte_b)) & ~_PAGE_NEWPAGE);
    +}
    +
    /*
    * Conversion functions: convert a page and protection to a page entry,
    * and a page entry and page directory to the page they refer to.
    @@ -346,11 +352,11 @@ extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr);
    #define update_mmu_cache(vma,address,ptep) do ; while (0)

    /* Encode and de-code a swap entry */
    -#define __swp_type(x) (((x).val >> 4) & 0x3f)
    +#define __swp_type(x) (((x).val >> 5) & 0x1f)
    #define __swp_offset(x) ((x).val >> 11)

    #define __swp_entry(type, offset) \
    - ((swp_entry_t) { ((type) << 4) | ((offset) << 11) })
    + ((swp_entry_t) { ((type) << 5) | ((offset) << 11) })
    #define __pte_to_swp_entry(pte) \
    ((swp_entry_t) { pte_val(pte_mkuptodate(pte)) })
    #define __swp_entry_to_pte(x) ((pte_t) { (x).val })
    diff --git a/arch/x86/kernel/cpu/mcheck/mce-severity.c b/arch/x86/kernel/cpu/mcheck/mce-severity.c
    index 1e8d66c..362190b 100644
    --- a/arch/x86/kernel/cpu/mcheck/mce-severity.c
    +++ b/arch/x86/kernel/cpu/mcheck/mce-severity.c
    @@ -101,15 +101,19 @@ static struct severity {
    };

    /*
    - * If the EIPV bit is set, it means the saved IP is the
    - * instruction which caused the MCE.
    + * If mcgstatus indicated that ip/cs on the stack were
    + * no good, then "m->cs" will be zero and we will have
    + * to assume the worst case (IN_KERNEL) as we actually
    + * have no idea what we were executing when the machine
    + * check hit.
    + * If we do have a good "m->cs" (or a faked one in the
    + * case we were executing in VM86 mode) we can use it to
    + * distinguish an exception taken in user from from one
    + * taken in the kernel.
    */
    static int error_context(struct mce *m)
    {
    - if (m->mcgstatus & MCG_STATUS_EIPV)
    - return (m->ip && (m->cs & 3) == 3) ? IN_USER : IN_KERNEL;
    - /* Unknown, assume kernel */
    - return IN_KERNEL;
    + return ((m->cs & 3) == 3) ? IN_USER : IN_KERNEL;
    }

    int mce_severity(struct mce *a, int tolerant, char **msg)
    diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c
    index fe29c1d..4b50c96 100644
    --- a/arch/x86/kernel/cpu/perf_event_amd.c
    +++ b/arch/x86/kernel/cpu/perf_event_amd.c
    @@ -437,6 +437,7 @@ static __initconst const struct x86_pmu amd_pmu = {
    * 0x023 DE PERF_CTL[2:0]
    * 0x02D LS PERF_CTL[3]
    * 0x02E LS PERF_CTL[3,0]
    + * 0x031 LS PERF_CTL[2:0] (**)
    * 0x043 CU PERF_CTL[2:0]
    * 0x045 CU PERF_CTL[2:0]
    * 0x046 CU PERF_CTL[2:0]
    @@ -450,10 +451,12 @@ static __initconst const struct x86_pmu amd_pmu = {
    * 0x0DD LS PERF_CTL[5:0]
    * 0x0DE LS PERF_CTL[5:0]
    * 0x0DF LS PERF_CTL[5:0]
    + * 0x1C0 EX PERF_CTL[5:3]
    * 0x1D6 EX PERF_CTL[5:0]
    * 0x1D8 EX PERF_CTL[5:0]
    *
    - * (*) depending on the umask all FPU counters may be used
    + * (*) depending on the umask all FPU counters may be used
    + * (**) only one unitmask enabled at a time
    */

    static struct event_constraint amd_f15_PMC0 = EVENT_CONSTRAINT(0, 0x01, 0);
    @@ -503,6 +506,12 @@ amd_get_event_constraints_f15h(struct cpu_hw_events *cpuc, struct perf_event *ev
    return &amd_f15_PMC3;
    case 0x02E:
    return &amd_f15_PMC30;
    + case 0x031:
    + if (hweight_long(hwc->config & ARCH_PERFMON_EVENTSEL_UMASK) <= 1)
    + return &amd_f15_PMC20;
    + return &emptyconstraint;
    + case 0x1C0:
    + return &amd_f15_PMC53;
    default:
    return &amd_f15_PMC50;
    }
    diff --git a/block/genhd.c b/block/genhd.c
    index f6ecddb..d7f7d4e 100644
    --- a/block/genhd.c
    +++ b/block/genhd.c
    @@ -744,7 +744,7 @@ void __init printk_all_partitions(void)
    struct hd_struct *part;
    char name_buf[BDEVNAME_SIZE];
    char devt_buf[BDEVT_SIZE];
    - u8 uuid[PARTITION_META_INFO_UUIDLTH * 2 + 1];
    + char uuid_buf[PARTITION_META_INFO_UUIDLTH * 2 + 5];

    /*
    * Don't show empty devices or things that have been
    @@ -763,14 +763,16 @@ void __init printk_all_partitions(void)
    while ((part = disk_part_iter_next(&piter))) {
    bool is_part0 = part == &disk->part0;

    - uuid[0] = 0;
    + uuid_buf[0] = '\0';
    if (part->info)
    - part_unpack_uuid(part->info->uuid, uuid);
    + snprintf(uuid_buf, sizeof(uuid_buf), "%pU",
    + part->info->uuid);

    printk("%s%s %10llu %s %s", is_part0 ? "" : " ",
    bdevt_str(part_devt(part), devt_buf),
    (unsigned long long)part->nr_sects >> 1,
    - disk_name(disk, part->partno, name_buf), uuid);
    + disk_name(disk, part->partno, name_buf),
    + uuid_buf);
    if (is_part0) {
    if (disk->driverfs_dev != NULL &&
    disk->driverfs_dev->driver != NULL)
    diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
    index 1e9ab9b..abf2f4e 100644
    --- a/drivers/ata/ahci.c
    +++ b/drivers/ata/ahci.c
    @@ -392,6 +392,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
    .driver_data = board_ahci_yes_fbs }, /* 88se9128 */
    { PCI_DEVICE(0x1b4b, 0x9125),
    .driver_data = board_ahci_yes_fbs }, /* 88se9125 */
    + { PCI_DEVICE(0x1b4b, 0x917a),
    + .driver_data = board_ahci_yes_fbs }, /* 88se9172 */
    { PCI_DEVICE(0x1b4b, 0x91a3),
    .driver_data = board_ahci_yes_fbs },

    diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
    index 997db7f..d05f03c 100644
    --- a/drivers/gpu/drm/i915/i915_irq.c
    +++ b/drivers/gpu/drm/i915/i915_irq.c
    @@ -422,14 +422,11 @@ static void gen6_pm_rps_work(struct work_struct *work)
    mutex_unlock(&dev_priv->dev->struct_mutex);
    }

    -static void pch_irq_handler(struct drm_device *dev)
    +static void pch_irq_handler(struct drm_device *dev, u32 pch_iir)
    {
    drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
    - u32 pch_iir;
    int pipe;

    - pch_iir = I915_READ(SDEIIR);
    -
    if (pch_iir & SDE_AUDIO_POWER_MASK)
    DRM_DEBUG_DRIVER("PCH audio power change on port %d\n",
    (pch_iir & SDE_AUDIO_POWER_MASK) >>
    @@ -527,7 +524,7 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
    if (de_iir & DE_PCH_EVENT_IVB) {
    if (pch_iir & SDE_HOTPLUG_MASK_CPT)
    queue_work(dev_priv->wq, &dev_priv->hotplug_work);
    - pch_irq_handler(dev);
    + pch_irq_handler(dev, pch_iir);
    }

    if (pm_iir & GEN6_PM_DEFERRED_EVENTS) {
    @@ -626,7 +623,7 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
    if (de_iir & DE_PCH_EVENT) {
    if (pch_iir & hotplug_mask)
    queue_work(dev_priv->wq, &dev_priv->hotplug_work);
    - pch_irq_handler(dev);
    + pch_irq_handler(dev, pch_iir);
    }

    if (de_iir & DE_PCU_EVENT) {
    diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
    index b05c256..387b2b3 100644
    --- a/drivers/gpu/drm/i915/i915_reg.h
    +++ b/drivers/gpu/drm/i915/i915_reg.h
    @@ -537,6 +537,21 @@

    #define GEN6_BSD_RNCID 0x12198

    +#define GEN7_FF_THREAD_MODE 0x20a0
    +#define GEN7_FF_SCHED_MASK 0x0077070
    +#define GEN7_FF_TS_SCHED_HS1 (0x5<<16)
    +#define GEN7_FF_TS_SCHED_HS0 (0x3<<16)
    +#define GEN7_FF_TS_SCHED_LOAD_BALANCE (0x1<<16)
    +#define GEN7_FF_TS_SCHED_HW (0x0<<16) /* Default */
    +#define GEN7_FF_VS_SCHED_HS1 (0x5<<12)
    +#define GEN7_FF_VS_SCHED_HS0 (0x3<<12)
    +#define GEN7_FF_VS_SCHED_LOAD_BALANCE (0x1<<12) /* Default */
    +#define GEN7_FF_VS_SCHED_HW (0x0<<12)
    +#define GEN7_FF_DS_SCHED_HS1 (0x5<<4)
    +#define GEN7_FF_DS_SCHED_HS0 (0x3<<4)
    +#define GEN7_FF_DS_SCHED_LOAD_BALANCE (0x1<<4) /* Default */
    +#define GEN7_FF_DS_SCHED_HW (0x0<<4)
    +
    /*
    * Framebuffer compression (915+ only)
    */
    diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
    index f150a15..4b8e235 100644
    --- a/drivers/gpu/drm/i915/intel_display.c
    +++ b/drivers/gpu/drm/i915/intel_display.c
    @@ -6579,10 +6579,11 @@ static void intel_sanitize_modesetting(struct drm_device *dev,
    {
    struct drm_i915_private *dev_priv = dev->dev_private;
    u32 reg, val;
    + int i;

    /* Clear any frame start delays used for debugging left by the BIOS */
    - for_each_pipe(pipe) {
    - reg = PIPECONF(pipe);
    + for_each_pipe(i) {
    + reg = PIPECONF(i);
    I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
    }

    @@ -7451,6 +7452,18 @@ static void gen6_init_clock_gating(struct drm_device *dev)
    DISPPLANE_TRICKLE_FEED_DISABLE);
    }

    +static void gen7_setup_fixed_func_scheduler(struct drm_i915_private *dev_priv)
    +{
    + uint32_t reg = I915_READ(GEN7_FF_THREAD_MODE);
    +
    + reg &= ~GEN7_FF_SCHED_MASK;
    + reg |= GEN7_FF_TS_SCHED_HW;
    + reg |= GEN7_FF_VS_SCHED_HW;
    + reg |= GEN7_FF_DS_SCHED_HW;
    +
    + I915_WRITE(GEN7_FF_THREAD_MODE, reg);
    +}
    +
    static void ivybridge_init_clock_gating(struct drm_device *dev)
    {
    struct drm_i915_private *dev_priv = dev->dev_private;
    @@ -7597,6 +7610,8 @@ static void ironlake_teardown_rc6(struct drm_device *dev)
    drm_gem_object_unreference(&dev_priv->pwrctx->base);
    dev_priv->pwrctx = NULL;
    }
    +
    + gen7_setup_fixed_func_scheduler(dev_priv);
    }

    static void ironlake_disable_rc6(struct drm_device *dev)
    diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
    index 2ad49cb..5fb98de 100644
    --- a/drivers/gpu/drm/nouveau/nouveau_bo.c
    +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
    @@ -1075,7 +1075,7 @@ nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)

    nvbo->placement.fpfn = 0;
    nvbo->placement.lpfn = dev_priv->fb_mappable_pages;
    - nouveau_bo_placement_set(nvbo, TTM_PL_VRAM, 0);
    + nouveau_bo_placement_set(nvbo, TTM_PL_FLAG_VRAM, 0);
    return nouveau_bo_validate(nvbo, false, true, false);
    }

    diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
    index a76d85f..79b4bcb 100644
    --- a/drivers/i2c/busses/i2c-davinci.c
    +++ b/drivers/i2c/busses/i2c-davinci.c
    @@ -755,7 +755,7 @@ static int davinci_i2c_remove(struct platform_device *pdev)
    dev->clk = NULL;

    davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, 0);
    - free_irq(IRQ_I2C, dev);
    + free_irq(dev->irq, dev);
    iounmap(dev->base);
    kfree(dev);

    diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c
    index daa93e9..267005d 100644
    --- a/drivers/infiniband/hw/cxgb4/cm.c
    +++ b/drivers/infiniband/hw/cxgb4/cm.c
    @@ -2316,6 +2316,12 @@ static int peer_abort_intr(struct c4iw_dev *dev, struct sk_buff *skb)
    unsigned int tid = GET_TID(req);

    ep = lookup_tid(t, tid);
    + if (!ep) {
    + printk(KERN_WARNING MOD
    + "Abort on non-existent endpoint, tid %d\n", tid);
    + kfree_skb(skb);
    + return 0;
    + }
    if (is_neg_adv_abort(req->status)) {
    PDBG("%s neg_adv_abort ep %p tid %u\n", __func__, ep,
    ep->hwtid);
    diff --git a/drivers/isdn/gigaset/capi.c b/drivers/isdn/gigaset/capi.c
    index 658e75f..d1dde65 100644
    --- a/drivers/isdn/gigaset/capi.c
    +++ b/drivers/isdn/gigaset/capi.c
    @@ -14,6 +14,7 @@
    #include "gigaset.h"
    #include <linux/proc_fs.h>
    #include <linux/seq_file.h>
    +#include <linux/ratelimit.h>
    #include <linux/isdn/capilli.h>
    #include <linux/isdn/capicmd.h>
    #include <linux/isdn/capiutil.h>
    @@ -222,10 +223,14 @@ get_appl(struct gigaset_capi_ctr *iif, u16 appl)
    static inline void dump_cmsg(enum debuglevel level, const char *tag, _cmsg *p)
    {
    #ifdef CONFIG_GIGASET_DEBUG
    + /* dump at most 20 messages in 20 secs */
    + static DEFINE_RATELIMIT_STATE(msg_dump_ratelimit, 20 * HZ, 20);
    _cdebbuf *cdb;

    if (!(gigaset_debuglevel & level))
    return;
    + if (!___ratelimit(&msg_dump_ratelimit, tag))
    + return;

    cdb = capi_cmsg2str(p);
    if (cdb) {
    @@ -2058,12 +2063,6 @@ static void do_reset_b3_req(struct gigaset_capi_ctr *iif,
    }

    /*
    - * dump unsupported/ignored messages at most twice per minute,
    - * some apps send those very frequently
    - */
    -static unsigned long ignored_msg_dump_time;
    -
    -/*
    * unsupported CAPI message handler
    */
    static void do_unsupported(struct gigaset_capi_ctr *iif,
    @@ -2072,8 +2071,7 @@ static void do_unsupported(struct gigaset_capi_ctr *iif,
    {
    /* decode message */
    capi_message2cmsg(&iif->acmsg, skb->data);
    - if (printk_timed_ratelimit(&ignored_msg_dump_time, 30 * 1000))
    - dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
    + dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
    send_conf(iif, ap, skb, CapiMessageNotSupportedInCurrentState);
    }

    @@ -2084,11 +2082,9 @@ static void do_nothing(struct gigaset_capi_ctr *iif,
    struct gigaset_capi_appl *ap,
    struct sk_buff *skb)
    {
    - if (printk_timed_ratelimit(&ignored_msg_dump_time, 30 * 1000)) {
    - /* decode message */
    - capi_message2cmsg(&iif->acmsg, skb->data);
    - dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
    - }
    + /* decode message */
    + capi_message2cmsg(&iif->acmsg, skb->data);
    + dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
    dev_kfree_skb_any(skb);
    }

    diff --git a/drivers/md/md.c b/drivers/md/md.c
    index a2b3f21..8b04a02 100644
    --- a/drivers/md/md.c
    +++ b/drivers/md/md.c
    @@ -409,7 +409,7 @@ static void submit_flushes(struct work_struct *ws)
    atomic_inc(&rdev->nr_pending);
    atomic_inc(&rdev->nr_pending);
    rcu_read_unlock();
    - bi = bio_alloc_mddev(GFP_KERNEL, 0, mddev);
    + bi = bio_alloc_mddev(GFP_NOIO, 0, mddev);
    bi->bi_end_io = md_end_flush;
    bi->bi_private = rdev;
    bi->bi_bdev = rdev->bdev;
    diff --git a/drivers/media/dvb/siano/smsusb.c b/drivers/media/dvb/siano/smsusb.c
    index 0c8164a..d755407 100644
    --- a/drivers/media/dvb/siano/smsusb.c
    +++ b/drivers/media/dvb/siano/smsusb.c
    @@ -541,6 +541,8 @@ static const struct usb_device_id smsusb_id_table[] __devinitconst = {
    .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
    { USB_DEVICE(0x2040, 0xc090),
    .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
    + { USB_DEVICE(0x2040, 0xc0a0),
    + .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
    { } /* Terminating entry */
    };

    diff --git a/drivers/media/video/uvc/uvc_v4l2.c b/drivers/media/video/uvc/uvc_v4l2.c
    index dbefdb0..5afdbb7 100644
    --- a/drivers/media/video/uvc/uvc_v4l2.c
    +++ b/drivers/media/video/uvc/uvc_v4l2.c
    @@ -710,7 +710,7 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
    break;
    }
    pin = iterm->id;
    - } else if (pin < selector->bNrInPins) {
    + } else if (index < selector->bNrInPins) {
    pin = selector->baSourceID[index];
    list_for_each_entry(iterm, &chain->entities, chain) {
    if (!UVC_ENTITY_IS_ITERM(iterm))
    diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c
    index ac492ac..9b18b54 100644
    --- a/drivers/mmc/core/sdio.c
    +++ b/drivers/mmc/core/sdio.c
    @@ -665,7 +665,7 @@ static int mmc_sdio_resume(struct mmc_host *host)
    }

    if (!err && host->sdio_irqs)
    - mmc_signal_sdio_irq(host);
    + wake_up_process(host->sdio_irq_thread);
    mmc_release_host(host);

    /*
    diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c
    index 03ead02..d58ae91 100644
    --- a/drivers/mmc/core/sdio_irq.c
    +++ b/drivers/mmc/core/sdio_irq.c
    @@ -27,18 +27,20 @@

    #include "sdio_ops.h"

    -static int process_sdio_pending_irqs(struct mmc_card *card)
    +static int process_sdio_pending_irqs(struct mmc_host *host)
    {
    + struct mmc_card *card = host->card;
    int i, ret, count;
    unsigned char pending;
    struct sdio_func *func;

    /*
    * Optimization, if there is only 1 function interrupt registered
    - * call irq handler directly
    + * and we know an IRQ was signaled then call irq handler directly.
    + * Otherwise do the full probe.
    */
    func = card->sdio_single_irq;
    - if (func) {
    + if (func && host->sdio_irq_pending) {
    func->irq_handler(func);
    return 1;
    }
    @@ -115,7 +117,8 @@ static int sdio_irq_thread(void *_host)
    ret = __mmc_claim_host(host, &host->sdio_irq_thread_abort);
    if (ret)
    break;
    - ret = process_sdio_pending_irqs(host->card);
    + ret = process_sdio_pending_irqs(host);
    + host->sdio_irq_pending = false;
    mmc_release_host(host);

    /*
    diff --git a/drivers/mtd/sm_ftl.c b/drivers/mtd/sm_ftl.c
    index ed3d6cd..0e34d56 100644
    --- a/drivers/mtd/sm_ftl.c
    +++ b/drivers/mtd/sm_ftl.c
    @@ -1256,7 +1256,7 @@ static void sm_remove_dev(struct mtd_blktrans_dev *dev)

    static struct mtd_blktrans_ops sm_ftl_ops = {
    .name = "smblk",
    - .major = -1,
    + .major = 0,
    .part_bits = SM_FTL_PARTN_BITS,
    .blksize = SM_SECTOR_SIZE,
    .getgeo = sm_getgeo,
    diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c
    index e86edfc..1e80a48 100644
    --- a/drivers/rtc/rtc-pl031.c
    +++ b/drivers/rtc/rtc-pl031.c
    @@ -312,6 +312,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
    int ret;
    struct pl031_local *ldata;
    struct rtc_class_ops *ops = id->data;
    + unsigned long time;

    ret = amba_request_regions(adev, NULL);
    if (ret)
    @@ -343,6 +344,23 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
    writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN,
    ldata->base + RTC_CR);

    + /*
    + * On ST PL031 variants, the RTC reset value does not provide correct
    + * weekday for 2000-01-01. Correct the erroneous sunday to saturday.
    + */
    + if (ldata->hw_designer == AMBA_VENDOR_ST) {
    + if (readl(ldata->base + RTC_YDR) == 0x2000) {
    + time = readl(ldata->base + RTC_DR);
    + if ((time &
    + (RTC_MON_MASK | RTC_MDAY_MASK | RTC_WDAY_MASK))
    + == 0x02120000) {
    + time = time | (0x7 << RTC_WDAY_SHIFT);
    + writel(0x2000, ldata->base + RTC_YLR);
    + writel(time, ldata->base + RTC_LR);
    + }
    + }
    + }
    +
    ldata->rtc = rtc_device_register("pl031", &adev->dev, ops,
    THIS_MODULE);
    if (IS_ERR(ldata->rtc)) {
    diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
    index 168e67f..58f99f4 100644
    --- a/drivers/scsi/hpsa.c
    +++ b/drivers/scsi/hpsa.c
    @@ -1654,30 +1654,26 @@ static void figure_bus_target_lun(struct ctlr_info *h,

    if (is_logical_dev_addr_mode(lunaddrbytes)) {
    /* logical device */
    - if (unlikely(is_scsi_rev_5(h))) {
    - /* p1210m, logical drives lun assignments
    - * match SCSI REPORT LUNS data.
    + lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
    + if (is_msa2xxx(h, device)) {
    + /* msa2xxx way, put logicals on bus 1
    + * and match target/lun numbers box
    + * reports.
    */
    - lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
    - *bus = 0;
    - *target = 0;
    - *lun = (lunid & 0x3fff) + 1;
    + *bus = 1;
    + *target = (lunid >> 16) & 0x3fff;
    + *lun = lunid & 0x00ff;
    } else {
    - /* not p1210m... */
    - lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
    - if (is_msa2xxx(h, device)) {
    - /* msa2xxx way, put logicals on bus 1
    - * and match target/lun numbers box
    - * reports.
    - */
    - *bus = 1;
    - *target = (lunid >> 16) & 0x3fff;
    - *lun = lunid & 0x00ff;
    + if (likely(is_scsi_rev_5(h))) {
    + /* All current smart arrays (circa 2011) */
    + *bus = 0;
    + *target = 0;
    + *lun = (lunid & 0x3fff) + 1;
    } else {
    - /* Traditional smart array way. */
    + /* Traditional old smart array way. */
    *bus = 0;
    - *lun = 0;
    *target = lunid & 0x3fff;
    + *lun = 0;
    }
    }
    } else {
    diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
    index 61e0d09..71b57ec 100644
    --- a/drivers/scsi/isci/init.c
    +++ b/drivers/scsi/isci/init.c
    @@ -454,7 +454,7 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic
    if (!orom)
    orom = isci_request_oprom(pdev);

    - for (i = 0; orom && i < ARRAY_SIZE(orom->ctrl); i++) {
    + for (i = 0; orom && i < num_controllers(pdev); i++) {
    if (sci_oem_parameters_validate(&orom->ctrl[i])) {
    dev_warn(&pdev->dev,
    "[%d]: invalid oem parameters detected, falling back to firmware\n", i);
    diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c
    index 10f16a3..e10639b 100644
    --- a/drivers/scsi/mpt2sas/mpt2sas_base.c
    +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c
    @@ -3056,7 +3056,7 @@ _base_get_port_facts(struct MPT2SAS_ADAPTER *ioc, int port, int sleep_flag)
    }

    pfacts = &ioc->pfacts[port];
    - memset(pfacts, 0, sizeof(Mpi2PortFactsReply_t));
    + memset(pfacts, 0, sizeof(struct mpt2sas_port_facts));
    pfacts->PortNumber = mpi_reply.PortNumber;
    pfacts->VP_ID = mpi_reply.VP_ID;
    pfacts->VF_ID = mpi_reply.VF_ID;
    @@ -3098,7 +3098,7 @@ _base_get_ioc_facts(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
    }

    facts = &ioc->facts;
    - memset(facts, 0, sizeof(Mpi2IOCFactsReply_t));
    + memset(facts, 0, sizeof(struct mpt2sas_facts));
    facts->MsgVersion = le16_to_cpu(mpi_reply.MsgVersion);
    facts->HeaderVersion = le16_to_cpu(mpi_reply.HeaderVersion);
    facts->VP_ID = mpi_reply.VP_ID;
    @@ -3779,7 +3779,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
    goto out_free_resources;

    ioc->pfacts = kcalloc(ioc->facts.NumberOfPorts,
    - sizeof(Mpi2PortFactsReply_t), GFP_KERNEL);
    + sizeof(struct mpt2sas_port_facts), GFP_KERNEL);
    if (!ioc->pfacts) {
    r = -ENOMEM;
    goto out_free_resources;
    diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c
    index 63e50f7..ea8d109 100644
    --- a/drivers/staging/comedi/comedi_fops.c
    +++ b/drivers/staging/comedi/comedi_fops.c
    @@ -280,7 +280,7 @@ static int do_devconfig_ioctl(struct comedi_device *dev,
    if (ret == 0) {
    if (!try_module_get(dev->driver->module)) {
    comedi_device_detach(dev);
    - return -ENOSYS;
    + ret = -ENOSYS;
    }
    }

    diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
    index 7e02c9c..5b3d063 100644
    --- a/drivers/tty/serial/mxs-auart.c
    +++ b/drivers/tty/serial/mxs-auart.c
    @@ -368,6 +368,8 @@ static void mxs_auart_settermios(struct uart_port *u,

    writel(ctrl, u->membase + AUART_LINECTRL);
    writel(ctrl2, u->membase + AUART_CTRL2);
    +
    + uart_update_timeout(u, termios->c_cflag, baud);
    }

    static irqreturn_t mxs_auart_irq_handle(int irq, void *context)
    diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
    index 6bc20d7..de5e33f 100644
    --- a/drivers/tty/serial/serial_core.c
    +++ b/drivers/tty/serial/serial_core.c
    @@ -2325,6 +2325,7 @@ void uart_unregister_driver(struct uart_driver *drv)
    tty_unregister_driver(p);
    put_tty_driver(p);
    kfree(drv->state);
    + drv->state = NULL;
    drv->tty_driver = NULL;
    }

    diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
    index 00b7bf9..5a244cf 100644
    --- a/drivers/usb/class/cdc-wdm.c
    +++ b/drivers/usb/class/cdc-wdm.c
    @@ -511,7 +511,7 @@ static unsigned int wdm_poll(struct file *file, struct poll_table_struct *wait)

    spin_lock_irqsave(&desc->iuspin, flags);
    if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
    - mask = POLLERR;
    + mask = POLLHUP | POLLERR;
    spin_unlock_irqrestore(&desc->iuspin, flags);
    goto desc_out;
    }
    diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
    index 0ca54e2..ca3c303 100644
    --- a/drivers/usb/core/devio.c
    +++ b/drivers/usb/core/devio.c
    @@ -292,17 +292,14 @@ static struct async *async_getcompleted(struct dev_state *ps)
    static struct async *async_getpending(struct dev_state *ps,
    void __user *userurb)
    {
    - unsigned long flags;
    struct async *as;

    - spin_lock_irqsave(&ps->lock, flags);
    list_for_each_entry(as, &ps->async_pending, asynclist)
    if (as->userurb == userurb) {
    list_del_init(&as->asynclist);
    - spin_unlock_irqrestore(&ps->lock, flags);
    return as;
    }
    - spin_unlock_irqrestore(&ps->lock, flags);
    +
    return NULL;
    }

    @@ -357,6 +354,7 @@ static void cancel_bulk_urbs(struct dev_state *ps, unsigned bulk_addr)
    __releases(ps->lock)
    __acquires(ps->lock)
    {
    + struct urb *urb;
    struct async *as;

    /* Mark all the pending URBs that match bulk_addr, up to but not
    @@ -379,8 +377,11 @@ __acquires(ps->lock)
    list_for_each_entry(as, &ps->async_pending, asynclist) {
    if (as->bulk_status == AS_UNLINK) {
    as->bulk_status = 0; /* Only once */
    + urb = as->urb;
    + usb_get_urb(urb);
    spin_unlock(&ps->lock); /* Allow completions */
    - usb_unlink_urb(as->urb);
    + usb_unlink_urb(urb);
    + usb_put_urb(urb);
    spin_lock(&ps->lock);
    goto rescan;
    }
    @@ -433,6 +434,7 @@ static void async_completed(struct urb *urb)

    static void destroy_async(struct dev_state *ps, struct list_head *list)
    {
    + struct urb *urb;
    struct async *as;
    unsigned long flags;

    @@ -440,10 +442,13 @@ static void destroy_async(struct dev_state *ps, struct list_head *list)
    while (!list_empty(list)) {
    as = list_entry(list->next, struct async, asynclist);
    list_del_init(&as->asynclist);
    + urb = as->urb;
    + usb_get_urb(urb);

    /* drop the spinlock so the completion handler can run */
    spin_unlock_irqrestore(&ps->lock, flags);
    - usb_kill_urb(as->urb);
    + usb_kill_urb(urb);
    + usb_put_urb(urb);
    spin_lock_irqsave(&ps->lock, flags);
    }
    spin_unlock_irqrestore(&ps->lock, flags);
    @@ -1352,12 +1357,24 @@ static int proc_submiturb(struct dev_state *ps, void __user *arg)

    static int proc_unlinkurb(struct dev_state *ps, void __user *arg)
    {
    + struct urb *urb;
    struct async *as;
    + unsigned long flags;

    + spin_lock_irqsave(&ps->lock, flags);
    as = async_getpending(ps, arg);
    - if (!as)
    + if (!as) {
    + spin_unlock_irqrestore(&ps->lock, flags);
    return -EINVAL;
    - usb_kill_urb(as->urb);
    + }
    +
    + urb = as->urb;
    + usb_get_urb(urb);
    + spin_unlock_irqrestore(&ps->lock, flags);
    +
    + usb_kill_urb(urb);
    + usb_put_urb(urb);
    +
    return 0;
    }

    diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
    index 4c65eb6..32d3adc 100644
    --- a/drivers/usb/core/quirks.c
    +++ b/drivers/usb/core/quirks.c
    @@ -123,6 +123,9 @@ static const struct usb_device_id usb_quirk_list[] = {
    /* Guillemot Webcam Hercules Dualpix Exchange*/
    { USB_DEVICE(0x06f8, 0x3005), .driver_info = USB_QUIRK_RESET_RESUME },

    + /* Midiman M-Audio Keystation 88es */
    + { USB_DEVICE(0x0763, 0x0192), .driver_info = USB_QUIRK_RESET_RESUME },
    +
    /* M-Systems Flash Disk Pioneers */
    { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },

    diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c
    index 5308381..44d789d 100644
    --- a/drivers/usb/gadget/fsl_udc_core.c
    +++ b/drivers/usb/gadget/fsl_udc_core.c
    @@ -717,6 +717,8 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
    lastreq = list_entry(ep->queue.prev, struct fsl_req, queue);
    lastreq->tail->next_td_ptr =
    cpu_to_hc32(req->head->td_dma & DTD_ADDR_MASK);
    + /* Ensure dTD's next dtd pointer to be updated */
    + wmb();
    /* Read prime bit, if 1 goto done */
    if (fsl_readl(&dr_regs->endpointprime) & bitmask)
    goto out;
    diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
    index 3940d28..efb9efc 100644
    --- a/drivers/usb/host/ehci-pci.c
    +++ b/drivers/usb/host/ehci-pci.c
    @@ -365,7 +365,9 @@ static bool usb_is_intel_switchable_ehci(struct pci_dev *pdev)
    {
    return pdev->class == PCI_CLASS_SERIAL_USB_EHCI &&
    pdev->vendor == PCI_VENDOR_ID_INTEL &&
    - pdev->device == 0x1E26;
    + (pdev->device == 0x1E26 ||
    + pdev->device == 0x8C2D ||
    + pdev->device == 0x8C26);
    }

    static void ehci_enable_xhci_companion(void)
    diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
    index 7fec8bd..0757b19 100644
    --- a/drivers/usb/host/pci-quirks.c
    +++ b/drivers/usb/host/pci-quirks.c
    @@ -711,12 +711,28 @@ static int handshake(void __iomem *ptr, u32 mask, u32 done,
    return -ETIMEDOUT;
    }

    -bool usb_is_intel_switchable_xhci(struct pci_dev *pdev)
    +#define PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI 0x8C31
    +
    +bool usb_is_intel_ppt_switchable_xhci(struct pci_dev *pdev)
    {
    return pdev->class == PCI_CLASS_SERIAL_USB_XHCI &&
    pdev->vendor == PCI_VENDOR_ID_INTEL &&
    pdev->device == PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI;
    }
    +
    +/* The Intel Lynx Point chipset also has switchable ports. */
    +bool usb_is_intel_lpt_switchable_xhci(struct pci_dev *pdev)
    +{
    + return pdev->class == PCI_CLASS_SERIAL_USB_XHCI &&
    + pdev->vendor == PCI_VENDOR_ID_INTEL &&
    + pdev->device == PCI_DEVICE_ID_INTEL_LYNX_POINT_XHCI;
    +}
    +
    +bool usb_is_intel_switchable_xhci(struct pci_dev *pdev)
    +{
    + return usb_is_intel_ppt_switchable_xhci(pdev) ||
    + usb_is_intel_lpt_switchable_xhci(pdev);
    +}
    EXPORT_SYMBOL_GPL(usb_is_intel_switchable_xhci);

    /*
    diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
    index a4468d9..b455f4c 100644
    --- a/drivers/usb/host/xhci-mem.c
    +++ b/drivers/usb/host/xhci-mem.c
    @@ -1520,6 +1520,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
    xhci->event_ring = NULL;
    xhci_dbg(xhci, "Freed event ring\n");

    + xhci->cmd_ring_reserved_trbs = 0;
    if (xhci->cmd_ring)
    xhci_ring_free(xhci, xhci->cmd_ring);
    xhci->cmd_ring = NULL;
    diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
    index 4509f69..39e230f 100644
    --- a/drivers/usb/host/xhci-pci.c
    +++ b/drivers/usb/host/xhci-pci.c
    @@ -123,6 +123,7 @@ static int xhci_pci_setup(struct usb_hcd *hcd)
    xhci_dbg(xhci, "QUIRK: Fresco Logic revision %u "
    "has broken MSI implementation\n",
    pdev->revision);
    + xhci->quirks |= XHCI_TRUST_TX_LENGTH;
    }

    if (pdev->vendor == PCI_VENDOR_ID_NEC)
    diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
    index c42fdff..de3c151 100644
    --- a/drivers/usb/host/xhci-ring.c
    +++ b/drivers/usb/host/xhci-ring.c
    @@ -1739,8 +1739,12 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td,
    /* handle completion code */
    switch (trb_comp_code) {
    case COMP_SUCCESS:
    - frame->status = 0;
    - break;
    + if (TRB_LEN(le32_to_cpu(event->transfer_len)) == 0) {
    + frame->status = 0;
    + break;
    + }
    + if ((xhci->quirks & XHCI_TRUST_TX_LENGTH))
    + trb_comp_code = COMP_SHORT_TX;
    case COMP_SHORT_TX:
    frame->status = td->urb->transfer_flags & URB_SHORT_NOT_OK ?
    -EREMOTEIO : 0;
    @@ -1756,6 +1760,7 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td,
    break;
    case COMP_DEV_ERR:
    case COMP_STALL:
    + case COMP_TX_ERR:
    frame->status = -EPROTO;
    skip_td = true;
    break;
    @@ -1838,13 +1843,16 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td,
    switch (trb_comp_code) {
    case COMP_SUCCESS:
    /* Double check that the HW transferred everything. */
    - if (event_trb != td->last_trb) {
    + if (event_trb != td->last_trb ||
    + TRB_LEN(le32_to_cpu(event->transfer_len)) != 0) {
    xhci_warn(xhci, "WARN Successful completion "
    "on short TX\n");
    if (td->urb->transfer_flags & URB_SHORT_NOT_OK)
    *status = -EREMOTEIO;
    else
    *status = 0;
    + if ((xhci->quirks & XHCI_TRUST_TX_LENGTH))
    + trb_comp_code = COMP_SHORT_TX;
    } else {
    *status = 0;
    }
    @@ -1985,6 +1993,13 @@ static int handle_tx_event(struct xhci_hcd *xhci,
    * transfer type
    */
    case COMP_SUCCESS:
    + if (TRB_LEN(le32_to_cpu(event->transfer_len)) == 0)
    + break;
    + if (xhci->quirks & XHCI_TRUST_TX_LENGTH)
    + trb_comp_code = COMP_SHORT_TX;
    + else
    + xhci_warn(xhci, "WARN Successful completion on short TX: "
    + "needs XHCI_TRUST_TX_LENGTH quirk?\n");
    case COMP_SHORT_TX:
    break;
    case COMP_STOP:
    diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
    index dfd260a..25c3e26 100644
    --- a/drivers/usb/host/xhci.h
    +++ b/drivers/usb/host/xhci.h
    @@ -1315,6 +1315,7 @@ struct xhci_hcd {
    #define XHCI_BROKEN_MSI (1 << 6)
    #define XHCI_RESET_ON_RESUME (1 << 7)
    #define XHCI_AMD_0x96_HOST (1 << 9)
    +#define XHCI_TRUST_TX_LENGTH (1 << 10)
    unsigned int num_active_eps;
    unsigned int limit_active_eps;
    /* There are two roothubs to keep track of bus suspend info for */
    diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c
    index bb10846..5707f56 100644
    --- a/drivers/usb/misc/usbtest.c
    +++ b/drivers/usb/misc/usbtest.c
    @@ -1023,7 +1023,10 @@ test_ctrl_queue(struct usbtest_dev *dev, struct usbtest_param *param)
    case 13: /* short read, resembling case 10 */
    req.wValue = cpu_to_le16((USB_DT_CONFIG << 8) | 0);
    /* last data packet "should" be DATA1, not DATA0 */
    - len = 1024 - udev->descriptor.bMaxPacketSize0;
    + if (udev->speed == USB_SPEED_SUPER)
    + len = 1024 - 512;
    + else
    + len = 1024 - udev->descriptor.bMaxPacketSize0;
    expected = -EREMOTEIO;
    break;
    case 14: /* short read; try to fill the last packet */
    @@ -1382,11 +1385,15 @@ static int test_halt(struct usbtest_dev *tdev, int ep, struct urb *urb)

    static int halt_simple(struct usbtest_dev *dev)
    {
    - int ep;
    - int retval = 0;
    - struct urb *urb;
    + int ep;
    + int retval = 0;
    + struct urb *urb;
    + struct usb_device *udev = testdev_to_usbdev(dev);

    - urb = simple_alloc_urb(testdev_to_usbdev(dev), 0, 512);
    + if (udev->speed == USB_SPEED_SUPER)
    + urb = simple_alloc_urb(udev, 0, 1024);
    + else
    + urb = simple_alloc_urb(udev, 0, 512);
    if (urb == NULL)
    return -ENOMEM;

    diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
    index 60d7b1eb..f08d494 100644
    --- a/drivers/usb/serial/ftdi_sio.c
    +++ b/drivers/usb/serial/ftdi_sio.c
    @@ -807,6 +807,7 @@ static struct usb_device_id id_table_combined [] = {
    .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
    { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
    + { USB_DEVICE(PI_VID, PI_E861_PID) },
    { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
    { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
    .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
    diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
    index c6dd18e..219b199 100644
    --- a/drivers/usb/serial/ftdi_sio_ids.h
    +++ b/drivers/usb/serial/ftdi_sio_ids.h
    @@ -785,6 +785,14 @@
    #define RTSYSTEMS_SERIAL_VX7_PID 0x9e52 /* Serial converter for VX-7 Radios using FT232RL */
    #define RTSYSTEMS_CT29B_PID 0x9e54 /* CT29B Radio Cable */

    +
    +/*
    + * Physik Instrumente
    + * http://www.physikinstrumente.com/en/products/
    + */
    +#define PI_VID 0x1a72 /* Vendor ID */
    +#define PI_E861_PID 0x1008 /* E-861 piezo controller USB connection */
    +
    /*
    * Bayer Ascensia Contour blood glucose meter USB-converter cable.
    * http://winglucofacts.com/cables/
    diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
    index 21c82b0..2856474 100644
    --- a/drivers/usb/serial/ti_usb_3410_5052.c
    +++ b/drivers/usb/serial/ti_usb_3410_5052.c
    @@ -165,7 +165,7 @@ static unsigned int product_5052_count;
    /* the array dimension is the number of default entries plus */
    /* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */
    /* null entry */
    -static struct usb_device_id ti_id_table_3410[14+TI_EXTRA_VID_PID_COUNT+1] = {
    +static struct usb_device_id ti_id_table_3410[15+TI_EXTRA_VID_PID_COUNT+1] = {
    { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
    { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) },
    @@ -180,6 +180,7 @@ static struct usb_device_id ti_id_table_3410[14+TI_EXTRA_VID_PID_COUNT+1] = {
    { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
    { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
    { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_PRODUCT_ID) },
    + { USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) },
    };

    static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = {
    @@ -189,7 +190,7 @@ static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = {
    { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
    };

    -static struct usb_device_id ti_id_table_combined[18+2*TI_EXTRA_VID_PID_COUNT+1] = {
    +static struct usb_device_id ti_id_table_combined[19+2*TI_EXTRA_VID_PID_COUNT+1] = {
    { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
    { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
    { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) },
    @@ -208,6 +209,7 @@ static struct usb_device_id ti_id_table_combined[18+2*TI_EXTRA_VID_PID_COUNT+1]
    { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
    { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
    { USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_PRODUCT_ID) },
    + { USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) },
    { }
    };

    diff --git a/drivers/usb/serial/ti_usb_3410_5052.h b/drivers/usb/serial/ti_usb_3410_5052.h
    index f140f1b..b353e7e 100644
    --- a/drivers/usb/serial/ti_usb_3410_5052.h
    +++ b/drivers/usb/serial/ti_usb_3410_5052.h
    @@ -37,6 +37,7 @@
    #define TI_5152_BOOT_PRODUCT_ID 0x5152 /* no EEPROM, no firmware */
    #define TI_5052_EEPROM_PRODUCT_ID 0x505A /* EEPROM, no firmware */
    #define TI_5052_FIRMWARE_PRODUCT_ID 0x505F /* firmware is running */
    +#define FRI2_PRODUCT_ID 0x5053 /* Fish River Island II */

    /* Multi-Tech vendor and product ids */
    #define MTS_VENDOR_ID 0x06E0
    diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
    index 24caba7..591f57f 100644
    --- a/drivers/usb/storage/unusual_devs.h
    +++ b/drivers/usb/storage/unusual_devs.h
    @@ -1885,6 +1885,13 @@ UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201,
    USB_SC_DEVICE, USB_PR_DEVICE, NULL,
    US_FL_IGNORE_RESIDUE ),

    +/* Reported by Jesse Feddema <jdfeddema@gmail.com> */
    +UNUSUAL_DEV( 0x177f, 0x0400, 0x0000, 0x0000,
    + "Yarvik",
    + "PMP400",
    + USB_SC_DEVICE, USB_PR_DEVICE, NULL,
    + US_FL_BULK_IGNORE_TAG | US_FL_MAX_SECTORS_64 ),
    +
    /* Reported by Hans de Goede <hdegoede@redhat.com>
    * These Appotech controllers are found in Picture Frames, they provide a
    * (buggy) emulation of a cdrom drive which contains the windows software
    diff --git a/fs/aio.c b/fs/aio.c
    index b4a88cc..278ed7d 100644
    --- a/fs/aio.c
    +++ b/fs/aio.c
    @@ -1395,6 +1395,10 @@ static ssize_t aio_setup_vectored_rw(int type, struct kiocb *kiocb, bool compat)
    if (ret < 0)
    goto out;

    + ret = rw_verify_area(type, kiocb->ki_filp, &kiocb->ki_pos, ret);
    + if (ret < 0)
    + goto out;
    +
    kiocb->ki_nr_segs = kiocb->ki_nbytes;
    kiocb->ki_cur_seg = 0;
    /* ki_nbytes/left now reflect bytes instead of segs */
    @@ -1406,11 +1410,17 @@ out:
    return ret;
    }

    -static ssize_t aio_setup_single_vector(struct kiocb *kiocb)
    +static ssize_t aio_setup_single_vector(int type, struct file * file, struct kiocb *kiocb)
    {
    + int bytes;
    +
    + bytes = rw_verify_area(type, file, &kiocb->ki_pos, kiocb->ki_left);
    + if (bytes < 0)
    + return bytes;
    +
    kiocb->ki_iovec = &kiocb->ki_inline_vec;
    kiocb->ki_iovec->iov_base = kiocb->ki_buf;
    - kiocb->ki_iovec->iov_len = kiocb->ki_left;
    + kiocb->ki_iovec->iov_len = bytes;
    kiocb->ki_nr_segs = 1;
    kiocb->ki_cur_seg = 0;
    return 0;
    @@ -1435,10 +1445,7 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat)
    if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf,
    kiocb->ki_left)))
    break;
    - ret = security_file_permission(file, MAY_READ);
    - if (unlikely(ret))
    - break;
    - ret = aio_setup_single_vector(kiocb);
    + ret = aio_setup_single_vector(READ, file, kiocb);
    if (ret)
    break;
    ret = -EINVAL;
    @@ -1453,10 +1460,7 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat)
    if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf,
    kiocb->ki_left)))
    break;
    - ret = security_file_permission(file, MAY_WRITE);
    - if (unlikely(ret))
    - break;
    - ret = aio_setup_single_vector(kiocb);
    + ret = aio_setup_single_vector(WRITE, file, kiocb);
    if (ret)
    break;
    ret = -EINVAL;
    @@ -1467,9 +1471,6 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat)
    ret = -EBADF;
    if (unlikely(!(file->f_mode & FMODE_READ)))
    break;
    - ret = security_file_permission(file, MAY_READ);
    - if (unlikely(ret))
    - break;
    ret = aio_setup_vectored_rw(READ, kiocb, compat);
    if (ret)
    break;
    @@ -1481,9 +1482,6 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat)
    ret = -EBADF;
    if (unlikely(!(file->f_mode & FMODE_WRITE)))
    break;
    - ret = security_file_permission(file, MAY_WRITE);
    - if (unlikely(ret))
    - break;
    ret = aio_setup_vectored_rw(WRITE, kiocb, compat);
    if (ret)
    break;
    diff --git a/fs/block_dev.c b/fs/block_dev.c
    index 74fc5ed..a580028 100644
    --- a/fs/block_dev.c
    +++ b/fs/block_dev.c
    @@ -64,7 +64,7 @@ static void bdev_inode_switch_bdi(struct inode *inode,
    spin_unlock(&inode_wb_list_lock);
    }

    -static sector_t max_block(struct block_device *bdev)
    +sector_t blkdev_max_block(struct block_device *bdev)
    {
    sector_t retval = ~((sector_t)0);
    loff_t sz = i_size_read(bdev->bd_inode);
    @@ -135,7 +135,7 @@ static int
    blkdev_get_block(struct inode *inode, sector_t iblock,
    struct buffer_head *bh, int create)
    {
    - if (iblock >= max_block(I_BDEV(inode))) {
    + if (iblock >= blkdev_max_block(I_BDEV(inode))) {
    if (create)
    return -EIO;

    @@ -157,7 +157,7 @@ static int
    blkdev_get_blocks(struct inode *inode, sector_t iblock,
    struct buffer_head *bh, int create)
    {
    - sector_t end_block = max_block(I_BDEV(inode));
    + sector_t end_block = blkdev_max_block(I_BDEV(inode));
    unsigned long max_blocks = bh->b_size >> inode->i_blkbits;

    if ((iblock + max_blocks) > end_block) {
    diff --git a/fs/buffer.c b/fs/buffer.c
    index 1a80b04..330cbce 100644
    --- a/fs/buffer.c
    +++ b/fs/buffer.c
    @@ -968,6 +968,7 @@ init_page_buffers(struct page *page, struct block_device *bdev,
    struct buffer_head *head = page_buffers(page);
    struct buffer_head *bh = head;
    int uptodate = PageUptodate(page);
    + sector_t end_block = blkdev_max_block(I_BDEV(bdev->bd_inode));

    do {
    if (!buffer_mapped(bh)) {
    @@ -976,7 +977,8 @@ init_page_buffers(struct page *page, struct block_device *bdev,
    bh->b_blocknr = block;
    if (uptodate)
    set_buffer_uptodate(bh);
    - set_buffer_mapped(bh);
    + if (block < end_block)
    + set_buffer_mapped(bh);
    }
    block++;
    bh = bh->b_this_page;
    diff --git a/include/linux/fs.h b/include/linux/fs.h
    index d8ecb01..96b1035 100644
    --- a/include/linux/fs.h
    +++ b/include/linux/fs.h
    @@ -2029,6 +2029,7 @@ extern void unregister_blkdev(unsigned int, const char *);
    extern struct block_device *bdget(dev_t);
    extern struct block_device *bdgrab(struct block_device *bdev);
    extern void bd_set_size(struct block_device *, loff_t size);
    +extern sector_t blkdev_max_block(struct block_device *bdev);
    extern void bd_forget(struct inode *inode);
    extern void bdput(struct block_device *);
    extern void invalidate_bdev(struct block_device *);
    diff --git a/include/linux/genhd.h b/include/linux/genhd.h
    index 6f43b14..7a1ce18 100644
    --- a/include/linux/genhd.h
    +++ b/include/linux/genhd.h
    @@ -221,12 +221,6 @@ static inline void part_pack_uuid(const u8 *uuid_str, u8 *to)
    }
    }

    -static inline char *part_unpack_uuid(const u8 *uuid, char *out)
    -{
    - sprintf(out, "%pU", uuid);
    - return out;
    -}
    -
    static inline int disk_max_parts(struct gendisk *disk)
    {
    if (disk->flags & GENHD_FL_EXT_DEVT)
    diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
    index 1ee4424..f8d1e74 100644
    --- a/include/linux/mmc/host.h
    +++ b/include/linux/mmc/host.h
    @@ -267,6 +267,7 @@ struct mmc_host {

    unsigned int sdio_irqs;
    struct task_struct *sdio_irq_thread;
    + bool sdio_irq_pending;
    atomic_t sdio_irq_thread_abort;

    mmc_pm_flag_t pm_flags; /* requested pm features */
    @@ -312,6 +313,7 @@ extern void mmc_request_done(struct mmc_host *, struct mmc_request *);
    static inline void mmc_signal_sdio_irq(struct mmc_host *host)
    {
    host->ops->enable_sdio_irq(host, 0);
    + host->sdio_irq_pending = true;
    wake_up_process(host->sdio_irq_thread);
    }

    diff --git a/init/main.c b/init/main.c
    index d7211fa..841e344 100644
    --- a/init/main.c
    +++ b/init/main.c
    @@ -549,9 +549,6 @@ asmlinkage void __init start_kernel(void)
    early_boot_irqs_disabled = false;
    local_irq_enable();

    - /* Interrupts are enabled now so all GFP allocations are safe. */
    - gfp_allowed_mask = __GFP_BITS_MASK;
    -
    kmem_cache_init_late();

    /*
    @@ -783,6 +780,10 @@ static int __init kernel_init(void * unused)
    * Wait until kthreadd is all set-up.
    */
    wait_for_completion(&kthreadd_done);
    +
    + /* Now the scheduler is fully set up and can do blocking allocations */
    + gfp_allowed_mask = __GFP_BITS_MASK;
    +
    /*
    * init can allocate pages on any node
    */
    diff --git a/kernel/workqueue.c b/kernel/workqueue.c
    index 1456dab..ee1845b 100644
    --- a/kernel/workqueue.c
    +++ b/kernel/workqueue.c
    @@ -1214,8 +1214,13 @@ static void worker_enter_idle(struct worker *worker)
    } else
    wake_up_all(&gcwq->trustee_wait);

    - /* sanity check nr_running */
    - WARN_ON_ONCE(gcwq->nr_workers == gcwq->nr_idle &&
    + /*
    + * Sanity check nr_running. Because trustee releases gcwq->lock
    + * between setting %WORKER_ROGUE and zapping nr_running, the
    + * warning may trigger spuriously. Check iff trustee is idle.
    + */
    + WARN_ON_ONCE(gcwq->trustee_state == TRUSTEE_DONE &&
    + gcwq->nr_workers == gcwq->nr_idle &&
    atomic_read(get_gcwq_nr_running(gcwq->cpu)));
    }

    diff --git a/mm/mempolicy.c b/mm/mempolicy.c
    index a85171d..3dac2d1 100644
    --- a/mm/mempolicy.c
    +++ b/mm/mempolicy.c
    @@ -606,27 +606,6 @@ check_range(struct mm_struct *mm, unsigned long start, unsigned long end,
    return first;
    }

    -/* Apply policy to a single VMA */
    -static int policy_vma(struct vm_area_struct *vma, struct mempolicy *new)
    -{
    - int err = 0;
    - struct mempolicy *old = vma->vm_policy;
    -
    - pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
    - vma->vm_start, vma->vm_end, vma->vm_pgoff,
    - vma->vm_ops, vma->vm_file,
    - vma->vm_ops ? vma->vm_ops->set_policy : NULL);
    -
    - if (vma->vm_ops && vma->vm_ops->set_policy)
    - err = vma->vm_ops->set_policy(vma, new);
    - if (!err) {
    - mpol_get(new);
    - vma->vm_policy = new;
    - mpol_put(old);
    - }
    - return err;
    -}
    -
    /* Step 2: apply policy to a range and do splits. */
    static int mbind_range(struct mm_struct *mm, unsigned long start,
    unsigned long end, struct mempolicy *new_pol)
    @@ -666,9 +645,23 @@ static int mbind_range(struct mm_struct *mm, unsigned long start,
    if (err)
    goto out;
    }
    - err = policy_vma(vma, new_pol);
    - if (err)
    - goto out;
    +
    + /*
    + * Apply policy to a single VMA. The reference counting of
    + * policy for vma_policy linkages has already been handled by
    + * vma_merge and split_vma as necessary. If this is a shared
    + * policy then ->set_policy will increment the reference count
    + * for an sp node.
    + */
    + pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
    + vma->vm_start, vma->vm_end, vma->vm_pgoff,
    + vma->vm_ops, vma->vm_file,
    + vma->vm_ops ? vma->vm_ops->set_policy : NULL);
    + if (vma->vm_ops && vma->vm_ops->set_policy) {
    + err = vma->vm_ops->set_policy(vma, new_pol);
    + if (err)
    + goto out;
    + }
    }

    out:
    diff --git a/net/wireless/reg.c b/net/wireless/reg.c
    index ca76d8b..7457697 100644
    --- a/net/wireless/reg.c
    +++ b/net/wireless/reg.c
    @@ -379,7 +379,15 @@ static void reg_regdb_query(const char *alpha2)

    schedule_work(&reg_regdb_work);
    }
    +
    +/* Feel free to add any other sanity checks here */
    +static void reg_regdb_size_check(void)
    +{
    + /* We should ideally BUILD_BUG_ON() but then random builds would fail */
    + WARN_ONCE(!reg_regdb_size, "db.txt is empty, you should update it...");
    +}
    #else
    +static inline void reg_regdb_size_check(void) {}
    static inline void reg_regdb_query(const char *alpha2) {}
    #endif /* CONFIG_CFG80211_INTERNAL_REGDB */

    @@ -2225,6 +2233,8 @@ int __init regulatory_init(void)
    spin_lock_init(&reg_requests_lock);
    spin_lock_init(&reg_pending_beacons_lock);

    + reg_regdb_size_check();
    +
    cfg80211_regdomain = cfg80211_world_regdom;

    user_alpha2[0] = '9';
    diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
    index 3545934..27a9673 100644
    --- a/security/selinux/selinuxfs.c
    +++ b/security/selinux/selinuxfs.c
    @@ -1241,6 +1241,7 @@ static int sel_make_bools(void)
    kfree(bool_pending_names[i]);
    kfree(bool_pending_names);
    kfree(bool_pending_values);
    + bool_num = 0;
    bool_pending_names = NULL;
    bool_pending_values = NULL;

    diff --git a/tools/usb/ffs-test.c b/tools/usb/ffs-test.c
    index b9c7986..f17dfee 100644
    --- a/tools/usb/ffs-test.c
    +++ b/tools/usb/ffs-test.c
    @@ -324,7 +324,7 @@ static void *start_thread_helper(void *arg)

    ret = t->in(t, t->buf, t->buf_size);
    if (ret > 0) {
    - ret = t->out(t, t->buf, t->buf_size);
    + ret = t->out(t, t->buf, ret);
    name = out_name;
    op = "write";
    } else {

    \
     
     \ /
      Last update: 2012-06-04 21:42    [W:0.150 / U:2.264 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site