From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <gentoo-commits+bounces-877400-garchives=archives.gentoo.org@lists.gentoo.org> Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id EF6FD59CB4 for <garchives@archives.gentoo.org>; Wed, 20 Apr 2016 11:23:44 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 50DF521C056; Wed, 20 Apr 2016 11:23:44 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 9171C21C056 for <gentoo-commits@lists.gentoo.org>; Wed, 20 Apr 2016 11:23:43 +0000 (UTC) Received: from oystercatcher.gentoo.org (unknown [IPv6:2a01:4f8:202:4333:225:90ff:fed9:fc84]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 33248340BBF for <gentoo-commits@lists.gentoo.org>; Wed, 20 Apr 2016 11:23:42 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id CE0A8188 for <gentoo-commits@lists.gentoo.org>; Wed, 20 Apr 2016 11:23:38 +0000 (UTC) From: "Mike Pagano" <mpagano@gentoo.org> To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Mike Pagano" <mpagano@gentoo.org> Message-ID: <1461151416.c93f1513f37f80b6e6b333f00fae5bc62bbd4743.mpagano@gentoo> Subject: [gentoo-commits] proj/linux-patches:4.1 commit in: / X-VCS-Repository: proj/linux-patches X-VCS-Files: 0000_README 1021_linux-4.1.22.patch X-VCS-Directories: / X-VCS-Committer: mpagano X-VCS-Committer-Name: Mike Pagano X-VCS-Revision: c93f1513f37f80b6e6b333f00fae5bc62bbd4743 X-VCS-Branch: 4.1 Date: Wed, 20 Apr 2016 11:23:38 +0000 (UTC) Precedence: bulk List-Post: <mailto:gentoo-commits@lists.gentoo.org> List-Help: <mailto:gentoo-commits+help@lists.gentoo.org> List-Unsubscribe: <mailto:gentoo-commits+unsubscribe@lists.gentoo.org> List-Subscribe: <mailto:gentoo-commits+subscribe@lists.gentoo.org> List-Id: Gentoo Linux mail <gentoo-commits.gentoo.org> X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: a6d12065-46da-472f-80c4-1638ced4767f X-Archives-Hash: 5ab7410a20447ffe266ac039181eddf3 commit: c93f1513f37f80b6e6b333f00fae5bc62bbd4743 Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> AuthorDate: Wed Apr 20 11:23:36 2016 +0000 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> CommitDate: Wed Apr 20 11:23:36 2016 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=c93f1513 Linux patch 4.1.22 0000_README | 4 + 1021_linux-4.1.22.patch | 9212 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 9216 insertions(+) diff --git a/0000_README b/0000_README index cb424ff..3075177 100644 --- a/0000_README +++ b/0000_README @@ -127,6 +127,10 @@ Patch: 1020_linux-4.1.21.patch From: http://www.kernel.org Desc: Linux 4.1.21 +Patch: 1021_linux-4.1.22.patch +From: http://www.kernel.org +Desc: Linux 4.1.22 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1021_linux-4.1.22.patch b/1021_linux-4.1.22.patch new file mode 100644 index 0000000..8c18119 --- /dev/null +++ b/1021_linux-4.1.22.patch @@ -0,0 +1,9212 @@ +diff --git a/Documentation/filesystems/efivarfs.txt b/Documentation/filesystems/efivarfs.txt +index c477af086e65..686a64bba775 100644 +--- a/Documentation/filesystems/efivarfs.txt ++++ b/Documentation/filesystems/efivarfs.txt +@@ -14,3 +14,10 @@ filesystem. + efivarfs is typically mounted like this, + + mount -t efivarfs none /sys/firmware/efi/efivars ++ ++Due to the presence of numerous firmware bugs where removing non-standard ++UEFI variables causes the system firmware to fail to POST, efivarfs ++files that are not well-known standardized variables are created ++as immutable files. This doesn't prevent removal - "chattr -i" will work - ++but it does prevent this kind of failure from being accomplished ++accidentally. +diff --git a/MAINTAINERS b/MAINTAINERS +index d8afd2953678..0b51c8a3c627 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -9533,9 +9533,11 @@ S: Maintained + F: drivers/net/ethernet/dlink/sundance.c + + SUPERH ++M: Yoshinori Sato <ysato@users.sourceforge.jp> ++M: Rich Felker <dalias@libc.org> + L: linux-sh@vger.kernel.org + Q: http://patchwork.kernel.org/project/linux-sh/list/ +-S: Orphan ++S: Maintained + F: Documentation/sh/ + F: arch/sh/ + F: drivers/sh/ +diff --git a/Makefile b/Makefile +index 79fab0d55218..7f4a4039fdd9 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 4 + PATCHLEVEL = 1 +-SUBLEVEL = 21 ++SUBLEVEL = 22 + EXTRAVERSION = + NAME = Series 4800 + +diff --git a/arch/arm/boot/dts/armada-375.dtsi b/arch/arm/boot/dts/armada-375.dtsi +index f076ff856d8b..07f61bb1697a 100644 +--- a/arch/arm/boot/dts/armada-375.dtsi ++++ b/arch/arm/boot/dts/armada-375.dtsi +@@ -508,7 +508,7 @@ + }; + + sata@a0000 { +- compatible = "marvell,orion-sata"; ++ compatible = "marvell,armada-370-sata"; + reg = <0xa0000 0x5000>; + interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&gateclk 14>, <&gateclk 20>; +diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h +index c25ef3ec6d1f..e3789fb02c9c 100644 +--- a/arch/arm/include/asm/psci.h ++++ b/arch/arm/include/asm/psci.h +@@ -37,7 +37,7 @@ struct psci_operations { + extern struct psci_operations psci_ops; + extern struct smp_operations psci_smp_ops; + +-#ifdef CONFIG_ARM_PSCI ++#if defined(CONFIG_SMP) && defined(CONFIG_ARM_PSCI) + int psci_init(void); + bool psci_smp_available(void); + #else +diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S +index 8e2a7acb823b..1b9f0520dea9 100644 +--- a/arch/arm/mach-omap2/sleep34xx.S ++++ b/arch/arm/mach-omap2/sleep34xx.S +@@ -436,12 +436,14 @@ skipl2dis: + and r1, #0x700 + cmp r1, #0x300 + beq l2_inv_gp ++ adr r0, l2_inv_api_params_offset ++ ldr r3, [r0] ++ add r3, r3, r0 @ r3 points to dummy parameters + mov r0, #40 @ set service ID for PPA + mov r12, r0 @ copy secure Service ID in r12 + mov r1, #0 @ set task id for ROM code in r1 + mov r2, #4 @ set some flags in r2, r6 + mov r6, #0xff +- adr r3, l2_inv_api_params @ r3 points to dummy parameters + dsb @ data write barrier + dmb @ data memory barrier + smc #1 @ call SMI monitor (smi #1) +@@ -475,8 +477,8 @@ skipl2dis: + b logic_l1_restore + + .align +-l2_inv_api_params: +- .word 0x1, 0x00 ++l2_inv_api_params_offset: ++ .long l2_inv_api_params - . + l2_inv_gp: + /* Execute smi to invalidate L2 cache */ + mov r12, #0x1 @ set up to invalidate L2 +@@ -531,6 +533,10 @@ l2dis_3630_offset: + l2dis_3630: + .word 0 + ++ .data ++l2_inv_api_params: ++ .word 0x1, 0x00 ++ + /* + * Internal functions + */ +diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile +index 3258174e6152..f462e6e4ce07 100644 +--- a/arch/arm64/Makefile ++++ b/arch/arm64/Makefile +@@ -18,6 +18,8 @@ GZFLAGS :=-9 + KBUILD_DEFCONFIG := defconfig + + KBUILD_CFLAGS += -mgeneral-regs-only ++KBUILD_CFLAGS += $(call cc-option, -mpc-relative-literal-loads) ++ + ifeq ($(CONFIG_CPU_BIG_ENDIAN), y) + KBUILD_CPPFLAGS += -mbig-endian + AS += -EB +diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h +index cf7319422768..526a9cb218d3 100644 +--- a/arch/arm64/include/asm/pgtable.h ++++ b/arch/arm64/include/asm/pgtable.h +@@ -33,7 +33,7 @@ + /* + * VMALLOC and SPARSEMEM_VMEMMAP ranges. + * +- * VMEMAP_SIZE: allows the whole VA space to be covered by a struct page array ++ * VMEMAP_SIZE: allows the whole linear region to be covered by a struct page array + * (rounded up to PUD_SIZE). + * VMALLOC_START: beginning of the kernel VA space + * VMALLOC_END: extends to the available space below vmmemmap, PCI I/O space, +@@ -43,7 +43,9 @@ + #define VMALLOC_START (UL(0xffffffffffffffff) << VA_BITS) + #define VMALLOC_END (PAGE_OFFSET - PUD_SIZE - VMEMMAP_SIZE - SZ_64K) + +-#define vmemmap ((struct page *)(VMALLOC_END + SZ_64K)) ++#define VMEMMAP_START (VMALLOC_END + SZ_64K) ++#define vmemmap ((struct page *)VMEMMAP_START - \ ++ SECTION_ALIGN_DOWN(memstart_addr >> PAGE_SHIFT)) + + #define FIRST_USER_ADDRESS 0UL + +diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c +index ad87ce826cce..ae8f940152aa 100644 +--- a/arch/arm64/mm/init.c ++++ b/arch/arm64/mm/init.c +@@ -312,8 +312,8 @@ void __init mem_init(void) + " .data : 0x%p" " - 0x%p" " (%6ld KB)\n", + MLG(VMALLOC_START, VMALLOC_END), + #ifdef CONFIG_SPARSEMEM_VMEMMAP +- MLG((unsigned long)vmemmap, +- (unsigned long)vmemmap + VMEMMAP_SIZE), ++ MLG(VMEMMAP_START, ++ VMEMMAP_START + VMEMMAP_SIZE), + MLM((unsigned long)virt_to_page(PAGE_OFFSET), + (unsigned long)virt_to_page(high_memory)), + #endif +diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c +index 1d8b147282cf..bbf777c04cbf 100644 +--- a/arch/avr32/mach-at32ap/at32ap700x.c ++++ b/arch/avr32/mach-at32ap/at32ap700x.c +@@ -1328,6 +1328,21 @@ static struct clk atmel_mci0_pclk = { + .index = 9, + }; + ++static bool at32_mci_dma_filter(struct dma_chan *chan, void *pdata) ++{ ++ struct mci_dma_data *sl = pdata; ++ ++ if (!sl) ++ return false; ++ ++ if (find_slave_dev(sl) == chan->device->dev) { ++ chan->private = slave_data_ptr(sl); ++ return true; ++ } ++ ++ return false; ++} ++ + struct platform_device *__init + at32_add_device_mci(unsigned int id, struct mci_platform_data *data) + { +@@ -1362,6 +1377,7 @@ at32_add_device_mci(unsigned int id, struct mci_platform_data *data) + slave->sdata.dst_master = 0; + + data->dma_slave = slave; ++ data->dma_filter = at32_mci_dma_filter; + + if (platform_device_add_data(pdev, data, + sizeof(struct mci_platform_data))) +diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c +index d0744cc77ea7..3cef551908f4 100644 +--- a/arch/mips/kernel/smp.c ++++ b/arch/mips/kernel/smp.c +@@ -120,6 +120,7 @@ static inline void calculate_cpu_foreign_map(void) + cpumask_t temp_foreign_map; + + /* Re-calculate the mask */ ++ cpumask_clear(&temp_foreign_map); + for_each_online_cpu(i) { + core_present = 0; + for_each_cpu(k, &temp_foreign_map) +diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c +index 59663af9315f..e4f7d4eed20c 100644 +--- a/arch/powerpc/kernel/module_64.c ++++ b/arch/powerpc/kernel/module_64.c +@@ -335,7 +335,7 @@ static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab) + if (syms[i].st_shndx == SHN_UNDEF) { + char *name = strtab + syms[i].st_name; + if (name[0] == '.') +- memmove(name, name+1, strlen(name)); ++ syms[i].st_name++; + } + } + } +diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h +index a648338c434a..4e33fe339b3d 100644 +--- a/arch/s390/include/asm/pci.h ++++ b/arch/s390/include/asm/pci.h +@@ -45,7 +45,7 @@ struct zpci_fmb { + u64 rpcit_ops; + u64 dma_rbytes; + u64 dma_wbytes; +-} __packed __aligned(16); ++} __packed __aligned(64); + + enum zpci_state { + ZPCI_FN_STATE_RESERVED, +diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c +index 598f023cf8a6..50a79a5fc116 100644 +--- a/arch/s390/pci/pci.c ++++ b/arch/s390/pci/pci.c +@@ -871,8 +871,11 @@ static inline int barsize(u8 size) + + static int zpci_mem_init(void) + { ++ BUILD_BUG_ON(!is_power_of_2(__alignof__(struct zpci_fmb)) || ++ __alignof__(struct zpci_fmb) < sizeof(struct zpci_fmb)); ++ + zdev_fmb_cache = kmem_cache_create("PCI_FMB_cache", sizeof(struct zpci_fmb), +- 16, 0, NULL); ++ __alignof__(struct zpci_fmb), 0, NULL); + if (!zdev_fmb_cache) + goto error_zdev; + +diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c +index 29880c9b324e..e22e57298522 100644 +--- a/arch/um/drivers/mconsole_kern.c ++++ b/arch/um/drivers/mconsole_kern.c +@@ -133,7 +133,7 @@ void mconsole_proc(struct mc_request *req) + ptr += strlen("proc"); + ptr = skip_spaces(ptr); + +- file = file_open_root(mnt->mnt_root, mnt, ptr, O_RDONLY); ++ file = file_open_root(mnt->mnt_root, mnt, ptr, O_RDONLY, 0); + if (IS_ERR(file)) { + mconsole_reply(req, "Failed to open file", 1, 0); + printk(KERN_ERR "open /proc/%s: %ld\n", ptr, PTR_ERR(file)); +diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S +index 72bf2680f819..27e54946ef35 100644 +--- a/arch/x86/ia32/ia32entry.S ++++ b/arch/x86/ia32/ia32entry.S +@@ -511,6 +511,7 @@ ENTRY(ia32_syscall) + * it is too small to ever cause noticeable irq latency. + */ + PARAVIRT_ADJUST_EXCEPTION_FRAME ++ ASM_CLAC /* Do this early to minimize exposure */ + SWAPGS + ENABLE_INTERRUPTS(CLBR_NONE) + +diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h +index 976b86a325e5..a197e15a0e49 100644 +--- a/arch/x86/include/asm/apic.h ++++ b/arch/x86/include/asm/apic.h +@@ -640,8 +640,8 @@ static inline void entering_irq(void) + + static inline void entering_ack_irq(void) + { +- ack_APIC_irq(); + entering_irq(); ++ ack_APIC_irq(); + } + + static inline void exiting_irq(void) +diff --git a/arch/x86/include/asm/perf_event.h b/arch/x86/include/asm/perf_event.h +index dc0f6ed35b08..5a2ed3ed2f26 100644 +--- a/arch/x86/include/asm/perf_event.h ++++ b/arch/x86/include/asm/perf_event.h +@@ -159,6 +159,14 @@ struct x86_pmu_capability { + */ + #define INTEL_PMC_IDX_FIXED_BTS (INTEL_PMC_IDX_FIXED + 16) + ++#define GLOBAL_STATUS_COND_CHG BIT_ULL(63) ++#define GLOBAL_STATUS_BUFFER_OVF BIT_ULL(62) ++#define GLOBAL_STATUS_UNC_OVF BIT_ULL(61) ++#define GLOBAL_STATUS_ASIF BIT_ULL(60) ++#define GLOBAL_STATUS_COUNTERS_FROZEN BIT_ULL(59) ++#define GLOBAL_STATUS_LBRS_FROZEN BIT_ULL(58) ++#define GLOBAL_STATUS_TRACE_TOPAPMI BIT_ULL(55) ++ + /* + * IBS cpuid feature detection + */ +diff --git a/arch/x86/include/asm/xen/hypervisor.h b/arch/x86/include/asm/xen/hypervisor.h +index d866959e5685..d2ad00a42234 100644 +--- a/arch/x86/include/asm/xen/hypervisor.h ++++ b/arch/x86/include/asm/xen/hypervisor.h +@@ -57,4 +57,6 @@ static inline bool xen_x2apic_para_available(void) + } + #endif + ++extern void xen_set_iopl_mask(unsigned mask); ++ + #endif /* _ASM_X86_XEN_HYPERVISOR_H */ +diff --git a/arch/x86/include/uapi/asm/msr-index.h b/arch/x86/include/uapi/asm/msr-index.h +index 3c6bb342a48f..06b407f79b24 100644 +--- a/arch/x86/include/uapi/asm/msr-index.h ++++ b/arch/x86/include/uapi/asm/msr-index.h +@@ -72,6 +72,12 @@ + #define MSR_LBR_CORE_FROM 0x00000040 + #define MSR_LBR_CORE_TO 0x00000060 + ++#define MSR_LBR_INFO_0 0x00000dc0 /* ... 0xddf for _31 */ ++#define LBR_INFO_MISPRED BIT_ULL(63) ++#define LBR_INFO_IN_TX BIT_ULL(62) ++#define LBR_INFO_ABORT BIT_ULL(61) ++#define LBR_INFO_CYCLES 0xffff ++ + #define MSR_IA32_PEBS_ENABLE 0x000003f1 + #define MSR_IA32_DS_AREA 0x00000600 + #define MSR_IA32_PERF_CAPABILITIES 0x00000345 +diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c +index 37dae792dbbe..589b3193f102 100644 +--- a/arch/x86/kernel/ioport.c ++++ b/arch/x86/kernel/ioport.c +@@ -96,9 +96,14 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on) + SYSCALL_DEFINE1(iopl, unsigned int, level) + { + struct pt_regs *regs = current_pt_regs(); +- unsigned int old = (regs->flags >> 12) & 3; + struct thread_struct *t = ¤t->thread; + ++ /* ++ * Careful: the IOPL bits in regs->flags are undefined under Xen PV ++ * and changing them has no effect. ++ */ ++ unsigned int old = t->iopl >> X86_EFLAGS_IOPL_BIT; ++ + if (level > 3) + return -EINVAL; + /* Trying to gain more privileges? */ +@@ -106,8 +111,9 @@ SYSCALL_DEFINE1(iopl, unsigned int, level) + if (!capable(CAP_SYS_RAWIO)) + return -EPERM; + } +- regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12); +- t->iopl = level << 12; ++ regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | ++ (level << X86_EFLAGS_IOPL_BIT); ++ t->iopl = level << X86_EFLAGS_IOPL_BIT; + set_iopl_mask(t->iopl); + + return 0; +diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c +index 58e02d938218..f7724a1d7de1 100644 +--- a/arch/x86/kernel/process_64.c ++++ b/arch/x86/kernel/process_64.c +@@ -49,6 +49,7 @@ + #include <asm/syscalls.h> + #include <asm/debugreg.h> + #include <asm/switch_to.h> ++#include <asm/xen/hypervisor.h> + + asmlinkage extern void ret_from_fork(void); + +@@ -419,6 +420,17 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) + task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV)) + __switch_to_xtra(prev_p, next_p, tss); + ++#ifdef CONFIG_XEN ++ /* ++ * On Xen PV, IOPL bits in pt_regs->flags have no effect, and ++ * current_pt_regs()->flags may not match the current task's ++ * intended IOPL. We need to switch it manually. ++ */ ++ if (unlikely(xen_pv_domain() && ++ prev->iopl != next->iopl)) ++ xen_set_iopl_mask(next->iopl); ++#endif ++ + if (static_cpu_has_bug(X86_BUG_SYSRET_SS_ATTRS)) { + /* + * AMD CPUs have a misfeature: SYSRET sets the SS selector but +diff --git a/arch/x86/kvm/i8254.c b/arch/x86/kvm/i8254.c +index f90952f64e79..e6a4c57100ea 100644 +--- a/arch/x86/kvm/i8254.c ++++ b/arch/x86/kvm/i8254.c +@@ -244,7 +244,7 @@ static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian) + * PIC is being reset. Handle it gracefully here + */ + atomic_inc(&ps->pending); +- else if (value > 0) ++ else if (value > 0 && ps->reinject) + /* in this case, we had multiple outstanding pit interrupts + * that we needed to inject. Reinject + */ +@@ -287,7 +287,9 @@ static void pit_do_work(struct kthread_work *work) + * last one has been acked. + */ + spin_lock(&ps->inject_lock); +- if (ps->irq_ack) { ++ if (!ps->reinject) ++ inject = 1; ++ else if (ps->irq_ack) { + ps->irq_ack = 0; + inject = 1; + } +@@ -316,10 +318,10 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer *data) + struct kvm_kpit_state *ps = container_of(data, struct kvm_kpit_state, timer); + struct kvm_pit *pt = ps->kvm->arch.vpit; + +- if (ps->reinject || !atomic_read(&ps->pending)) { ++ if (ps->reinject) + atomic_inc(&ps->pending); +- queue_kthread_work(&pt->worker, &pt->expired); +- } ++ ++ queue_kthread_work(&pt->worker, &pt->expired); + + if (ps->is_periodic) { + hrtimer_add_expires_ns(&ps->timer, ps->period); +diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c +index 917148620f49..1274fac7c28f 100644 +--- a/arch/x86/kvm/vmx.c ++++ b/arch/x86/kvm/vmx.c +@@ -7210,6 +7210,7 @@ static int handle_invept(struct kvm_vcpu *vcpu) + if (!(types & (1UL << type))) { + nested_vmx_failValid(vcpu, + VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID); ++ skip_emulated_instruction(vcpu); + return 1; + } + +diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c +index 41a3fb4ed346..c228d8da1f8c 100644 +--- a/arch/x86/kvm/x86.c ++++ b/arch/x86/kvm/x86.c +@@ -3732,13 +3732,13 @@ static int kvm_vm_ioctl_get_pit(struct kvm *kvm, struct kvm_pit_state *ps) + + static int kvm_vm_ioctl_set_pit(struct kvm *kvm, struct kvm_pit_state *ps) + { +- int r = 0; +- ++ int i; + mutex_lock(&kvm->arch.vpit->pit_state.lock); + memcpy(&kvm->arch.vpit->pit_state, ps, sizeof(struct kvm_pit_state)); +- kvm_pit_load_count(kvm, 0, ps->channels[0].count, 0); ++ for (i = 0; i < 3; i++) ++ kvm_pit_load_count(kvm, i, ps->channels[i].count, 0); + mutex_unlock(&kvm->arch.vpit->pit_state.lock); +- return r; ++ return 0; + } + + static int kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) +@@ -3757,6 +3757,7 @@ static int kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) + static int kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) + { + int r = 0, start = 0; ++ int i; + u32 prev_legacy, cur_legacy; + mutex_lock(&kvm->arch.vpit->pit_state.lock); + prev_legacy = kvm->arch.vpit->pit_state.flags & KVM_PIT_FLAGS_HPET_LEGACY; +@@ -3766,7 +3767,8 @@ static int kvm_vm_ioctl_set_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) + memcpy(&kvm->arch.vpit->pit_state.channels, &ps->channels, + sizeof(kvm->arch.vpit->pit_state.channels)); + kvm->arch.vpit->pit_state.flags = ps->flags; +- kvm_pit_load_count(kvm, 0, kvm->arch.vpit->pit_state.channels[0].count, start); ++ for (i = 0; i < 3; i++) ++ kvm_pit_load_count(kvm, i, kvm->arch.vpit->pit_state.channels[i].count, start); + mutex_unlock(&kvm->arch.vpit->pit_state.lock); + return r; + } +diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c +index 9a2b7101ae8a..f16af96c60a2 100644 +--- a/arch/x86/pci/fixup.c ++++ b/arch/x86/pci/fixup.c +@@ -553,3 +553,10 @@ static void twinhead_reserve_killing_zone(struct pci_dev *dev) + } + } + DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x27B9, twinhead_reserve_killing_zone); ++ ++static void pci_bdwep_bar(struct pci_dev *dev) ++{ ++ dev->non_compliant_bars = 1; ++} ++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fa0, pci_bdwep_bar); ++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x6fc0, pci_bdwep_bar); +diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c +index a10ed8915bf4..1ecae556d4ed 100644 +--- a/arch/x86/xen/enlighten.c ++++ b/arch/x86/xen/enlighten.c +@@ -959,7 +959,7 @@ static void xen_load_sp0(struct tss_struct *tss, + tss->x86_tss.sp0 = thread->sp0; + } + +-static void xen_set_iopl_mask(unsigned mask) ++void xen_set_iopl_mask(unsigned mask) + { + struct physdev_set_iopl set_iopl; + +diff --git a/arch/xtensa/kernel/head.S b/arch/xtensa/kernel/head.S +index 15a461e2a0ed..80eb62f853a7 100644 +--- a/arch/xtensa/kernel/head.S ++++ b/arch/xtensa/kernel/head.S +@@ -128,7 +128,7 @@ ENTRY(_startup) + wsr a0, icountlevel + + .set _index, 0 +- .rept XCHAL_NUM_DBREAK - 1 ++ .rept XCHAL_NUM_DBREAK + wsr a0, SREG_DBREAKC + _index + .set _index, _index + 1 + .endr +diff --git a/arch/xtensa/mm/cache.c b/arch/xtensa/mm/cache.c +index d75aa1476da7..1a804a2f9a5b 100644 +--- a/arch/xtensa/mm/cache.c ++++ b/arch/xtensa/mm/cache.c +@@ -97,11 +97,11 @@ void clear_user_highpage(struct page *page, unsigned long vaddr) + unsigned long paddr; + void *kvaddr = coherent_kvaddr(page, TLBTEMP_BASE_1, vaddr, &paddr); + +- pagefault_disable(); ++ preempt_disable(); + kmap_invalidate_coherent(page, vaddr); + set_bit(PG_arch_1, &page->flags); + clear_page_alias(kvaddr, paddr); +- pagefault_enable(); ++ preempt_enable(); + } + + void copy_user_highpage(struct page *dst, struct page *src, +@@ -113,11 +113,11 @@ void copy_user_highpage(struct page *dst, struct page *src, + void *src_vaddr = coherent_kvaddr(src, TLBTEMP_BASE_2, vaddr, + &src_paddr); + +- pagefault_disable(); ++ preempt_disable(); + kmap_invalidate_coherent(dst, vaddr); + set_bit(PG_arch_1, &dst->flags); + copy_page_alias(dst_vaddr, src_vaddr, dst_paddr, src_paddr); +- pagefault_enable(); ++ preempt_enable(); + } + + #endif /* DCACHE_WAY_SIZE > PAGE_SIZE */ +diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c +index 70cb408bc20d..92d785fefb6d 100644 +--- a/arch/xtensa/platforms/iss/console.c ++++ b/arch/xtensa/platforms/iss/console.c +@@ -100,21 +100,23 @@ static void rs_poll(unsigned long priv) + { + struct tty_port *port = (struct tty_port *)priv; + int i = 0; ++ int rd = 1; + unsigned char c; + + spin_lock(&timer_lock); + + while (simc_poll(0)) { +- simc_read(0, &c, 1); ++ rd = simc_read(0, &c, 1); ++ if (rd <= 0) ++ break; + tty_insert_flip_char(port, c, TTY_NORMAL); + i++; + } + + if (i) + tty_flip_buffer_push(port); +- +- +- mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); ++ if (rd) ++ mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); + spin_unlock(&timer_lock); + } + +diff --git a/block/blk-core.c b/block/blk-core.c +index 03b5f8d77f37..7f29dc0237d1 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -2067,7 +2067,7 @@ int blk_insert_cloned_request(struct request_queue *q, struct request *rq) + if (q->mq_ops) { + if (blk_queue_io_stat(q)) + blk_account_io_start(rq, true); +- blk_mq_insert_request(rq, false, true, true); ++ blk_mq_insert_request(rq, false, true, false); + return 0; + } + +diff --git a/crypto/asymmetric_keys/Makefile b/crypto/asymmetric_keys/Makefile +index e47fcd9ac5e8..cd1406f9b14a 100644 +--- a/crypto/asymmetric_keys/Makefile ++++ b/crypto/asymmetric_keys/Makefile +@@ -15,15 +15,21 @@ obj-$(CONFIG_PUBLIC_KEY_ALGO_RSA) += rsa.o + obj-$(CONFIG_X509_CERTIFICATE_PARSER) += x509_key_parser.o + x509_key_parser-y := \ + x509-asn1.o \ ++ x509_akid-asn1.o \ + x509_rsakey-asn1.o \ + x509_cert_parser.o \ + x509_public_key.o + +-$(obj)/x509_cert_parser.o: $(obj)/x509-asn1.h $(obj)/x509_rsakey-asn1.h ++$(obj)/x509_cert_parser.o: \ ++ $(obj)/x509-asn1.h \ ++ $(obj)/x509_akid-asn1.h \ ++ $(obj)/x509_rsakey-asn1.h + $(obj)/x509-asn1.o: $(obj)/x509-asn1.c $(obj)/x509-asn1.h ++$(obj)/x509_akid-asn1.o: $(obj)/x509_akid-asn1.c $(obj)/x509_akid-asn1.h + $(obj)/x509_rsakey-asn1.o: $(obj)/x509_rsakey-asn1.c $(obj)/x509_rsakey-asn1.h + + clean-files += x509-asn1.c x509-asn1.h ++clean-files += x509_akid-asn1.c x509_akid-asn1.h + clean-files += x509_rsakey-asn1.c x509_rsakey-asn1.h + + # +diff --git a/crypto/asymmetric_keys/pkcs7_trust.c b/crypto/asymmetric_keys/pkcs7_trust.c +index 1d29376072da..0f6463b6692b 100644 +--- a/crypto/asymmetric_keys/pkcs7_trust.c ++++ b/crypto/asymmetric_keys/pkcs7_trust.c +@@ -85,8 +85,8 @@ static int pkcs7_validate_trust_one(struct pkcs7_message *pkcs7, + /* No match - see if the root certificate has a signer amongst the + * trusted keys. + */ +- if (last && last->authority) { +- key = x509_request_asymmetric_key(trust_keyring, last->authority, ++ if (last && last->akid_skid) { ++ key = x509_request_asymmetric_key(trust_keyring, last->akid_skid, + false); + if (!IS_ERR(key)) { + x509 = last; +diff --git a/crypto/asymmetric_keys/pkcs7_verify.c b/crypto/asymmetric_keys/pkcs7_verify.c +index cd455450b069..a4d083f7e9e1 100644 +--- a/crypto/asymmetric_keys/pkcs7_verify.c ++++ b/crypto/asymmetric_keys/pkcs7_verify.c +@@ -187,11 +187,11 @@ static int pkcs7_verify_sig_chain(struct pkcs7_message *pkcs7, + goto maybe_missing_crypto_in_x509; + + pr_debug("- issuer %s\n", x509->issuer); +- if (x509->authority) ++ if (x509->akid_skid) + pr_debug("- authkeyid %*phN\n", +- x509->authority->len, x509->authority->data); ++ x509->akid_skid->len, x509->akid_skid->data); + +- if (!x509->authority || ++ if (!x509->akid_skid || + strcmp(x509->subject, x509->issuer) == 0) { + /* If there's no authority certificate specified, then + * the certificate must be self-signed and is the root +@@ -216,13 +216,13 @@ static int pkcs7_verify_sig_chain(struct pkcs7_message *pkcs7, + * list to see if the next one is there. + */ + pr_debug("- want %*phN\n", +- x509->authority->len, x509->authority->data); ++ x509->akid_skid->len, x509->akid_skid->data); + for (p = pkcs7->certs; p; p = p->next) { + if (!p->skid) + continue; + pr_debug("- cmp [%u] %*phN\n", + p->index, p->skid->len, p->skid->data); +- if (asymmetric_key_id_same(p->skid, x509->authority)) ++ if (asymmetric_key_id_same(p->skid, x509->akid_skid)) + goto found_issuer; + } + +@@ -338,8 +338,6 @@ int pkcs7_verify(struct pkcs7_message *pkcs7) + ret = x509_get_sig_params(x509); + if (ret < 0) + return ret; +- pr_debug("X.509[%u] %*phN\n", +- n, x509->authority->len, x509->authority->data); + } + + for (sinfo = pkcs7->signed_infos; sinfo; sinfo = sinfo->next) { +diff --git a/crypto/asymmetric_keys/x509_akid.asn1 b/crypto/asymmetric_keys/x509_akid.asn1 +new file mode 100644 +index 000000000000..1a33231a75a8 +--- /dev/null ++++ b/crypto/asymmetric_keys/x509_akid.asn1 +@@ -0,0 +1,35 @@ ++-- X.509 AuthorityKeyIdentifier ++-- rfc5280 section 4.2.1.1 ++ ++AuthorityKeyIdentifier ::= SEQUENCE { ++ keyIdentifier [0] IMPLICIT KeyIdentifier OPTIONAL, ++ authorityCertIssuer [1] IMPLICIT GeneralNames OPTIONAL, ++ authorityCertSerialNumber [2] IMPLICIT CertificateSerialNumber OPTIONAL ++ } ++ ++KeyIdentifier ::= OCTET STRING ({ x509_akid_note_kid }) ++ ++CertificateSerialNumber ::= INTEGER ({ x509_akid_note_serial }) ++ ++GeneralNames ::= SEQUENCE OF GeneralName ++ ++GeneralName ::= CHOICE { ++ otherName [0] ANY, ++ rfc822Name [1] IA5String, ++ dNSName [2] IA5String, ++ x400Address [3] ANY, ++ directoryName [4] Name ({ x509_akid_note_name }), ++ ediPartyName [5] ANY, ++ uniformResourceIdentifier [6] IA5String, ++ iPAddress [7] OCTET STRING, ++ registeredID [8] OBJECT IDENTIFIER ++ } ++ ++Name ::= SEQUENCE OF RelativeDistinguishedName ++ ++RelativeDistinguishedName ::= SET OF AttributeValueAssertion ++ ++AttributeValueAssertion ::= SEQUENCE { ++ attributeType OBJECT IDENTIFIER ({ x509_note_OID }), ++ attributeValue ANY ({ x509_extract_name_segment }) ++ } +diff --git a/crypto/asymmetric_keys/x509_cert_parser.c b/crypto/asymmetric_keys/x509_cert_parser.c +index a668d90302d3..1995d6d962f5 100644 +--- a/crypto/asymmetric_keys/x509_cert_parser.c ++++ b/crypto/asymmetric_keys/x509_cert_parser.c +@@ -18,6 +18,7 @@ + #include "public_key.h" + #include "x509_parser.h" + #include "x509-asn1.h" ++#include "x509_akid-asn1.h" + #include "x509_rsakey-asn1.h" + + struct x509_parse_context { +@@ -35,6 +36,10 @@ struct x509_parse_context { + u16 o_offset; /* Offset of organizationName (O) */ + u16 cn_offset; /* Offset of commonName (CN) */ + u16 email_offset; /* Offset of emailAddress */ ++ unsigned raw_akid_size; ++ const void *raw_akid; /* Raw authorityKeyId in ASN.1 */ ++ const void *akid_raw_issuer; /* Raw directoryName in authorityKeyId */ ++ unsigned akid_raw_issuer_size; + }; + + /* +@@ -48,7 +53,8 @@ void x509_free_certificate(struct x509_certificate *cert) + kfree(cert->subject); + kfree(cert->id); + kfree(cert->skid); +- kfree(cert->authority); ++ kfree(cert->akid_id); ++ kfree(cert->akid_skid); + kfree(cert->sig.digest); + mpi_free(cert->sig.rsa.s); + kfree(cert); +@@ -85,6 +91,18 @@ struct x509_certificate *x509_cert_parse(const void *data, size_t datalen) + if (ret < 0) + goto error_decode; + ++ /* Decode the AuthorityKeyIdentifier */ ++ if (ctx->raw_akid) { ++ pr_devel("AKID: %u %*phN\n", ++ ctx->raw_akid_size, ctx->raw_akid_size, ctx->raw_akid); ++ ret = asn1_ber_decoder(&x509_akid_decoder, ctx, ++ ctx->raw_akid, ctx->raw_akid_size); ++ if (ret < 0) { ++ pr_warn("Couldn't decode AuthKeyIdentifier\n"); ++ goto error_decode; ++ } ++ } ++ + /* Decode the public key */ + ret = asn1_ber_decoder(&x509_rsakey_decoder, ctx, + ctx->key, ctx->key_size); +@@ -422,7 +440,6 @@ int x509_process_extension(void *context, size_t hdrlen, + struct x509_parse_context *ctx = context; + struct asymmetric_key_id *kid; + const unsigned char *v = value; +- int i; + + pr_debug("Extension: %u\n", ctx->last_oid); + +@@ -449,117 +466,113 @@ int x509_process_extension(void *context, size_t hdrlen, + + if (ctx->last_oid == OID_authorityKeyIdentifier) { + /* Get hold of the CA key fingerprint */ +- if (ctx->cert->authority || vlen < 5) +- return -EBADMSG; +- +- /* Authority Key Identifier must be a Constructed SEQUENCE */ +- if (v[0] != (ASN1_SEQ | (ASN1_CONS << 5))) +- return -EBADMSG; +- +- /* Authority Key Identifier is not indefinite length */ +- if (unlikely(vlen == ASN1_INDEFINITE_LENGTH)) +- return -EBADMSG; +- +- if (vlen < ASN1_INDEFINITE_LENGTH) { +- /* Short Form length */ +- if (v[1] != vlen - 2 || +- v[2] != SEQ_TAG_KEYID || +- v[3] > vlen - 4) +- return -EBADMSG; +- +- vlen = v[3]; +- v += 4; +- } else { +- /* Long Form length */ +- size_t seq_len = 0; +- size_t sub = v[1] - ASN1_INDEFINITE_LENGTH; +- +- if (sub > 2) +- return -EBADMSG; +- +- /* calculate the length from subsequent octets */ +- v += 2; +- for (i = 0; i < sub; i++) { +- seq_len <<= 8; +- seq_len |= v[i]; +- } +- +- if (seq_len != vlen - 2 - sub || +- v[sub] != SEQ_TAG_KEYID || +- v[sub + 1] > vlen - 4 - sub) +- return -EBADMSG; +- +- vlen = v[sub + 1]; +- v += (sub + 2); +- } +- +- kid = asymmetric_key_generate_id(ctx->cert->raw_issuer, +- ctx->cert->raw_issuer_size, +- v, vlen); +- if (IS_ERR(kid)) +- return PTR_ERR(kid); +- pr_debug("authkeyid %*phN\n", kid->len, kid->data); +- ctx->cert->authority = kid; ++ ctx->raw_akid = v; ++ ctx->raw_akid_size = vlen; + return 0; + } + + return 0; + } + +-/* +- * Record a certificate time. ++/** ++ * x509_decode_time - Decode an X.509 time ASN.1 object ++ * @_t: The time to fill in ++ * @hdrlen: The length of the object header ++ * @tag: The object tag ++ * @value: The object value ++ * @vlen: The size of the object value ++ * ++ * Decode an ASN.1 universal time or generalised time field into a struct the ++ * kernel can handle and check it for validity. The time is decoded thus: ++ * ++ * [RFC5280 ยง4.1.2.5] ++ * CAs conforming to this profile MUST always encode certificate validity ++ * dates through the year 2049 as UTCTime; certificate validity dates in ++ * 2050 or later MUST be encoded as GeneralizedTime. Conforming ++ * applications MUST be able to process validity dates that are encoded in ++ * either UTCTime or GeneralizedTime. + */ +-static int x509_note_time(struct tm *tm, size_t hdrlen, +- unsigned char tag, +- const unsigned char *value, size_t vlen) ++int x509_decode_time(time64_t *_t, size_t hdrlen, ++ unsigned char tag, ++ const unsigned char *value, size_t vlen) + { ++ static const unsigned char month_lengths[] = { 31, 28, 31, 30, 31, 30, ++ 31, 31, 30, 31, 30, 31 }; + const unsigned char *p = value; ++ unsigned year, mon, day, hour, min, sec, mon_len; + +-#define dec2bin(X) ((X) - '0') ++#define dec2bin(X) ({ unsigned char x = (X) - '0'; if (x > 9) goto invalid_time; x; }) + #define DD2bin(P) ({ unsigned x = dec2bin(P[0]) * 10 + dec2bin(P[1]); P += 2; x; }) + + if (tag == ASN1_UNITIM) { + /* UTCTime: YYMMDDHHMMSSZ */ + if (vlen != 13) + goto unsupported_time; +- tm->tm_year = DD2bin(p); +- if (tm->tm_year >= 50) +- tm->tm_year += 1900; ++ year = DD2bin(p); ++ if (year >= 50) ++ year += 1900; + else +- tm->tm_year += 2000; ++ year += 2000; + } else if (tag == ASN1_GENTIM) { + /* GenTime: YYYYMMDDHHMMSSZ */ + if (vlen != 15) + goto unsupported_time; +- tm->tm_year = DD2bin(p) * 100 + DD2bin(p); ++ year = DD2bin(p) * 100 + DD2bin(p); ++ if (year >= 1950 && year <= 2049) ++ goto invalid_time; + } else { + goto unsupported_time; + } + +- tm->tm_year -= 1900; +- tm->tm_mon = DD2bin(p) - 1; +- tm->tm_mday = DD2bin(p); +- tm->tm_hour = DD2bin(p); +- tm->tm_min = DD2bin(p); +- tm->tm_sec = DD2bin(p); ++ mon = DD2bin(p); ++ day = DD2bin(p); ++ hour = DD2bin(p); ++ min = DD2bin(p); ++ sec = DD2bin(p); + + if (*p != 'Z') + goto unsupported_time; + ++ mon_len = month_lengths[mon]; ++ if (mon == 2) { ++ if (year % 4 == 0) { ++ mon_len = 29; ++ if (year % 100 == 0) { ++ mon_len = 28; ++ if (year % 400 == 0) ++ mon_len = 29; ++ } ++ } ++ } ++ ++ if (year < 1970 || ++ mon < 1 || mon > 12 || ++ day < 1 || day > mon_len || ++ hour < 0 || hour > 23 || ++ min < 0 || min > 59 || ++ sec < 0 || sec > 59) ++ goto invalid_time; ++ ++ *_t = mktime64(year, mon, day, hour, min, sec); + return 0; + + unsupported_time: +- pr_debug("Got unsupported time [tag %02x]: '%*.*s'\n", +- tag, (int)vlen, (int)vlen, value); ++ pr_debug("Got unsupported time [tag %02x]: '%*phN'\n", ++ tag, (int)vlen, value); ++ return -EBADMSG; ++invalid_time: ++ pr_debug("Got invalid time [tag %02x]: '%*phN'\n", ++ tag, (int)vlen, value); + return -EBADMSG; + } ++EXPORT_SYMBOL_GPL(x509_decode_time); + + int x509_note_not_before(void *context, size_t hdrlen, + unsigned char tag, + const void *value, size_t vlen) + { + struct x509_parse_context *ctx = context; +- return x509_note_time(&ctx->cert->valid_from, hdrlen, tag, value, vlen); ++ return x509_decode_time(&ctx->cert->valid_from, hdrlen, tag, value, vlen); + } + + int x509_note_not_after(void *context, size_t hdrlen, +@@ -567,5 +580,73 @@ int x509_note_not_after(void *context, size_t hdrlen, + const void *value, size_t vlen) + { + struct x509_parse_context *ctx = context; +- return x509_note_time(&ctx->cert->valid_to, hdrlen, tag, value, vlen); ++ return x509_decode_time(&ctx->cert->valid_to, hdrlen, tag, value, vlen); ++} ++ ++/* ++ * Note a key identifier-based AuthorityKeyIdentifier ++ */ ++int x509_akid_note_kid(void *context, size_t hdrlen, ++ unsigned char tag, ++ const void *value, size_t vlen) ++{ ++ struct x509_parse_context *ctx = context; ++ struct asymmetric_key_id *kid; ++ ++ pr_debug("AKID: keyid: %*phN\n", (int)vlen, value); ++ ++ if (ctx->cert->akid_skid) ++ return 0; ++ ++ kid = asymmetric_key_generate_id(ctx->cert->raw_issuer, ++ ctx->cert->raw_issuer_size, ++ value, vlen); ++ if (IS_ERR(kid)) ++ return PTR_ERR(kid); ++ pr_debug("authkeyid %*phN\n", kid->len, kid->data); ++ ctx->cert->akid_skid = kid; ++ return 0; ++} ++ ++/* ++ * Note a directoryName in an AuthorityKeyIdentifier ++ */ ++int x509_akid_note_name(void *context, size_t hdrlen, ++ unsigned char tag, ++ const void *value, size_t vlen) ++{ ++ struct x509_parse_context *ctx = context; ++ ++ pr_debug("AKID: name: %*phN\n", (int)vlen, value); ++ ++ ctx->akid_raw_issuer = value; ++ ctx->akid_raw_issuer_size = vlen; ++ return 0; ++} ++ ++/* ++ * Note a serial number in an AuthorityKeyIdentifier ++ */ ++int x509_akid_note_serial(void *context, size_t hdrlen, ++ unsigned char tag, ++ const void *value, size_t vlen) ++{ ++ struct x509_parse_context *ctx = context; ++ struct asymmetric_key_id *kid; ++ ++ pr_debug("AKID: serial: %*phN\n", (int)vlen, value); ++ ++ if (!ctx->akid_raw_issuer || ctx->cert->akid_id) ++ return 0; ++ ++ kid = asymmetric_key_generate_id(value, ++ vlen, ++ ctx->akid_raw_issuer, ++ ctx->akid_raw_issuer_size); ++ if (IS_ERR(kid)) ++ return PTR_ERR(kid); ++ ++ pr_debug("authkeyid %*phN\n", kid->len, kid->data); ++ ctx->cert->akid_id = kid; ++ return 0; + } +diff --git a/crypto/asymmetric_keys/x509_parser.h b/crypto/asymmetric_keys/x509_parser.h +index 3dfe6b5d6f0b..1de01eaec884 100644 +--- a/crypto/asymmetric_keys/x509_parser.h ++++ b/crypto/asymmetric_keys/x509_parser.h +@@ -19,11 +19,12 @@ struct x509_certificate { + struct public_key_signature sig; /* Signature parameters */ + char *issuer; /* Name of certificate issuer */ + char *subject; /* Name of certificate subject */ +- struct asymmetric_key_id *id; /* Serial number + issuer */ ++ struct asymmetric_key_id *id; /* Issuer + Serial number */ + struct asymmetric_key_id *skid; /* Subject + subjectKeyId (optional) */ +- struct asymmetric_key_id *authority; /* Authority key identifier (optional) */ +- struct tm valid_from; +- struct tm valid_to; ++ struct asymmetric_key_id *akid_id; /* CA AuthKeyId matching ->id (optional) */ ++ struct asymmetric_key_id *akid_skid; /* CA AuthKeyId matching ->skid (optional) */ ++ time64_t valid_from; ++ time64_t valid_to; + const void *tbs; /* Signed data */ + unsigned tbs_size; /* Size of signed data */ + unsigned raw_sig_size; /* Size of sigature */ +@@ -48,6 +49,9 @@ struct x509_certificate { + */ + extern void x509_free_certificate(struct x509_certificate *cert); + extern struct x509_certificate *x509_cert_parse(const void *data, size_t datalen); ++extern int x509_decode_time(time64_t *_t, size_t hdrlen, ++ unsigned char tag, ++ const unsigned char *value, size_t vlen); + + /* + * x509_public_key.c +diff --git a/crypto/asymmetric_keys/x509_public_key.c b/crypto/asymmetric_keys/x509_public_key.c +index 4c850ac474e2..727752851dcf 100644 +--- a/crypto/asymmetric_keys/x509_public_key.c ++++ b/crypto/asymmetric_keys/x509_public_key.c +@@ -227,10 +227,10 @@ static int x509_validate_trust(struct x509_certificate *cert, + if (!trust_keyring) + return -EOPNOTSUPP; + +- if (ca_keyid && !asymmetric_key_id_partial(cert->authority, ca_keyid)) ++ if (ca_keyid && !asymmetric_key_id_partial(cert->akid_skid, ca_keyid)) + return -EPERM; + +- key = x509_request_asymmetric_key(trust_keyring, cert->authority, ++ key = x509_request_asymmetric_key(trust_keyring, cert->akid_skid, + false); + if (!IS_ERR(key)) { + if (!use_builtin_keys +@@ -271,14 +271,7 @@ static int x509_key_preparse(struct key_preparsed_payload *prep) + } + + pr_devel("Cert Key Algo: %s\n", pkey_algo_name[cert->pub->pkey_algo]); +- pr_devel("Cert Valid From: %04ld-%02d-%02d %02d:%02d:%02d\n", +- cert->valid_from.tm_year + 1900, cert->valid_from.tm_mon + 1, +- cert->valid_from.tm_mday, cert->valid_from.tm_hour, +- cert->valid_from.tm_min, cert->valid_from.tm_sec); +- pr_devel("Cert Valid To: %04ld-%02d-%02d %02d:%02d:%02d\n", +- cert->valid_to.tm_year + 1900, cert->valid_to.tm_mon + 1, +- cert->valid_to.tm_mday, cert->valid_to.tm_hour, +- cert->valid_to.tm_min, cert->valid_to.tm_sec); ++ pr_devel("Cert Valid period: %lld-%lld\n", cert->valid_from, cert->valid_to); + pr_devel("Cert Signature: %s + %s\n", + pkey_algo_name[cert->sig.pkey_algo], + hash_algo_name[cert->sig.pkey_hash_algo]); +@@ -287,8 +280,8 @@ static int x509_key_preparse(struct key_preparsed_payload *prep) + cert->pub->id_type = PKEY_ID_X509; + + /* Check the signature on the key if it appears to be self-signed */ +- if (!cert->authority || +- asymmetric_key_id_same(cert->skid, cert->authority)) { ++ if (!cert->akid_skid || ++ asymmetric_key_id_same(cert->skid, cert->akid_skid)) { + ret = x509_check_signature(cert->pub, cert); /* self-signed */ + if (ret < 0) + goto error_free_cert; +diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c +index c42feb2bacd0..33e3db548a29 100644 +--- a/drivers/acpi/video_detect.c ++++ b/drivers/acpi/video_detect.c +@@ -166,14 +166,6 @@ static struct dmi_system_id video_detect_dmi_table[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "UL30A"), + }, + }, +- { +- .callback = video_detect_force_vendor, +- .ident = "Dell Inspiron 5737", +- .matches = { +- DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), +- DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5737"), +- }, +- }, + { }, + }; + +diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c +index 3bd7ca9853a8..2af8b29656af 100644 +--- a/drivers/block/mtip32xx/mtip32xx.c ++++ b/drivers/block/mtip32xx/mtip32xx.c +@@ -705,7 +705,7 @@ static void mtip_handle_tfe(struct driver_data *dd) + fail_reason = "thermal shutdown"; + } + if (buf[288] == 0xBF) { +- set_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag); ++ set_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag); + dev_info(&dd->pdev->dev, + "Drive indicates rebuild has failed. Secure erase required.\n"); + fail_all_ncq_cmds = 1; +@@ -896,6 +896,10 @@ static inline irqreturn_t mtip_handle_irq(struct driver_data *data) + + /* Acknowledge the interrupt status on the port.*/ + port_stat = readl(port->mmio + PORT_IRQ_STAT); ++ if (unlikely(port_stat == 0xFFFFFFFF)) { ++ mtip_check_surprise_removal(dd->pdev); ++ return IRQ_HANDLED; ++ } + writel(port_stat, port->mmio + PORT_IRQ_STAT); + + /* Demux port status */ +@@ -991,15 +995,11 @@ static bool mtip_pause_ncq(struct mtip_port *port, + reply = port->rxfis + RX_FIS_D2H_REG; + task_file_data = readl(port->mmio+PORT_TFDATA); + +- if (fis->command == ATA_CMD_SEC_ERASE_UNIT) +- clear_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag); +- + if ((task_file_data & 1)) + return false; + + if (fis->command == ATA_CMD_SEC_ERASE_PREP) { + set_bit(MTIP_PF_SE_ACTIVE_BIT, &port->flags); +- set_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag); + port->ic_pause_timer = jiffies; + return true; + } else if ((fis->command == ATA_CMD_DOWNLOAD_MICRO) && +@@ -1011,6 +1011,8 @@ static bool mtip_pause_ncq(struct mtip_port *port, + ((fis->command == 0xFC) && + (fis->features == 0x27 || fis->features == 0x72 || + fis->features == 0x62 || fis->features == 0x26))) { ++ clear_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag); ++ clear_bit(MTIP_DDF_REBUILD_FAILED_BIT, &port->dd->dd_flag); + /* Com reset after secure erase or lowlevel format */ + mtip_restart_port(port); + return false; +@@ -1102,6 +1104,7 @@ static int mtip_exec_internal_command(struct mtip_port *port, + struct mtip_cmd *int_cmd; + struct driver_data *dd = port->dd; + int rv = 0; ++ unsigned long start; + + /* Make sure the buffer is 8 byte aligned. This is asic specific. */ + if (buffer & 0x00000007) { +@@ -1164,6 +1167,8 @@ static int mtip_exec_internal_command(struct mtip_port *port, + /* Populate the command header */ + int_cmd->command_header->byte_count = 0; + ++ start = jiffies; ++ + /* Issue the command to the hardware */ + mtip_issue_non_ncq_command(port, MTIP_TAG_INTERNAL); + +@@ -1172,10 +1177,12 @@ static int mtip_exec_internal_command(struct mtip_port *port, + if ((rv = wait_for_completion_interruptible_timeout( + &wait, + msecs_to_jiffies(timeout))) <= 0) { ++ + if (rv == -ERESTARTSYS) { /* interrupted */ + dev_err(&dd->pdev->dev, +- "Internal command [%02X] was interrupted after %lu ms\n", +- fis->command, timeout); ++ "Internal command [%02X] was interrupted after %u ms\n", ++ fis->command, ++ jiffies_to_msecs(jiffies - start)); + rv = -EINTR; + goto exec_ic_exit; + } else if (rv == 0) /* timeout */ +@@ -2780,48 +2787,6 @@ static void mtip_hw_debugfs_exit(struct driver_data *dd) + debugfs_remove_recursive(dd->dfs_node); + } + +-static int mtip_free_orphan(struct driver_data *dd) +-{ +- struct kobject *kobj; +- +- if (dd->bdev) { +- if (dd->bdev->bd_holders >= 1) +- return -2; +- +- bdput(dd->bdev); +- dd->bdev = NULL; +- } +- +- mtip_hw_debugfs_exit(dd); +- +- spin_lock(&rssd_index_lock); +- ida_remove(&rssd_index_ida, dd->index); +- spin_unlock(&rssd_index_lock); +- +- if (!test_bit(MTIP_DDF_INIT_DONE_BIT, &dd->dd_flag) && +- test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag)) { +- put_disk(dd->disk); +- } else { +- if (dd->disk) { +- kobj = kobject_get(&disk_to_dev(dd->disk)->kobj); +- if (kobj) { +- mtip_hw_sysfs_exit(dd, kobj); +- kobject_put(kobj); +- } +- del_gendisk(dd->disk); +- dd->disk = NULL; +- } +- if (dd->queue) { +- dd->queue->queuedata = NULL; +- blk_cleanup_queue(dd->queue); +- blk_mq_free_tag_set(&dd->tags); +- dd->queue = NULL; +- } +- } +- kfree(dd); +- return 0; +-} +- + /* + * Perform any init/resume time hardware setup + * +@@ -2969,7 +2934,6 @@ static int mtip_service_thread(void *data) + unsigned long slot, slot_start, slot_wrap; + unsigned int num_cmd_slots = dd->slot_groups * 32; + struct mtip_port *port = dd->port; +- int ret; + + while (1) { + if (kthread_should_stop() || +@@ -3055,18 +3019,6 @@ restart_eh: + if (kthread_should_stop()) + goto st_out; + } +- +- while (1) { +- ret = mtip_free_orphan(dd); +- if (!ret) { +- /* NOTE: All data structures are invalid, do not +- * access any here */ +- return 0; +- } +- msleep_interruptible(1000); +- if (kthread_should_stop()) +- goto st_out; +- } + st_out: + return 0; + } +@@ -3178,7 +3130,7 @@ static int mtip_hw_get_identify(struct driver_data *dd) + if (buf[288] == 0xBF) { + dev_info(&dd->pdev->dev, + "Drive indicates rebuild has failed.\n"); +- /* TODO */ ++ set_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag); + } + } + +@@ -3352,20 +3304,25 @@ out1: + return rv; + } + +-static void mtip_standby_drive(struct driver_data *dd) ++static int mtip_standby_drive(struct driver_data *dd) + { +- if (dd->sr) +- return; ++ int rv = 0; + ++ if (dd->sr || !dd->port) ++ return -ENODEV; + /* + * Send standby immediate (E0h) to the drive so that it + * saves its state. + */ + if (!test_bit(MTIP_PF_REBUILD_BIT, &dd->port->flags) && +- !test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag)) +- if (mtip_standby_immediate(dd->port)) ++ !test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag) && ++ !test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag)) { ++ rv = mtip_standby_immediate(dd->port); ++ if (rv) + dev_warn(&dd->pdev->dev, + "STANDBY IMMEDIATE failed\n"); ++ } ++ return rv; + } + + /* +@@ -3394,6 +3351,7 @@ static int mtip_hw_exit(struct driver_data *dd) + /* Release the IRQ. */ + irq_set_affinity_hint(dd->pdev->irq, NULL); + devm_free_irq(&dd->pdev->dev, dd->pdev->irq, dd); ++ msleep(1000); + + /* Free dma regions */ + mtip_dma_free(dd); +@@ -3422,8 +3380,7 @@ static int mtip_hw_shutdown(struct driver_data *dd) + * Send standby immediate (E0h) to the drive so that it + * saves its state. + */ +- if (!dd->sr && dd->port) +- mtip_standby_immediate(dd->port); ++ mtip_standby_drive(dd); + + return 0; + } +@@ -3446,7 +3403,7 @@ static int mtip_hw_suspend(struct driver_data *dd) + * Send standby immediate (E0h) to the drive + * so that it saves its state. + */ +- if (mtip_standby_immediate(dd->port) != 0) { ++ if (mtip_standby_drive(dd) != 0) { + dev_err(&dd->pdev->dev, + "Failed standby-immediate command\n"); + return -EFAULT; +@@ -3684,6 +3641,28 @@ static int mtip_block_getgeo(struct block_device *dev, + return 0; + } + ++static int mtip_block_open(struct block_device *dev, fmode_t mode) ++{ ++ struct driver_data *dd; ++ ++ if (dev && dev->bd_disk) { ++ dd = (struct driver_data *) dev->bd_disk->private_data; ++ ++ if (dd) { ++ if (test_bit(MTIP_DDF_REMOVAL_BIT, ++ &dd->dd_flag)) { ++ return -ENODEV; ++ } ++ return 0; ++ } ++ } ++ return -ENODEV; ++} ++ ++void mtip_block_release(struct gendisk *disk, fmode_t mode) ++{ ++} ++ + /* + * Block device operation function. + * +@@ -3691,6 +3670,8 @@ static int mtip_block_getgeo(struct block_device *dev, + * layer. + */ + static const struct block_device_operations mtip_block_ops = { ++ .open = mtip_block_open, ++ .release = mtip_block_release, + .ioctl = mtip_block_ioctl, + #ifdef CONFIG_COMPAT + .compat_ioctl = mtip_block_compat_ioctl, +@@ -3729,10 +3710,9 @@ static int mtip_submit_request(struct blk_mq_hw_ctx *hctx, struct request *rq) + rq_data_dir(rq))) { + return -ENODATA; + } +- if (unlikely(test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag))) ++ if (unlikely(test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag) || ++ test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag))) + return -ENODATA; +- if (test_bit(MTIP_DDF_REBUILD_FAILED_BIT, &dd->dd_flag)) +- return -ENXIO; + } + + if (rq->cmd_flags & REQ_DISCARD) { +@@ -4066,52 +4046,51 @@ static int mtip_block_remove(struct driver_data *dd) + { + struct kobject *kobj; + +- if (!dd->sr) { +- mtip_hw_debugfs_exit(dd); ++ mtip_hw_debugfs_exit(dd); + +- if (dd->mtip_svc_handler) { +- set_bit(MTIP_PF_SVC_THD_STOP_BIT, &dd->port->flags); +- wake_up_interruptible(&dd->port->svc_wait); +- kthread_stop(dd->mtip_svc_handler); +- } ++ if (dd->mtip_svc_handler) { ++ set_bit(MTIP_PF_SVC_THD_STOP_BIT, &dd->port->flags); ++ wake_up_interruptible(&dd->port->svc_wait); ++ kthread_stop(dd->mtip_svc_handler); ++ } + +- /* Clean up the sysfs attributes, if created */ +- if (test_bit(MTIP_DDF_INIT_DONE_BIT, &dd->dd_flag)) { +- kobj = kobject_get(&disk_to_dev(dd->disk)->kobj); +- if (kobj) { +- mtip_hw_sysfs_exit(dd, kobj); +- kobject_put(kobj); +- } ++ /* Clean up the sysfs attributes, if created */ ++ if (test_bit(MTIP_DDF_INIT_DONE_BIT, &dd->dd_flag)) { ++ kobj = kobject_get(&disk_to_dev(dd->disk)->kobj); ++ if (kobj) { ++ mtip_hw_sysfs_exit(dd, kobj); ++ kobject_put(kobj); + } ++ } + ++ if (!dd->sr) + mtip_standby_drive(dd); +- +- /* +- * Delete our gendisk structure. This also removes the device +- * from /dev +- */ +- if (dd->bdev) { +- bdput(dd->bdev); +- dd->bdev = NULL; +- } +- if (dd->disk) { +- if (dd->disk->queue) { +- del_gendisk(dd->disk); +- blk_cleanup_queue(dd->queue); +- blk_mq_free_tag_set(&dd->tags); +- dd->queue = NULL; +- } else +- put_disk(dd->disk); +- } +- dd->disk = NULL; +- +- spin_lock(&rssd_index_lock); +- ida_remove(&rssd_index_ida, dd->index); +- spin_unlock(&rssd_index_lock); +- } else { ++ else + dev_info(&dd->pdev->dev, "device %s surprise removal\n", + dd->disk->disk_name); ++ ++ /* ++ * Delete our gendisk structure. This also removes the device ++ * from /dev ++ */ ++ if (dd->bdev) { ++ bdput(dd->bdev); ++ dd->bdev = NULL; + } ++ if (dd->disk) { ++ del_gendisk(dd->disk); ++ if (dd->disk->queue) { ++ blk_cleanup_queue(dd->queue); ++ blk_mq_free_tag_set(&dd->tags); ++ dd->queue = NULL; ++ } ++ put_disk(dd->disk); ++ } ++ dd->disk = NULL; ++ ++ spin_lock(&rssd_index_lock); ++ ida_remove(&rssd_index_ida, dd->index); ++ spin_unlock(&rssd_index_lock); + + /* De-initialize the protocol layer. */ + mtip_hw_exit(dd); +@@ -4140,12 +4119,12 @@ static int mtip_block_shutdown(struct driver_data *dd) + dev_info(&dd->pdev->dev, + "Shutting down %s ...\n", dd->disk->disk_name); + ++ del_gendisk(dd->disk); + if (dd->disk->queue) { +- del_gendisk(dd->disk); + blk_cleanup_queue(dd->queue); + blk_mq_free_tag_set(&dd->tags); +- } else +- put_disk(dd->disk); ++ } ++ put_disk(dd->disk); + dd->disk = NULL; + dd->queue = NULL; + } +@@ -4485,7 +4464,7 @@ static void mtip_pci_remove(struct pci_dev *pdev) + struct driver_data *dd = pci_get_drvdata(pdev); + unsigned long flags, to; + +- set_bit(MTIP_DDF_REMOVE_PENDING_BIT, &dd->dd_flag); ++ set_bit(MTIP_DDF_REMOVAL_BIT, &dd->dd_flag); + + spin_lock_irqsave(&dev_lock, flags); + list_del_init(&dd->online_list); +@@ -4502,11 +4481,18 @@ static void mtip_pci_remove(struct pci_dev *pdev) + } while (atomic_read(&dd->irq_workers_active) != 0 && + time_before(jiffies, to)); + ++ fsync_bdev(dd->bdev); ++ + if (atomic_read(&dd->irq_workers_active) != 0) { + dev_warn(&dd->pdev->dev, + "Completion workers still active!\n"); + } + ++ if (dd->sr) ++ blk_mq_stop_hw_queues(dd->queue); ++ ++ set_bit(MTIP_DDF_REMOVE_PENDING_BIT, &dd->dd_flag); ++ + /* Clean up the block layer. */ + mtip_block_remove(dd); + +@@ -4524,10 +4510,8 @@ static void mtip_pci_remove(struct pci_dev *pdev) + list_del_init(&dd->remove_list); + spin_unlock_irqrestore(&dev_lock, flags); + +- if (!dd->sr) +- kfree(dd); +- else +- set_bit(MTIP_DDF_REMOVE_DONE_BIT, &dd->dd_flag); ++ kfree(dd); ++ set_bit(MTIP_DDF_REMOVE_DONE_BIT, &dd->dd_flag); + + pcim_iounmap_regions(pdev, 1 << MTIP_ABAR); + pci_set_drvdata(pdev, NULL); +diff --git a/drivers/block/mtip32xx/mtip32xx.h b/drivers/block/mtip32xx/mtip32xx.h +index ba1b31ee22ec..76695265dffb 100644 +--- a/drivers/block/mtip32xx/mtip32xx.h ++++ b/drivers/block/mtip32xx/mtip32xx.h +@@ -155,6 +155,7 @@ enum { + MTIP_DDF_RESUME_BIT = 6, + MTIP_DDF_INIT_DONE_BIT = 7, + MTIP_DDF_REBUILD_FAILED_BIT = 8, ++ MTIP_DDF_REMOVAL_BIT = 9, + + MTIP_DDF_STOP_IO = ((1 << MTIP_DDF_REMOVE_PENDING_BIT) | + (1 << MTIP_DDF_SEC_LOCK_BIT) | +diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c +index fa893c3ec408..0beaa52df66b 100644 +--- a/drivers/bluetooth/ath3k.c ++++ b/drivers/bluetooth/ath3k.c +@@ -82,6 +82,7 @@ static const struct usb_device_id ath3k_table[] = { + { USB_DEVICE(0x0489, 0xe05f) }, + { USB_DEVICE(0x0489, 0xe076) }, + { USB_DEVICE(0x0489, 0xe078) }, ++ { USB_DEVICE(0x0489, 0xe095) }, + { USB_DEVICE(0x04c5, 0x1330) }, + { USB_DEVICE(0x04CA, 0x3004) }, + { USB_DEVICE(0x04CA, 0x3005) }, +@@ -92,6 +93,7 @@ static const struct usb_device_id ath3k_table[] = { + { USB_DEVICE(0x04CA, 0x300d) }, + { USB_DEVICE(0x04CA, 0x300f) }, + { USB_DEVICE(0x04CA, 0x3010) }, ++ { USB_DEVICE(0x04CA, 0x3014) }, + { USB_DEVICE(0x0930, 0x0219) }, + { USB_DEVICE(0x0930, 0x021c) }, + { USB_DEVICE(0x0930, 0x0220) }, +@@ -113,10 +115,12 @@ static const struct usb_device_id ath3k_table[] = { + { USB_DEVICE(0x13d3, 0x3362) }, + { USB_DEVICE(0x13d3, 0x3375) }, + { USB_DEVICE(0x13d3, 0x3393) }, ++ { USB_DEVICE(0x13d3, 0x3395) }, + { USB_DEVICE(0x13d3, 0x3402) }, + { USB_DEVICE(0x13d3, 0x3408) }, + { USB_DEVICE(0x13d3, 0x3423) }, + { USB_DEVICE(0x13d3, 0x3432) }, ++ { USB_DEVICE(0x13d3, 0x3472) }, + { USB_DEVICE(0x13d3, 0x3474) }, + + /* Atheros AR5BBU12 with sflash firmware */ +@@ -144,6 +148,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { + { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, ++ { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 }, +@@ -154,6 +159,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { + { USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 }, ++ { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 }, +@@ -175,10 +181,12 @@ static const struct usb_device_id ath3k_blist_tbl[] = { + { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 }, ++ { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, ++ { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, + + /* Atheros AR5BBU22 with sflash firmware */ +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index fdba79c3877c..ac553f997a1c 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -184,6 +184,7 @@ static const struct usb_device_id blacklist_table[] = { + { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 }, ++ { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 }, +@@ -194,6 +195,7 @@ static const struct usb_device_id blacklist_table[] = { + { USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 }, ++ { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 }, +@@ -215,10 +217,12 @@ static const struct usb_device_id blacklist_table[] = { + { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 }, ++ { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 }, ++ { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 }, + { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 }, + + /* Atheros AR5BBU12 with sflash firmware */ +diff --git a/drivers/bus/imx-weim.c b/drivers/bus/imx-weim.c +index e98d15eaa799..1827fc4d15c1 100644 +--- a/drivers/bus/imx-weim.c ++++ b/drivers/bus/imx-weim.c +@@ -150,7 +150,7 @@ static int __init weim_parse_dt(struct platform_device *pdev, + return ret; + } + +- for_each_child_of_node(pdev->dev.of_node, child) { ++ for_each_available_child_of_node(pdev->dev.of_node, child) { + if (!child->name) + continue; + +diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c +index 2b971b3e5c1c..b02d4b160403 100644 +--- a/drivers/char/tpm/tpm_crb.c ++++ b/drivers/char/tpm/tpm_crb.c +@@ -309,11 +309,11 @@ static int crb_acpi_remove(struct acpi_device *device) + struct device *dev = &device->dev; + struct tpm_chip *chip = dev_get_drvdata(dev); + +- tpm_chip_unregister(chip); +- + if (chip->flags & TPM_CHIP_FLAG_TPM2) + tpm2_shutdown(chip, TPM2_SU_CLEAR); + ++ tpm_chip_unregister(chip); ++ + return 0; + } + +diff --git a/drivers/clk/rockchip/clk-rk3188.c b/drivers/clk/rockchip/clk-rk3188.c +index 556ce041d371..404a9665879e 100644 +--- a/drivers/clk/rockchip/clk-rk3188.c ++++ b/drivers/clk/rockchip/clk-rk3188.c +@@ -708,6 +708,9 @@ static const char *const rk3188_critical_clocks[] __initconst = { + "aclk_cpu", + "aclk_peri", + "hclk_peri", ++ "pclk_cpu", ++ "pclk_peri", ++ "hclk_cpubus" + }; + + static void __init rk3188_common_clk_init(struct device_node *np) +diff --git a/drivers/crypto/atmel-sha.c b/drivers/crypto/atmel-sha.c +index a71c97c03c39..3178f84d2757 100644 +--- a/drivers/crypto/atmel-sha.c ++++ b/drivers/crypto/atmel-sha.c +@@ -1492,13 +1492,6 @@ static int atmel_sha_remove(struct platform_device *pdev) + + clk_unprepare(sha_dd->iclk); + +- iounmap(sha_dd->io_base); +- +- clk_put(sha_dd->iclk); +- +- if (sha_dd->irq >= 0) +- free_irq(sha_dd->irq, sha_dd); +- + return 0; + } + +diff --git a/drivers/crypto/ccp/ccp-crypto-aes-cmac.c b/drivers/crypto/ccp/ccp-crypto-aes-cmac.c +index ea7e8446956a..0a4973b47c99 100644 +--- a/drivers/crypto/ccp/ccp-crypto-aes-cmac.c ++++ b/drivers/crypto/ccp/ccp-crypto-aes-cmac.c +@@ -202,6 +202,39 @@ static int ccp_aes_cmac_digest(struct ahash_request *req) + return ccp_aes_cmac_finup(req); + } + ++static int ccp_aes_cmac_export(struct ahash_request *req, void *out) ++{ ++ struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req); ++ struct ccp_aes_cmac_exp_ctx state; ++ ++ state.null_msg = rctx->null_msg; ++ memcpy(state.iv, rctx->iv, sizeof(state.iv)); ++ state.buf_count = rctx->buf_count; ++ memcpy(state.buf, rctx->buf, sizeof(state.buf)); ++ ++ /* 'out' may not be aligned so memcpy from local variable */ ++ memcpy(out, &state, sizeof(state)); ++ ++ return 0; ++} ++ ++static int ccp_aes_cmac_import(struct ahash_request *req, const void *in) ++{ ++ struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req); ++ struct ccp_aes_cmac_exp_ctx state; ++ ++ /* 'in' may not be aligned so memcpy to local variable */ ++ memcpy(&state, in, sizeof(state)); ++ ++ memset(rctx, 0, sizeof(*rctx)); ++ rctx->null_msg = state.null_msg; ++ memcpy(rctx->iv, state.iv, sizeof(rctx->iv)); ++ rctx->buf_count = state.buf_count; ++ memcpy(rctx->buf, state.buf, sizeof(rctx->buf)); ++ ++ return 0; ++} ++ + static int ccp_aes_cmac_setkey(struct crypto_ahash *tfm, const u8 *key, + unsigned int key_len) + { +@@ -334,10 +367,13 @@ int ccp_register_aes_cmac_algs(struct list_head *head) + alg->final = ccp_aes_cmac_final; + alg->finup = ccp_aes_cmac_finup; + alg->digest = ccp_aes_cmac_digest; ++ alg->export = ccp_aes_cmac_export; ++ alg->import = ccp_aes_cmac_import; + alg->setkey = ccp_aes_cmac_setkey; + + halg = &alg->halg; + halg->digestsize = AES_BLOCK_SIZE; ++ halg->statesize = sizeof(struct ccp_aes_cmac_exp_ctx); + + base = &halg->base; + snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "cmac(aes)"); +diff --git a/drivers/crypto/ccp/ccp-crypto-sha.c b/drivers/crypto/ccp/ccp-crypto-sha.c +index 507b34e0cc19..9711b6d29162 100644 +--- a/drivers/crypto/ccp/ccp-crypto-sha.c ++++ b/drivers/crypto/ccp/ccp-crypto-sha.c +@@ -194,6 +194,43 @@ static int ccp_sha_digest(struct ahash_request *req) + return ccp_sha_finup(req); + } + ++static int ccp_sha_export(struct ahash_request *req, void *out) ++{ ++ struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req); ++ struct ccp_sha_exp_ctx state; ++ ++ state.type = rctx->type; ++ state.msg_bits = rctx->msg_bits; ++ state.first = rctx->first; ++ memcpy(state.ctx, rctx->ctx, sizeof(state.ctx)); ++ state.buf_count = rctx->buf_count; ++ memcpy(state.buf, rctx->buf, sizeof(state.buf)); ++ ++ /* 'out' may not be aligned so memcpy from local variable */ ++ memcpy(out, &state, sizeof(state)); ++ ++ return 0; ++} ++ ++static int ccp_sha_import(struct ahash_request *req, const void *in) ++{ ++ struct ccp_sha_req_ctx *rctx = ahash_request_ctx(req); ++ struct ccp_sha_exp_ctx state; ++ ++ /* 'in' may not be aligned so memcpy to local variable */ ++ memcpy(&state, in, sizeof(state)); ++ ++ memset(rctx, 0, sizeof(*rctx)); ++ rctx->type = state.type; ++ rctx->msg_bits = state.msg_bits; ++ rctx->first = state.first; ++ memcpy(rctx->ctx, state.ctx, sizeof(rctx->ctx)); ++ rctx->buf_count = state.buf_count; ++ memcpy(rctx->buf, state.buf, sizeof(rctx->buf)); ++ ++ return 0; ++} ++ + static int ccp_sha_setkey(struct crypto_ahash *tfm, const u8 *key, + unsigned int key_len) + { +@@ -390,9 +427,12 @@ static int ccp_register_sha_alg(struct list_head *head, + alg->final = ccp_sha_final; + alg->finup = ccp_sha_finup; + alg->digest = ccp_sha_digest; ++ alg->export = ccp_sha_export; ++ alg->import = ccp_sha_import; + + halg = &alg->halg; + halg->digestsize = def->digest_size; ++ halg->statesize = sizeof(struct ccp_sha_exp_ctx); + + base = &halg->base; + snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "%s", def->name); +diff --git a/drivers/crypto/ccp/ccp-crypto.h b/drivers/crypto/ccp/ccp-crypto.h +index 76a96f0f44c6..a326ec20bfa8 100644 +--- a/drivers/crypto/ccp/ccp-crypto.h ++++ b/drivers/crypto/ccp/ccp-crypto.h +@@ -129,6 +129,15 @@ struct ccp_aes_cmac_req_ctx { + struct ccp_cmd cmd; + }; + ++struct ccp_aes_cmac_exp_ctx { ++ unsigned int null_msg; ++ ++ u8 iv[AES_BLOCK_SIZE]; ++ ++ unsigned int buf_count; ++ u8 buf[AES_BLOCK_SIZE]; ++}; ++ + /***** SHA related defines *****/ + #define MAX_SHA_CONTEXT_SIZE SHA256_DIGEST_SIZE + #define MAX_SHA_BLOCK_SIZE SHA256_BLOCK_SIZE +@@ -171,6 +180,19 @@ struct ccp_sha_req_ctx { + struct ccp_cmd cmd; + }; + ++struct ccp_sha_exp_ctx { ++ enum ccp_sha_type type; ++ ++ u64 msg_bits; ++ ++ unsigned int first; ++ ++ u8 ctx[MAX_SHA_CONTEXT_SIZE]; ++ ++ unsigned int buf_count; ++ u8 buf[MAX_SHA_BLOCK_SIZE]; ++}; ++ + /***** Common Context Structure *****/ + struct ccp_ctx { + int (*complete)(struct crypto_async_request *req, int ret); +diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c +index 92772fffc52f..45f734eec954 100644 +--- a/drivers/edac/amd64_edac.c ++++ b/drivers/edac/amd64_edac.c +@@ -1437,7 +1437,7 @@ static u64 f1x_get_norm_dct_addr(struct amd64_pvt *pvt, u8 range, + u64 chan_off; + u64 dram_base = get_dram_base(pvt, range); + u64 hole_off = f10_dhar_offset(pvt); +- u64 dct_sel_base_off = (pvt->dct_sel_hi & 0xFFFFFC00) << 16; ++ u64 dct_sel_base_off = (u64)(pvt->dct_sel_hi & 0xFFFFFC00) << 16; + + if (hi_rng) { + /* +diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c +index cd6b9c72c8ac..adcc628b1f93 100644 +--- a/drivers/edac/sb_edac.c ++++ b/drivers/edac/sb_edac.c +@@ -1043,8 +1043,8 @@ static void get_memory_layout(const struct mem_ctl_info *mci) + edac_dbg(0, "TAD#%d: up to %u.%03u GB (0x%016Lx), socket interleave %d, memory interleave %d, TGT: %d, %d, %d, %d, reg=0x%08x\n", + n_tads, gb, (mb*1000)/1024, + ((u64)tmp_mb) << 20L, +- (u32)TAD_SOCK(reg), +- (u32)TAD_CH(reg), ++ (u32)(1 << TAD_SOCK(reg)), ++ (u32)TAD_CH(reg) + 1, + (u32)TAD_TGT0(reg), + (u32)TAD_TGT1(reg), + (u32)TAD_TGT2(reg), +@@ -1316,7 +1316,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci, + } + + ch_way = TAD_CH(reg) + 1; +- sck_way = TAD_SOCK(reg) + 1; ++ sck_way = 1 << TAD_SOCK(reg); + + if (ch_way == 3) + idx = addr >> 6; +@@ -1373,7 +1373,7 @@ static int get_memory_error_data(struct mem_ctl_info *mci, + n_tads, + addr, + limit, +- (u32)TAD_SOCK(reg), ++ sck_way, + ch_way, + offset, + idx, +@@ -1388,18 +1388,12 @@ static int get_memory_error_data(struct mem_ctl_info *mci, + offset, addr); + return -EINVAL; + } +- addr -= offset; +- /* Store the low bits [0:6] of the addr */ +- ch_addr = addr & 0x7f; +- /* Remove socket wayness and remove 6 bits */ +- addr >>= 6; +- addr = div_u64(addr, sck_xch); +-#if 0 +- /* Divide by channel way */ +- addr = addr / ch_way; +-#endif +- /* Recover the last 6 bits */ +- ch_addr |= addr << 6; ++ ++ ch_addr = addr - offset; ++ ch_addr >>= (6 + shiftup); ++ ch_addr /= ch_way * sck_way; ++ ch_addr <<= (6 + shiftup); ++ ch_addr |= addr & ((1 << (6 + shiftup)) - 1); + + /* + * Step 3) Decode rank +diff --git a/drivers/firmware/efi/efivars.c b/drivers/firmware/efi/efivars.c +index 7b2e0496e0c0..10e6774ab2a2 100644 +--- a/drivers/firmware/efi/efivars.c ++++ b/drivers/firmware/efi/efivars.c +@@ -221,7 +221,7 @@ sanity_check(struct efi_variable *var, efi_char16_t *name, efi_guid_t vendor, + } + + if ((attributes & ~EFI_VARIABLE_MASK) != 0 || +- efivar_validate(name, data, size) == false) { ++ efivar_validate(vendor, name, data, size) == false) { + printk(KERN_ERR "efivars: Malformed variable content\n"); + return -EINVAL; + } +@@ -447,7 +447,8 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj, + } + + if ((attributes & ~EFI_VARIABLE_MASK) != 0 || +- efivar_validate(name, data, size) == false) { ++ efivar_validate(new_var->VendorGuid, name, data, ++ size) == false) { + printk(KERN_ERR "efivars: Malformed variable content\n"); + return -EINVAL; + } +@@ -535,50 +536,43 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj, + * efivar_create_sysfs_entry - create a new entry in sysfs + * @new_var: efivar entry to create + * +- * Returns 1 on failure, 0 on success ++ * Returns 0 on success, negative error code on failure + */ + static int + efivar_create_sysfs_entry(struct efivar_entry *new_var) + { +- int i, short_name_size; ++ int short_name_size; + char *short_name; +- unsigned long variable_name_size; +- efi_char16_t *variable_name; +- +- variable_name = new_var->var.VariableName; +- variable_name_size = ucs2_strlen(variable_name) * sizeof(efi_char16_t); ++ unsigned long utf8_name_size; ++ efi_char16_t *variable_name = new_var->var.VariableName; ++ int ret; + + /* +- * Length of the variable bytes in ASCII, plus the '-' separator, ++ * Length of the variable bytes in UTF8, plus the '-' separator, + * plus the GUID, plus trailing NUL + */ +- short_name_size = variable_name_size / sizeof(efi_char16_t) +- + 1 + EFI_VARIABLE_GUID_LEN + 1; +- +- short_name = kzalloc(short_name_size, GFP_KERNEL); ++ utf8_name_size = ucs2_utf8size(variable_name); ++ short_name_size = utf8_name_size + 1 + EFI_VARIABLE_GUID_LEN + 1; + ++ short_name = kmalloc(short_name_size, GFP_KERNEL); + if (!short_name) +- return 1; ++ return -ENOMEM; ++ ++ ucs2_as_utf8(short_name, variable_name, short_name_size); + +- /* Convert Unicode to normal chars (assume top bits are 0), +- ala UTF-8 */ +- for (i=0; i < (int)(variable_name_size / sizeof(efi_char16_t)); i++) { +- short_name[i] = variable_name[i] & 0xFF; +- } + /* This is ugly, but necessary to separate one vendor's + private variables from another's. */ +- +- *(short_name + strlen(short_name)) = '-'; ++ short_name[utf8_name_size] = '-'; + efi_guid_to_str(&new_var->var.VendorGuid, +- short_name + strlen(short_name)); ++ short_name + utf8_name_size + 1); + + new_var->kobj.kset = efivars_kset; + +- i = kobject_init_and_add(&new_var->kobj, &efivar_ktype, ++ ret = kobject_init_and_add(&new_var->kobj, &efivar_ktype, + NULL, "%s", short_name); + kfree(short_name); +- if (i) +- return 1; ++ if (ret) ++ return ret; + + kobject_uevent(&new_var->kobj, KOBJ_ADD); + efivar_entry_add(new_var, &efivar_sysfs_list); +diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c +index 70a0fb10517f..7f2ea21c730d 100644 +--- a/drivers/firmware/efi/vars.c ++++ b/drivers/firmware/efi/vars.c +@@ -165,67 +165,133 @@ validate_ascii_string(efi_char16_t *var_name, int match, u8 *buffer, + } + + struct variable_validate { ++ efi_guid_t vendor; + char *name; + bool (*validate)(efi_char16_t *var_name, int match, u8 *data, + unsigned long len); + }; + ++/* ++ * This is the list of variables we need to validate, as well as the ++ * whitelist for what we think is safe not to default to immutable. ++ * ++ * If it has a validate() method that's not NULL, it'll go into the ++ * validation routine. If not, it is assumed valid, but still used for ++ * whitelisting. ++ * ++ * Note that it's sorted by {vendor,name}, but globbed names must come after ++ * any other name with the same prefix. ++ */ + static const struct variable_validate variable_validate[] = { +- { "BootNext", validate_uint16 }, +- { "BootOrder", validate_boot_order }, +- { "DriverOrder", validate_boot_order }, +- { "Boot*", validate_load_option }, +- { "Driver*", validate_load_option }, +- { "ConIn", validate_device_path }, +- { "ConInDev", validate_device_path }, +- { "ConOut", validate_device_path }, +- { "ConOutDev", validate_device_path }, +- { "ErrOut", validate_device_path }, +- { "ErrOutDev", validate_device_path }, +- { "Timeout", validate_uint16 }, +- { "Lang", validate_ascii_string }, +- { "PlatformLang", validate_ascii_string }, +- { "", NULL }, ++ { EFI_GLOBAL_VARIABLE_GUID, "BootNext", validate_uint16 }, ++ { EFI_GLOBAL_VARIABLE_GUID, "BootOrder", validate_boot_order }, ++ { EFI_GLOBAL_VARIABLE_GUID, "Boot*", validate_load_option }, ++ { EFI_GLOBAL_VARIABLE_GUID, "DriverOrder", validate_boot_order }, ++ { EFI_GLOBAL_VARIABLE_GUID, "Driver*", validate_load_option }, ++ { EFI_GLOBAL_VARIABLE_GUID, "ConIn", validate_device_path }, ++ { EFI_GLOBAL_VARIABLE_GUID, "ConInDev", validate_device_path }, ++ { EFI_GLOBAL_VARIABLE_GUID, "ConOut", validate_device_path }, ++ { EFI_GLOBAL_VARIABLE_GUID, "ConOutDev", validate_device_path }, ++ { EFI_GLOBAL_VARIABLE_GUID, "ErrOut", validate_device_path }, ++ { EFI_GLOBAL_VARIABLE_GUID, "ErrOutDev", validate_device_path }, ++ { EFI_GLOBAL_VARIABLE_GUID, "Lang", validate_ascii_string }, ++ { EFI_GLOBAL_VARIABLE_GUID, "OsIndications", NULL }, ++ { EFI_GLOBAL_VARIABLE_GUID, "PlatformLang", validate_ascii_string }, ++ { EFI_GLOBAL_VARIABLE_GUID, "Timeout", validate_uint16 }, ++ { LINUX_EFI_CRASH_GUID, "*", NULL }, ++ { NULL_GUID, "", NULL }, + }; + ++static bool ++variable_matches(const char *var_name, size_t len, const char *match_name, ++ int *match) ++{ ++ for (*match = 0; ; (*match)++) { ++ char c = match_name[*match]; ++ char u = var_name[*match]; ++ ++ /* Wildcard in the matching name means we've matched */ ++ if (c == '*') ++ return true; ++ ++ /* Case sensitive match */ ++ if (!c && *match == len) ++ return true; ++ ++ if (c != u) ++ return false; ++ ++ if (!c) ++ return true; ++ } ++ return true; ++} ++ + bool +-efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long len) ++efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data, ++ unsigned long data_size) + { + int i; +- u16 *unicode_name = var_name; ++ unsigned long utf8_size; ++ u8 *utf8_name; + +- for (i = 0; variable_validate[i].validate != NULL; i++) { +- const char *name = variable_validate[i].name; +- int match; ++ utf8_size = ucs2_utf8size(var_name); ++ utf8_name = kmalloc(utf8_size + 1, GFP_KERNEL); ++ if (!utf8_name) ++ return false; + +- for (match = 0; ; match++) { +- char c = name[match]; +- u16 u = unicode_name[match]; ++ ucs2_as_utf8(utf8_name, var_name, utf8_size); ++ utf8_name[utf8_size] = '\0'; + +- /* All special variables are plain ascii */ +- if (u > 127) +- return true; ++ for (i = 0; variable_validate[i].name[0] != '\0'; i++) { ++ const char *name = variable_validate[i].name; ++ int match = 0; + +- /* Wildcard in the matching name means we've matched */ +- if (c == '*') +- return variable_validate[i].validate(var_name, +- match, data, len); ++ if (efi_guidcmp(vendor, variable_validate[i].vendor)) ++ continue; + +- /* Case sensitive match */ +- if (c != u) ++ if (variable_matches(utf8_name, utf8_size+1, name, &match)) { ++ if (variable_validate[i].validate == NULL) + break; +- +- /* Reached the end of the string while matching */ +- if (!c) +- return variable_validate[i].validate(var_name, +- match, data, len); ++ kfree(utf8_name); ++ return variable_validate[i].validate(var_name, match, ++ data, data_size); + } + } +- ++ kfree(utf8_name); + return true; + } + EXPORT_SYMBOL_GPL(efivar_validate); + ++bool ++efivar_variable_is_removable(efi_guid_t vendor, const char *var_name, ++ size_t len) ++{ ++ int i; ++ bool found = false; ++ int match = 0; ++ ++ /* ++ * Check if our variable is in the validated variables list ++ */ ++ for (i = 0; variable_validate[i].name[0] != '\0'; i++) { ++ if (efi_guidcmp(variable_validate[i].vendor, vendor)) ++ continue; ++ ++ if (variable_matches(var_name, len, ++ variable_validate[i].name, &match)) { ++ found = true; ++ break; ++ } ++ } ++ ++ /* ++ * If it's in our list, it is removable. ++ */ ++ return found; ++} ++EXPORT_SYMBOL_GPL(efivar_variable_is_removable); ++ + static efi_status_t + check_var_size(u32 attributes, unsigned long size) + { +@@ -852,7 +918,7 @@ int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes, + + *set = false; + +- if (efivar_validate(name, data, *size) == false) ++ if (efivar_validate(*vendor, name, data, *size) == false) + return -EINVAL; + + /* +diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c +index 0ec9ad50ba7c..9e33705d4d0e 100644 +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -798,6 +798,18 @@ static struct drm_dp_mst_branch *drm_dp_add_mst_branch_device(u8 lct, u8 *rad) + return mstb; + } + ++static void drm_dp_free_mst_port(struct kref *kref); ++ ++static void drm_dp_free_mst_branch_device(struct kref *kref) ++{ ++ struct drm_dp_mst_branch *mstb = container_of(kref, struct drm_dp_mst_branch, kref); ++ if (mstb->port_parent) { ++ if (list_empty(&mstb->port_parent->next)) ++ kref_put(&mstb->port_parent->kref, drm_dp_free_mst_port); ++ } ++ kfree(mstb); ++} ++ + static void drm_dp_destroy_mst_branch_device(struct kref *kref) + { + struct drm_dp_mst_branch *mstb = container_of(kref, struct drm_dp_mst_branch, kref); +@@ -805,6 +817,15 @@ static void drm_dp_destroy_mst_branch_device(struct kref *kref) + bool wake_tx = false; + + /* ++ * init kref again to be used by ports to remove mst branch when it is ++ * not needed anymore ++ */ ++ kref_init(kref); ++ ++ if (mstb->port_parent && list_empty(&mstb->port_parent->next)) ++ kref_get(&mstb->port_parent->kref); ++ ++ /* + * destroy all ports - don't need lock + * as there are no more references to the mst branch + * device at this point. +@@ -830,7 +851,8 @@ static void drm_dp_destroy_mst_branch_device(struct kref *kref) + + if (wake_tx) + wake_up(&mstb->mgr->tx_waitq); +- kfree(mstb); ++ ++ kref_put(kref, drm_dp_free_mst_branch_device); + } + + static void drm_dp_put_mst_branch_device(struct drm_dp_mst_branch *mstb) +@@ -878,6 +900,7 @@ static void drm_dp_destroy_port(struct kref *kref) + * from an EDID retrieval */ + + mutex_lock(&mgr->destroy_connector_lock); ++ kref_get(&port->parent->kref); + list_add(&port->next, &mgr->destroy_connector_list); + mutex_unlock(&mgr->destroy_connector_lock); + schedule_work(&mgr->destroy_connector_work); +@@ -1013,18 +1036,27 @@ static bool drm_dp_port_setup_pdt(struct drm_dp_mst_port *port) + return send_link; + } + +-static void drm_dp_check_port_guid(struct drm_dp_mst_branch *mstb, +- struct drm_dp_mst_port *port) ++static void drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, u8 *guid) + { + int ret; +- if (port->dpcd_rev >= 0x12) { +- port->guid_valid = drm_dp_validate_guid(mstb->mgr, port->guid); +- if (!port->guid_valid) { +- ret = drm_dp_send_dpcd_write(mstb->mgr, +- port, +- DP_GUID, +- 16, port->guid); +- port->guid_valid = true; ++ ++ memcpy(mstb->guid, guid, 16); ++ ++ if (!drm_dp_validate_guid(mstb->mgr, mstb->guid)) { ++ if (mstb->port_parent) { ++ ret = drm_dp_send_dpcd_write( ++ mstb->mgr, ++ mstb->port_parent, ++ DP_GUID, ++ 16, ++ mstb->guid); ++ } else { ++ ++ ret = drm_dp_dpcd_write( ++ mstb->mgr->aux, ++ DP_GUID, ++ mstb->guid, ++ 16); + } + } + } +@@ -1081,7 +1113,6 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, + port->dpcd_rev = port_msg->dpcd_revision; + port->num_sdp_streams = port_msg->num_sdp_streams; + port->num_sdp_stream_sinks = port_msg->num_sdp_stream_sinks; +- memcpy(port->guid, port_msg->peer_guid, 16); + + /* manage mstb port lists with mgr lock - take a reference + for this list */ +@@ -1094,11 +1125,9 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, + + if (old_ddps != port->ddps) { + if (port->ddps) { +- drm_dp_check_port_guid(mstb, port); + if (!port->input) + drm_dp_send_enum_path_resources(mstb->mgr, mstb, port); + } else { +- port->guid_valid = false; + port->available_pbn = 0; + } + } +@@ -1156,10 +1185,8 @@ static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, + + if (old_ddps != port->ddps) { + if (port->ddps) { +- drm_dp_check_port_guid(mstb, port); + dowork = true; + } else { +- port->guid_valid = false; + port->available_pbn = 0; + } + } +@@ -1216,13 +1243,14 @@ static struct drm_dp_mst_branch *get_mst_branch_device_by_guid_helper( + struct drm_dp_mst_branch *found_mstb; + struct drm_dp_mst_port *port; + ++ if (memcmp(mstb->guid, guid, 16) == 0) ++ return mstb; ++ ++ + list_for_each_entry(port, &mstb->ports, next) { + if (!port->mstb) + continue; + +- if (port->guid_valid && memcmp(port->guid, guid, 16) == 0) +- return port->mstb; +- + found_mstb = get_mst_branch_device_by_guid_helper(port->mstb, guid); + + if (found_mstb) +@@ -1241,10 +1269,7 @@ static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device_by_guid( + /* find the port by iterating down */ + mutex_lock(&mgr->lock); + +- if (mgr->guid_valid && memcmp(mgr->guid, guid, 16) == 0) +- mstb = mgr->mst_primary; +- else +- mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid); ++ mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid); + + if (mstb) + kref_get(&mstb->kref); +@@ -1549,6 +1574,9 @@ static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr, + txmsg->reply.u.link_addr.ports[i].num_sdp_streams, + txmsg->reply.u.link_addr.ports[i].num_sdp_stream_sinks); + } ++ ++ drm_dp_check_mstb_guid(mstb, txmsg->reply.u.link_addr.guid); ++ + for (i = 0; i < txmsg->reply.u.link_addr.nports; i++) { + drm_dp_add_port(mstb, mgr->dev, &txmsg->reply.u.link_addr.ports[i]); + } +@@ -1595,6 +1623,37 @@ static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr, + return 0; + } + ++static struct drm_dp_mst_port *drm_dp_get_last_connected_port_to_mstb(struct drm_dp_mst_branch *mstb) ++{ ++ if (!mstb->port_parent) ++ return NULL; ++ ++ if (mstb->port_parent->mstb != mstb) ++ return mstb->port_parent; ++ ++ return drm_dp_get_last_connected_port_to_mstb(mstb->port_parent->parent); ++} ++ ++static struct drm_dp_mst_branch *drm_dp_get_last_connected_port_and_mstb(struct drm_dp_mst_topology_mgr *mgr, ++ struct drm_dp_mst_branch *mstb, ++ int *port_num) ++{ ++ struct drm_dp_mst_branch *rmstb = NULL; ++ struct drm_dp_mst_port *found_port; ++ mutex_lock(&mgr->lock); ++ if (mgr->mst_primary) { ++ found_port = drm_dp_get_last_connected_port_to_mstb(mstb); ++ ++ if (found_port) { ++ rmstb = found_port->parent; ++ kref_get(&rmstb->kref); ++ *port_num = found_port->port_num; ++ } ++ } ++ mutex_unlock(&mgr->lock); ++ return rmstb; ++} ++ + static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr, + struct drm_dp_mst_port *port, + int id, +@@ -1602,11 +1661,16 @@ static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr, + { + struct drm_dp_sideband_msg_tx *txmsg; + struct drm_dp_mst_branch *mstb; +- int len, ret; ++ int len, ret, port_num; + ++ port_num = port->port_num; + mstb = drm_dp_get_validated_mstb_ref(mgr, port->parent); +- if (!mstb) +- return -EINVAL; ++ if (!mstb) { ++ mstb = drm_dp_get_last_connected_port_and_mstb(mgr, port->parent, &port_num); ++ ++ if (!mstb) ++ return -EINVAL; ++ } + + txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL); + if (!txmsg) { +@@ -1615,7 +1679,7 @@ static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr, + } + + txmsg->dst = mstb; +- len = build_allocate_payload(txmsg, port->port_num, ++ len = build_allocate_payload(txmsg, port_num, + id, + pbn); + +@@ -1969,31 +2033,17 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms + mgr->mst_primary = mstb; + kref_get(&mgr->mst_primary->kref); + +- { +- struct drm_dp_payload reset_pay; +- reset_pay.start_slot = 0; +- reset_pay.num_slots = 0x3f; +- drm_dp_dpcd_write_payload(mgr, 0, &reset_pay); +- } +- + ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, +- DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC); ++ DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC); + if (ret < 0) { + goto out_unlock; + } + +- +- /* sort out guid */ +- ret = drm_dp_dpcd_read(mgr->aux, DP_GUID, mgr->guid, 16); +- if (ret != 16) { +- DRM_DEBUG_KMS("failed to read DP GUID %d\n", ret); +- goto out_unlock; +- } +- +- mgr->guid_valid = drm_dp_validate_guid(mgr, mgr->guid); +- if (!mgr->guid_valid) { +- ret = drm_dp_dpcd_write(mgr->aux, DP_GUID, mgr->guid, 16); +- mgr->guid_valid = true; ++ { ++ struct drm_dp_payload reset_pay; ++ reset_pay.start_slot = 0; ++ reset_pay.num_slots = 0x3f; ++ drm_dp_dpcd_write_payload(mgr, 0, &reset_pay); + } + + queue_work(system_long_wq, &mgr->work); +@@ -2217,6 +2267,7 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) + } + + drm_dp_update_port(mstb, &msg.u.conn_stat); ++ + DRM_DEBUG_KMS("Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", msg.u.conn_stat.port_number, msg.u.conn_stat.legacy_device_plug_status, msg.u.conn_stat.displayport_device_plug_status, msg.u.conn_stat.message_capability_status, msg.u.conn_stat.input_port, msg.u.conn_stat.peer_device_type); + (*mgr->cbs->hotplug)(mgr); + +@@ -2749,6 +2800,13 @@ static void drm_dp_tx_work(struct work_struct *work) + mutex_unlock(&mgr->qlock); + } + ++static void drm_dp_free_mst_port(struct kref *kref) ++{ ++ struct drm_dp_mst_port *port = container_of(kref, struct drm_dp_mst_port, kref); ++ kref_put(&port->parent->kref, drm_dp_free_mst_branch_device); ++ kfree(port); ++} ++ + static void drm_dp_destroy_connector_work(struct work_struct *work) + { + struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, destroy_connector_work); +@@ -2769,13 +2827,22 @@ static void drm_dp_destroy_connector_work(struct work_struct *work) + list_del(&port->next); + mutex_unlock(&mgr->destroy_connector_lock); + ++ kref_init(&port->kref); ++ INIT_LIST_HEAD(&port->next); ++ + mgr->cbs->destroy_connector(mgr, port->connector); + + drm_dp_port_teardown_pdt(port, port->pdt); + +- if (!port->input && port->vcpi.vcpi > 0) +- drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi); +- kfree(port); ++ if (!port->input && port->vcpi.vcpi > 0) { ++ if (mgr->mst_state) { ++ drm_dp_mst_reset_vcpi_slots(mgr, port); ++ drm_dp_update_payload_part1(mgr); ++ drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi); ++ } ++ } ++ ++ kref_put(&port->kref, drm_dp_free_mst_port); + send_hotplug = true; + } + if (send_hotplug) +diff --git a/drivers/gpu/drm/gma500/gem.c b/drivers/gpu/drm/gma500/gem.c +index c707fa6fca85..e3bdc8b1c32c 100644 +--- a/drivers/gpu/drm/gma500/gem.c ++++ b/drivers/gpu/drm/gma500/gem.c +@@ -130,7 +130,7 @@ int psb_gem_create(struct drm_file *file, struct drm_device *dev, u64 size, + return ret; + } + /* We have the initial and handle reference but need only one now */ +- drm_gem_object_unreference(&r->gem); ++ drm_gem_object_unreference_unlocked(&r->gem); + *handlep = handle; + return 0; + } +diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c +index bb292143997e..adf74f4366bb 100644 +--- a/drivers/gpu/drm/radeon/atombios_encoders.c ++++ b/drivers/gpu/drm/radeon/atombios_encoders.c +@@ -892,8 +892,6 @@ atombios_dig_encoder_setup2(struct drm_encoder *encoder, int action, int panel_m + else + args.v1.ucLaneNum = 4; + +- if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000)) +- args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; + switch (radeon_encoder->encoder_id) { + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: + args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1; +@@ -910,6 +908,10 @@ atombios_dig_encoder_setup2(struct drm_encoder *encoder, int action, int panel_m + args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKB; + else + args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKA; ++ ++ if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000)) ++ args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; ++ + break; + case 2: + case 3: +diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c +index 8bc7d0bbd3c8..1523cf94bcdc 100644 +--- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c ++++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c +@@ -62,6 +62,10 @@ bool radeon_has_atpx(void) { + return radeon_atpx_priv.atpx_detected; + } + ++bool radeon_has_atpx_dgpu_power_cntl(void) { ++ return radeon_atpx_priv.atpx.functions.power_cntl; ++} ++ + /** + * radeon_atpx_call - call an ATPX method + * +@@ -141,10 +145,6 @@ static void radeon_atpx_parse_functions(struct radeon_atpx_functions *f, u32 mas + */ + static int radeon_atpx_validate(struct radeon_atpx *atpx) + { +- /* make sure required functions are enabled */ +- /* dGPU power control is required */ +- atpx->functions.power_cntl = true; +- + if (atpx->functions.px_params) { + union acpi_object *info; + struct atpx_px_params output; +diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c +index ccab94ed9d94..9cbdd8aac28f 100644 +--- a/drivers/gpu/drm/radeon/radeon_device.c ++++ b/drivers/gpu/drm/radeon/radeon_device.c +@@ -103,6 +103,12 @@ static const char radeon_family_name[][16] = { + "LAST", + }; + ++#if defined(CONFIG_VGA_SWITCHEROO) ++bool radeon_has_atpx_dgpu_power_cntl(void); ++#else ++static inline bool radeon_has_atpx_dgpu_power_cntl(void) { return false; } ++#endif ++ + #define RADEON_PX_QUIRK_DISABLE_PX (1 << 0) + #define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1) + +@@ -1427,7 +1433,7 @@ int radeon_device_init(struct radeon_device *rdev, + * ignore it */ + vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); + +- if (rdev->flags & RADEON_IS_PX) ++ if ((rdev->flags & RADEON_IS_PX) && radeon_has_atpx_dgpu_power_cntl()) + runtime = true; + vga_switcheroo_register_client(rdev->pdev, &radeon_switcheroo_ops, runtime); + if (runtime) +@@ -1734,7 +1740,6 @@ int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon) + } + + drm_kms_helper_poll_enable(dev); +- drm_helper_hpd_irq_event(dev); + + /* set the power state here in case we are a PX system or headless */ + if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) +diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c +index 634793ea8418..3fa9f67ba8df 100644 +--- a/drivers/gpu/drm/radeon/radeon_fb.c ++++ b/drivers/gpu/drm/radeon/radeon_fb.c +@@ -333,7 +333,8 @@ out_unref: + + void radeon_fb_output_poll_changed(struct radeon_device *rdev) + { +- drm_fb_helper_hotplug_event(&rdev->mode_info.rfbdev->helper); ++ if (rdev->mode_info.rfbdev) ++ drm_fb_helper_hotplug_event(&rdev->mode_info.rfbdev->helper); + } + + static int radeon_fbdev_destroy(struct drm_device *dev, struct radeon_fbdev *rfbdev) +@@ -373,6 +374,10 @@ int radeon_fbdev_init(struct radeon_device *rdev) + int bpp_sel = 32; + int ret; + ++ /* don't enable fbdev if no connectors */ ++ if (list_empty(&rdev->ddev->mode_config.connector_list)) ++ return 0; ++ + /* select 8 bpp console on RN50 or 16MB cards */ + if (ASIC_IS_RN50(rdev) || rdev->mc.real_vram_size <= (32*1024*1024)) + bpp_sel = 8; +@@ -425,11 +430,15 @@ void radeon_fbdev_fini(struct radeon_device *rdev) + + void radeon_fbdev_set_suspend(struct radeon_device *rdev, int state) + { +- fb_set_suspend(rdev->mode_info.rfbdev->helper.fbdev, state); ++ if (rdev->mode_info.rfbdev) ++ fb_set_suspend(rdev->mode_info.rfbdev->helper.fbdev, state); + } + + bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj) + { ++ if (!rdev->mode_info.rfbdev) ++ return false; ++ + if (robj == gem_to_radeon_bo(rdev->mode_info.rfbdev->rfb.obj)) + return true; + return false; +@@ -437,10 +446,12 @@ bool radeon_fbdev_robj_is_fb(struct radeon_device *rdev, struct radeon_bo *robj) + + void radeon_fb_add_connector(struct radeon_device *rdev, struct drm_connector *connector) + { +- drm_fb_helper_add_one_connector(&rdev->mode_info.rfbdev->helper, connector); ++ if (rdev->mode_info.rfbdev) ++ drm_fb_helper_add_one_connector(&rdev->mode_info.rfbdev->helper, connector); + } + + void radeon_fb_remove_connector(struct radeon_device *rdev, struct drm_connector *connector) + { +- drm_fb_helper_remove_one_connector(&rdev->mode_info.rfbdev->helper, connector); ++ if (rdev->mode_info.rfbdev) ++ drm_fb_helper_remove_one_connector(&rdev->mode_info.rfbdev->helper, connector); + } +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index 9ce9dfeb1258..bc23db196930 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -2584,9 +2584,10 @@ int hid_add_device(struct hid_device *hdev) + /* + * Scan generic devices for group information + */ +- if (hid_ignore_special_drivers || +- (!hdev->group && +- !hid_match_id(hdev, hid_have_special_driver))) { ++ if (hid_ignore_special_drivers) { ++ hdev->group = HID_GROUP_GENERIC; ++ } else if (!hdev->group && ++ !hid_match_id(hdev, hid_have_special_driver)) { + ret = hid_scan_report(hdev); + if (ret) + hid_warn(hdev, "bad device descriptor (%d)\n", ret); +diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c +index 6a9b05b328a9..1180664d1206 100644 +--- a/drivers/hid/hid-multitouch.c ++++ b/drivers/hid/hid-multitouch.c +@@ -322,8 +322,19 @@ static void mt_feature_mapping(struct hid_device *hdev, + break; + } + +- td->inputmode = field->report->id; +- td->inputmode_index = usage->usage_index; ++ if (td->inputmode < 0) { ++ td->inputmode = field->report->id; ++ td->inputmode_index = usage->usage_index; ++ } else { ++ /* ++ * Some elan panels wrongly declare 2 input mode ++ * features, and silently ignore when we set the ++ * value in the second field. Skip the second feature ++ * and hope for the best. ++ */ ++ dev_info(&hdev->dev, ++ "Ignoring the extra HID_DG_INPUTMODE\n"); ++ } + + break; + case HID_DG_CONTACTMAX: +diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c +index 92d6cdf02460..c4c9d9523694 100644 +--- a/drivers/hid/i2c-hid/i2c-hid.c ++++ b/drivers/hid/i2c-hid/i2c-hid.c +@@ -280,17 +280,21 @@ static int i2c_hid_set_or_send_report(struct i2c_client *client, u8 reportType, + u16 dataRegister = le16_to_cpu(ihid->hdesc.wDataRegister); + u16 outputRegister = le16_to_cpu(ihid->hdesc.wOutputRegister); + u16 maxOutputLength = le16_to_cpu(ihid->hdesc.wMaxOutputLength); ++ u16 size; ++ int args_len; ++ int index = 0; ++ ++ i2c_hid_dbg(ihid, "%s\n", __func__); ++ ++ if (data_len > ihid->bufsize) ++ return -EINVAL; + +- /* hid_hw_* already checked that data_len < HID_MAX_BUFFER_SIZE */ +- u16 size = 2 /* size */ + ++ size = 2 /* size */ + + (reportID ? 1 : 0) /* reportID */ + + data_len /* buf */; +- int args_len = (reportID >= 0x0F ? 1 : 0) /* optional third byte */ + ++ args_len = (reportID >= 0x0F ? 1 : 0) /* optional third byte */ + + 2 /* dataRegister */ + + size /* args */; +- int index = 0; +- +- i2c_hid_dbg(ihid, "%s\n", __func__); + + if (!use_data && maxOutputLength == 0) + return -ENOSYS; +diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c +index eab5bd6a2442..1764a168888c 100644 +--- a/drivers/hid/usbhid/hid-core.c ++++ b/drivers/hid/usbhid/hid-core.c +@@ -477,8 +477,6 @@ static void hid_ctrl(struct urb *urb) + struct usbhid_device *usbhid = hid->driver_data; + int unplug = 0, status = urb->status; + +- spin_lock(&usbhid->lock); +- + switch (status) { + case 0: /* success */ + if (usbhid->ctrl[usbhid->ctrltail].dir == USB_DIR_IN) +@@ -498,6 +496,8 @@ static void hid_ctrl(struct urb *urb) + hid_warn(urb->dev, "ctrl urb status %d received\n", status); + } + ++ spin_lock(&usbhid->lock); ++ + if (unplug) { + usbhid->ctrltail = usbhid->ctrlhead; + } else { +diff --git a/drivers/iio/dac/mcp4725.c b/drivers/iio/dac/mcp4725.c +index 43d14588448d..b4dde8315210 100644 +--- a/drivers/iio/dac/mcp4725.c ++++ b/drivers/iio/dac/mcp4725.c +@@ -300,6 +300,7 @@ static int mcp4725_probe(struct i2c_client *client, + data->client = client; + + indio_dev->dev.parent = &client->dev; ++ indio_dev->name = id->name; + indio_dev->info = &mcp4725_info; + indio_dev->channels = &mcp4725_channel; + indio_dev->num_channels = 1; +diff --git a/drivers/iio/imu/adis_buffer.c b/drivers/iio/imu/adis_buffer.c +index cb32b593f1c5..36607d52fee0 100644 +--- a/drivers/iio/imu/adis_buffer.c ++++ b/drivers/iio/imu/adis_buffer.c +@@ -43,7 +43,7 @@ int adis_update_scan_mode(struct iio_dev *indio_dev, + return -ENOMEM; + + rx = adis->buffer; +- tx = rx + indio_dev->scan_bytes; ++ tx = rx + scan_count; + + spi_message_init(&adis->msg); + +diff --git a/drivers/iio/pressure/mpl115.c b/drivers/iio/pressure/mpl115.c +index f5ecd6e19f5d..a0d7deeac62f 100644 +--- a/drivers/iio/pressure/mpl115.c ++++ b/drivers/iio/pressure/mpl115.c +@@ -117,7 +117,7 @@ static int mpl115_read_raw(struct iio_dev *indio_dev, + *val = ret >> 6; + return IIO_VAL_INT; + case IIO_CHAN_INFO_OFFSET: +- *val = 605; ++ *val = -605; + *val2 = 750000; + return IIO_VAL_INT_PLUS_MICRO; + case IIO_CHAN_INFO_SCALE: +diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c +index cb78b1e9bcd9..f504ba73e5dc 100644 +--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c ++++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c +@@ -149,7 +149,7 @@ static int iwch_l2t_send(struct t3cdev *tdev, struct sk_buff *skb, struct l2t_en + error = l2t_send(tdev, skb, l2e); + if (error < 0) + kfree_skb(skb); +- return error; ++ return error < 0 ? error : 0; + } + + int iwch_cxgb3_ofld_send(struct t3cdev *tdev, struct sk_buff *skb) +@@ -165,7 +165,7 @@ int iwch_cxgb3_ofld_send(struct t3cdev *tdev, struct sk_buff *skb) + error = cxgb3_ofld_send(tdev, skb); + if (error < 0) + kfree_skb(skb); +- return error; ++ return error < 0 ? error : 0; + } + + static void release_tid(struct t3cdev *tdev, u32 hwtid, struct sk_buff *skb) +diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c +index 353e2ab090ee..b52a704c3449 100644 +--- a/drivers/infiniband/ulp/isert/ib_isert.c ++++ b/drivers/infiniband/ulp/isert/ib_isert.c +@@ -865,7 +865,7 @@ isert_put_conn(struct isert_conn *isert_conn) + * @isert_conn: isert connection struct + * + * Notes: +- * In case the connection state is FULL_FEATURE, move state ++ * In case the connection state is BOUND, move state + * to TEMINATING and start teardown sequence (rdma_disconnect). + * In case the connection state is UP, complete flush as well. + * +@@ -881,6 +881,7 @@ isert_conn_terminate(struct isert_conn *isert_conn) + case ISER_CONN_TERMINATING: + break; + case ISER_CONN_UP: ++ case ISER_CONN_BOUND: + case ISER_CONN_FULL_FEATURE: /* FALLTHRU */ + isert_info("Terminating conn %p state %d\n", + isert_conn, isert_conn->state); +@@ -927,14 +928,9 @@ isert_disconnected_handler(struct rdma_cm_id *cma_id, + enum rdma_cm_event_type event) + { + struct isert_np *isert_np = cma_id->context; +- struct isert_conn *isert_conn; ++ struct isert_conn *isert_conn = cma_id->qp->qp_context; + bool terminating = false; + +- if (isert_np->np_cm_id == cma_id) +- return isert_np_cma_handler(cma_id->context, event); +- +- isert_conn = cma_id->qp->qp_context; +- + mutex_lock(&isert_conn->mutex); + terminating = (isert_conn->state == ISER_CONN_TERMINATING); + isert_conn_terminate(isert_conn); +@@ -972,11 +968,15 @@ isert_connect_error(struct rdma_cm_id *cma_id) + static int + isert_cma_handler(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) + { ++ struct isert_np *isert_np = cma_id->context; + int ret = 0; + + isert_info("event %d status %d id %p np %p\n", event->event, + event->status, cma_id, cma_id->context); + ++ if (isert_np->np_cm_id == cma_id) ++ return isert_np_cma_handler(cma_id->context, event->event); ++ + switch (event->event) { + case RDMA_CM_EVENT_CONNECT_REQUEST: + ret = isert_connect_request(cma_id, event); +@@ -2059,7 +2059,8 @@ is_isert_tx_desc(struct isert_conn *isert_conn, void *wr_id) + void *start = isert_conn->rx_descs; + int len = ISERT_QP_MAX_RECV_DTOS * sizeof(*isert_conn->rx_descs); + +- if (wr_id >= start && wr_id < start + len) ++ if ((wr_id >= start && wr_id < start + len) || ++ (wr_id == isert_conn->login_req_buf)) + return false; + + return true; +@@ -2085,7 +2086,8 @@ isert_cq_comp_err(struct isert_conn *isert_conn, struct ib_wc *wc) + isert_completion_put(desc, isert_cmd, ib_dev, true); + } else { + isert_conn->post_recv_buf_count--; +- if (!isert_conn->post_recv_buf_count) ++ if (!isert_conn->post_recv_buf_count && ++ isert_conn->state >= ISER_CONN_BOUND) + iscsit_cause_connection_reinstatement(isert_conn->conn, 0); + } + } +@@ -3268,6 +3270,7 @@ accept_wait: + + conn->context = isert_conn; + isert_conn->conn = conn; ++ isert_conn->state = ISER_CONN_BOUND; + + isert_set_conn_info(np, conn, isert_conn); + +diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h +index 9ec23a786c02..621c222f3235 100644 +--- a/drivers/infiniband/ulp/isert/ib_isert.h ++++ b/drivers/infiniband/ulp/isert/ib_isert.h +@@ -50,6 +50,7 @@ enum iser_ib_op_code { + enum iser_conn_state { + ISER_CONN_INIT, + ISER_CONN_UP, ++ ISER_CONN_BOUND, + ISER_CONN_FULL_FEATURE, + ISER_CONN_TERMINATING, + ISER_CONN_DOWN, +diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c +index 6fbc7bc824d2..27e5b0090e40 100644 +--- a/drivers/infiniband/ulp/srpt/ib_srpt.c ++++ b/drivers/infiniband/ulp/srpt/ib_srpt.c +@@ -1742,47 +1742,6 @@ send_sense: + return -1; + } + +-/** +- * srpt_rx_mgmt_fn_tag() - Process a task management function by tag. +- * @ch: RDMA channel of the task management request. +- * @fn: Task management function to perform. +- * @req_tag: Tag of the SRP task management request. +- * @mgmt_ioctx: I/O context of the task management request. +- * +- * Returns zero if the target core will process the task management +- * request asynchronously. +- * +- * Note: It is assumed that the initiator serializes tag-based task management +- * requests. +- */ +-static int srpt_rx_mgmt_fn_tag(struct srpt_send_ioctx *ioctx, u64 tag) +-{ +- struct srpt_device *sdev; +- struct srpt_rdma_ch *ch; +- struct srpt_send_ioctx *target; +- int ret, i; +- +- ret = -EINVAL; +- ch = ioctx->ch; +- BUG_ON(!ch); +- BUG_ON(!ch->sport); +- sdev = ch->sport->sdev; +- BUG_ON(!sdev); +- spin_lock_irq(&sdev->spinlock); +- for (i = 0; i < ch->rq_size; ++i) { +- target = ch->ioctx_ring[i]; +- if (target->cmd.se_lun == ioctx->cmd.se_lun && +- target->tag == tag && +- srpt_get_cmd_state(target) != SRPT_STATE_DONE) { +- ret = 0; +- /* now let the target core abort &target->cmd; */ +- break; +- } +- } +- spin_unlock_irq(&sdev->spinlock); +- return ret; +-} +- + static int srp_tmr_to_tcm(int fn) + { + switch (fn) { +@@ -1817,7 +1776,6 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch, + struct se_cmd *cmd; + struct se_session *sess = ch->sess; + uint64_t unpacked_lun; +- uint32_t tag = 0; + int tcm_tmr; + int rc; + +@@ -1833,25 +1791,10 @@ static void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch, + srpt_set_cmd_state(send_ioctx, SRPT_STATE_MGMT); + send_ioctx->tag = srp_tsk->tag; + tcm_tmr = srp_tmr_to_tcm(srp_tsk->tsk_mgmt_func); +- if (tcm_tmr < 0) { +- send_ioctx->cmd.se_tmr_req->response = +- TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED; +- goto fail; +- } + unpacked_lun = srpt_unpack_lun((uint8_t *)&srp_tsk->lun, + sizeof(srp_tsk->lun)); +- +- if (srp_tsk->tsk_mgmt_func == SRP_TSK_ABORT_TASK) { +- rc = srpt_rx_mgmt_fn_tag(send_ioctx, srp_tsk->task_tag); +- if (rc < 0) { +- send_ioctx->cmd.se_tmr_req->response = +- TMR_TASK_DOES_NOT_EXIST; +- goto fail; +- } +- tag = srp_tsk->task_tag; +- } + rc = target_submit_tmr(&send_ioctx->cmd, sess, NULL, unpacked_lun, +- srp_tsk, tcm_tmr, GFP_KERNEL, tag, ++ srp_tsk, tcm_tmr, GFP_KERNEL, srp_tsk->task_tag, + TARGET_SCF_ACK_KREF); + if (rc != 0) { + send_ioctx->cmd.se_tmr_req->response = TMR_FUNCTION_REJECTED; +diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c +index f63341f20b91..e8c6a4842e91 100644 +--- a/drivers/input/misc/ati_remote2.c ++++ b/drivers/input/misc/ati_remote2.c +@@ -817,26 +817,49 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d + + ar2->udev = udev; + ++ /* Sanity check, first interface must have an endpoint */ ++ if (alt->desc.bNumEndpoints < 1 || !alt->endpoint) { ++ dev_err(&interface->dev, ++ "%s(): interface 0 must have an endpoint\n", __func__); ++ r = -ENODEV; ++ goto fail1; ++ } + ar2->intf[0] = interface; + ar2->ep[0] = &alt->endpoint[0].desc; + ++ /* Sanity check, the device must have two interfaces */ + ar2->intf[1] = usb_ifnum_to_if(udev, 1); ++ if ((udev->actconfig->desc.bNumInterfaces < 2) || !ar2->intf[1]) { ++ dev_err(&interface->dev, "%s(): need 2 interfaces, found %d\n", ++ __func__, udev->actconfig->desc.bNumInterfaces); ++ r = -ENODEV; ++ goto fail1; ++ } ++ + r = usb_driver_claim_interface(&ati_remote2_driver, ar2->intf[1], ar2); + if (r) + goto fail1; ++ ++ /* Sanity check, second interface must have an endpoint */ + alt = ar2->intf[1]->cur_altsetting; ++ if (alt->desc.bNumEndpoints < 1 || !alt->endpoint) { ++ dev_err(&interface->dev, ++ "%s(): interface 1 must have an endpoint\n", __func__); ++ r = -ENODEV; ++ goto fail2; ++ } + ar2->ep[1] = &alt->endpoint[0].desc; + + r = ati_remote2_urb_init(ar2); + if (r) +- goto fail2; ++ goto fail3; + + ar2->channel_mask = channel_mask; + ar2->mode_mask = mode_mask; + + r = ati_remote2_setup(ar2, ar2->channel_mask); + if (r) +- goto fail2; ++ goto fail3; + + usb_make_path(udev, ar2->phys, sizeof(ar2->phys)); + strlcat(ar2->phys, "/input0", sizeof(ar2->phys)); +@@ -845,11 +868,11 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d + + r = sysfs_create_group(&udev->dev.kobj, &ati_remote2_attr_group); + if (r) +- goto fail2; ++ goto fail3; + + r = ati_remote2_input_init(ar2); + if (r) +- goto fail3; ++ goto fail4; + + usb_set_intfdata(interface, ar2); + +@@ -857,10 +880,11 @@ static int ati_remote2_probe(struct usb_interface *interface, const struct usb_d + + return 0; + +- fail3: ++ fail4: + sysfs_remove_group(&udev->dev.kobj, &ati_remote2_attr_group); +- fail2: ++ fail3: + ati_remote2_urb_cleanup(ar2); ++ fail2: + usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]); + fail1: + kfree(ar2); +diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c +index ac1fa5f44580..9c0ea36913b4 100644 +--- a/drivers/input/misc/ims-pcu.c ++++ b/drivers/input/misc/ims-pcu.c +@@ -1663,6 +1663,8 @@ static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pc + + pcu->ctrl_intf = usb_ifnum_to_if(pcu->udev, + union_desc->bMasterInterface0); ++ if (!pcu->ctrl_intf) ++ return -EINVAL; + + alt = pcu->ctrl_intf->cur_altsetting; + pcu->ep_ctrl = &alt->endpoint[0].desc; +@@ -1670,6 +1672,8 @@ static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pc + + pcu->data_intf = usb_ifnum_to_if(pcu->udev, + union_desc->bSlaveInterface0); ++ if (!pcu->data_intf) ++ return -EINVAL; + + alt = pcu->data_intf->cur_altsetting; + if (alt->desc.bNumEndpoints != 2) { +diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c +index 63b539d3daba..84909a12ff36 100644 +--- a/drivers/input/misc/powermate.c ++++ b/drivers/input/misc/powermate.c +@@ -307,6 +307,9 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i + int error = -ENOMEM; + + interface = intf->cur_altsetting; ++ if (interface->desc.bNumEndpoints < 1) ++ return -EINVAL; ++ + endpoint = &interface->endpoint[0].desc; + if (!usb_endpoint_is_int_in(endpoint)) + return -EIO; +diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c +index 3a32caf06bf1..8cfeec06d8d9 100644 +--- a/drivers/input/mouse/synaptics.c ++++ b/drivers/input/mouse/synaptics.c +@@ -862,8 +862,9 @@ static void synaptics_report_ext_buttons(struct psmouse *psmouse, + if (!SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap)) + return; + +- /* Bug in FW 8.1, buttons are reported only when ExtBit is 1 */ +- if (SYN_ID_FULL(priv->identity) == 0x801 && ++ /* Bug in FW 8.1 & 8.2, buttons are reported only when ExtBit is 1 */ ++ if ((SYN_ID_FULL(priv->identity) == 0x801 || ++ SYN_ID_FULL(priv->identity) == 0x802) && + !((psmouse->packet[0] ^ psmouse->packet[3]) & 0x02)) + return; + +diff --git a/drivers/irqchip/irq-omap-intc.c b/drivers/irqchip/irq-omap-intc.c +index a569c6dbd1d1..5ba876e9b805 100644 +--- a/drivers/irqchip/irq-omap-intc.c ++++ b/drivers/irqchip/irq-omap-intc.c +@@ -48,6 +48,7 @@ + #define INTC_ILR0 0x0100 + + #define ACTIVEIRQ_MASK 0x7f /* omap2/3 active interrupt bits */ ++#define SPURIOUSIRQ_MASK (0x1ffffff << 7) + #define INTCPS_NR_ILR_REGS 128 + #define INTCPS_NR_MIR_REGS 4 + +@@ -331,37 +332,36 @@ static int __init omap_init_irq(u32 base, struct device_node *node) + static asmlinkage void __exception_irq_entry + omap_intc_handle_irq(struct pt_regs *regs) + { +- u32 irqnr = 0; +- int handled_irq = 0; +- int i; +- +- do { +- for (i = 0; i < omap_nr_pending; i++) { +- irqnr = intc_readl(INTC_PENDING_IRQ0 + (0x20 * i)); +- if (irqnr) +- goto out; +- } +- +-out: +- if (!irqnr) +- break; ++ extern unsigned long irq_err_count; ++ u32 irqnr; + +- irqnr = intc_readl(INTC_SIR); +- irqnr &= ACTIVEIRQ_MASK; +- +- if (irqnr) { +- handle_domain_irq(domain, irqnr, regs); +- handled_irq = 1; +- } +- } while (irqnr); ++ irqnr = intc_readl(INTC_SIR); + + /* +- * If an irq is masked or deasserted while active, we will +- * keep ending up here with no irq handled. So remove it from +- * the INTC with an ack. ++ * A spurious IRQ can result if interrupt that triggered the ++ * sorting is no longer active during the sorting (10 INTC ++ * functional clock cycles after interrupt assertion). Or a ++ * change in interrupt mask affected the result during sorting ++ * time. There is no special handling required except ignoring ++ * the SIR register value just read and retrying. ++ * See section 6.2.5 of AM335x TRM Literature Number: SPRUH73K ++ * ++ * Many a times, a spurious interrupt situation has been fixed ++ * by adding a flush for the posted write acking the IRQ in ++ * the device driver. Typically, this is going be the device ++ * driver whose interrupt was handled just before the spurious ++ * IRQ occurred. Pay attention to those device drivers if you ++ * run into hitting the spurious IRQ condition below. + */ +- if (!handled_irq) ++ if (unlikely((irqnr & SPURIOUSIRQ_MASK) == SPURIOUSIRQ_MASK)) { ++ pr_err_once("%s: spurious irq!\n", __func__); ++ irq_err_count++; + omap_ack_irq(NULL); ++ return; ++ } ++ ++ irqnr &= ACTIVEIRQ_MASK; ++ handle_domain_irq(domain, irqnr, regs); + } + + void __init omap3_init_irq(void) +diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c +index 42522c8f13c6..2a102834c2ee 100644 +--- a/drivers/md/bcache/super.c ++++ b/drivers/md/bcache/super.c +@@ -1046,8 +1046,12 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c) + */ + atomic_set(&dc->count, 1); + +- if (bch_cached_dev_writeback_start(dc)) ++ /* Block writeback thread, but spawn it */ ++ down_write(&dc->writeback_lock); ++ if (bch_cached_dev_writeback_start(dc)) { ++ up_write(&dc->writeback_lock); + return -ENOMEM; ++ } + + if (BDEV_STATE(&dc->sb) == BDEV_STATE_DIRTY) { + bch_sectors_dirty_init(dc); +@@ -1059,6 +1063,9 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c) + bch_cached_dev_run(dc); + bcache_device_link(&dc->disk, c, "bdev"); + ++ /* Allow the writeback thread to proceed */ ++ up_write(&dc->writeback_lock); ++ + pr_info("Caching %s as %s on set %pU", + bdevname(dc->bdev, buf), dc->disk.disk->disk_name, + dc->disk.c->sb.set_uuid); +@@ -1397,6 +1404,9 @@ static void cache_set_flush(struct closure *cl) + struct btree *b; + unsigned i; + ++ if (!c) ++ closure_return(cl); ++ + bch_cache_accounting_destroy(&c->accounting); + + kobject_put(&c->internal); +@@ -1862,11 +1872,12 @@ static int cache_alloc(struct cache_sb *sb, struct cache *ca) + return 0; + } + +-static void register_cache(struct cache_sb *sb, struct page *sb_page, ++static int register_cache(struct cache_sb *sb, struct page *sb_page, + struct block_device *bdev, struct cache *ca) + { + char name[BDEVNAME_SIZE]; +- const char *err = "cannot allocate memory"; ++ const char *err = NULL; ++ int ret = 0; + + memcpy(&ca->sb, sb, sizeof(struct cache_sb)); + ca->bdev = bdev; +@@ -1881,27 +1892,35 @@ static void register_cache(struct cache_sb *sb, struct page *sb_page, + if (blk_queue_discard(bdev_get_queue(ca->bdev))) + ca->discard = CACHE_DISCARD(&ca->sb); + +- if (cache_alloc(sb, ca) != 0) ++ ret = cache_alloc(sb, ca); ++ if (ret != 0) + goto err; + +- err = "error creating kobject"; +- if (kobject_add(&ca->kobj, &part_to_dev(bdev->bd_part)->kobj, "bcache")) +- goto err; ++ if (kobject_add(&ca->kobj, &part_to_dev(bdev->bd_part)->kobj, "bcache")) { ++ err = "error calling kobject_add"; ++ ret = -ENOMEM; ++ goto out; ++ } + + mutex_lock(&bch_register_lock); + err = register_cache_set(ca); + mutex_unlock(&bch_register_lock); + +- if (err) +- goto err; ++ if (err) { ++ ret = -ENODEV; ++ goto out; ++ } + + pr_info("registered cache device %s", bdevname(bdev, name)); ++ + out: + kobject_put(&ca->kobj); +- return; ++ + err: +- pr_notice("error opening %s: %s", bdevname(bdev, name), err); +- goto out; ++ if (err) ++ pr_notice("error opening %s: %s", bdevname(bdev, name), err); ++ ++ return ret; + } + + /* Global interfaces/init */ +@@ -1999,7 +2018,8 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, + if (!ca) + goto err_close; + +- register_cache(sb, sb_page, bdev, ca); ++ if (register_cache(sb, sb_page, bdev, ca) != 0) ++ goto err_close; + } + out: + if (sb_page) +diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c +index cde1d6749017..9b4f73e55d7c 100644 +--- a/drivers/md/dm-thin-metadata.c ++++ b/drivers/md/dm-thin-metadata.c +@@ -1803,5 +1803,8 @@ bool dm_pool_metadata_needs_check(struct dm_pool_metadata *pmd) + + void dm_pool_issue_prefetches(struct dm_pool_metadata *pmd) + { +- dm_tm_issue_prefetches(pmd->tm); ++ down_read(&pmd->root_lock); ++ if (!pmd->fail_io) ++ dm_tm_issue_prefetches(pmd->tm); ++ up_read(&pmd->root_lock); + } +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index 62610aafaac7..1f37781f7765 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -1065,12 +1065,8 @@ static void rq_completed(struct mapped_device *md, int rw, bool run_queue) + * back into ->request_fn() could deadlock attempting to grab the + * queue lock again. + */ +- if (run_queue) { +- if (md->queue->mq_ops) +- blk_mq_run_hw_queues(md->queue, true); +- else +- blk_run_queue_async(md->queue); +- } ++ if (!md->queue->mq_ops && run_queue) ++ blk_run_queue_async(md->queue); + + /* + * dm_put() must be at the end of this function. See the comment above +@@ -1296,7 +1292,10 @@ static void dm_complete_request(struct request *rq, int error) + struct dm_rq_target_io *tio = tio_from_request(rq); + + tio->error = error; +- blk_complete_request(rq); ++ if (!rq->q->mq_ops) ++ blk_complete_request(rq); ++ else ++ blk_mq_complete_request(rq); + } + + /* +diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c +index ac3ede2bd00e..ac37ef18201c 100644 +--- a/drivers/md/multipath.c ++++ b/drivers/md/multipath.c +@@ -129,7 +129,9 @@ static void multipath_make_request(struct mddev *mddev, struct bio * bio) + } + multipath = conf->multipaths + mp_bh->path; + +- mp_bh->bio = *bio; ++ bio_init(&mp_bh->bio); ++ __bio_clone_fast(&mp_bh->bio, bio); ++ + mp_bh->bio.bi_iter.bi_sector += multipath->rdev->data_offset; + mp_bh->bio.bi_bdev = multipath->rdev->bdev; + mp_bh->bio.bi_rw |= REQ_FAILFAST_TRANSPORT; +diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c +index 0d767e31f455..ef0a99a3a779 100644 +--- a/drivers/md/raid5.c ++++ b/drivers/md/raid5.c +@@ -2080,6 +2080,14 @@ static int resize_chunks(struct r5conf *conf, int new_disks, int new_sectors) + unsigned long cpu; + int err = 0; + ++ /* ++ * Never shrink. And mddev_suspend() could deadlock if this is called ++ * from raid5d. In that case, scribble_disks and scribble_sectors ++ * should equal to new_disks and new_sectors ++ */ ++ if (conf->scribble_disks >= new_disks && ++ conf->scribble_sectors >= new_sectors) ++ return 0; + mddev_suspend(conf->mddev); + get_online_cpus(); + for_each_present_cpu(cpu) { +@@ -2101,6 +2109,10 @@ static int resize_chunks(struct r5conf *conf, int new_disks, int new_sectors) + } + put_online_cpus(); + mddev_resume(conf->mddev); ++ if (!err) { ++ conf->scribble_disks = new_disks; ++ conf->scribble_sectors = new_sectors; ++ } + return err; + } + +@@ -4220,7 +4232,6 @@ static void break_stripe_batch_list(struct stripe_head *head_sh, + WARN_ON_ONCE(sh->state & ((1 << STRIPE_ACTIVE) | + (1 << STRIPE_SYNCING) | + (1 << STRIPE_REPLACED) | +- (1 << STRIPE_PREREAD_ACTIVE) | + (1 << STRIPE_DELAYED) | + (1 << STRIPE_BIT_DELAY) | + (1 << STRIPE_FULL_WRITE) | +@@ -4235,6 +4246,7 @@ static void break_stripe_batch_list(struct stripe_head *head_sh, + (1 << STRIPE_REPLACED))); + + set_mask_bits(&sh->state, ~(STRIPE_EXPAND_SYNC_FLAGS | ++ (1 << STRIPE_PREREAD_ACTIVE) | + (1 << STRIPE_DEGRADED)), + head_sh->state & (1 << STRIPE_INSYNC)); + +@@ -6366,6 +6378,12 @@ static int raid5_alloc_percpu(struct r5conf *conf) + } + put_online_cpus(); + ++ if (!err) { ++ conf->scribble_disks = max(conf->raid_disks, ++ conf->previous_raid_disks); ++ conf->scribble_sectors = max(conf->chunk_sectors, ++ conf->prev_chunk_sectors); ++ } + return err; + } + +@@ -6942,8 +6960,8 @@ static int run(struct mddev *mddev) + } + + if (discard_supported && +- mddev->queue->limits.max_discard_sectors >= stripe && +- mddev->queue->limits.discard_granularity >= stripe) ++ mddev->queue->limits.max_discard_sectors >= (stripe >> 9) && ++ mddev->queue->limits.discard_granularity >= stripe) + queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, + mddev->queue); + else +diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h +index 03472fbbd882..d31ed93bb8a9 100644 +--- a/drivers/md/raid5.h ++++ b/drivers/md/raid5.h +@@ -501,6 +501,8 @@ struct r5conf { + * conversions + */ + } __percpu *percpu; ++ int scribble_disks; ++ int scribble_sectors; + #ifdef CONFIG_HOTPLUG_CPU + struct notifier_block cpu_notify; + #endif +diff --git a/drivers/media/i2c/adv7511.c b/drivers/media/i2c/adv7511.c +index 12d93203d405..57bb74299643 100644 +--- a/drivers/media/i2c/adv7511.c ++++ b/drivers/media/i2c/adv7511.c +@@ -1048,12 +1048,23 @@ static void adv7511_dbg_dump_edid(int lvl, int debug, struct v4l2_subdev *sd, in + } + } + ++static void adv7511_notify_no_edid(struct v4l2_subdev *sd) ++{ ++ struct adv7511_state *state = get_adv7511_state(sd); ++ struct adv7511_edid_detect ed; ++ ++ /* We failed to read the EDID, so send an event for this. */ ++ ed.present = false; ++ ed.segment = adv7511_rd(sd, 0xc4); ++ v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed); ++ v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, 0x0); ++} ++ + static void adv7511_edid_handler(struct work_struct *work) + { + struct delayed_work *dwork = to_delayed_work(work); + struct adv7511_state *state = container_of(dwork, struct adv7511_state, edid_handler); + struct v4l2_subdev *sd = &state->sd; +- struct adv7511_edid_detect ed; + + v4l2_dbg(1, debug, sd, "%s:\n", __func__); + +@@ -1078,9 +1089,7 @@ static void adv7511_edid_handler(struct work_struct *work) + } + + /* We failed to read the EDID, so send an event for this. */ +- ed.present = false; +- ed.segment = adv7511_rd(sd, 0xc4); +- v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed); ++ adv7511_notify_no_edid(sd); + v4l2_dbg(1, debug, sd, "%s: no edid found\n", __func__); + } + +@@ -1151,7 +1160,6 @@ static void adv7511_check_monitor_present_status(struct v4l2_subdev *sd) + /* update read only ctrls */ + v4l2_ctrl_s_ctrl(state->hotplug_ctrl, adv7511_have_hotplug(sd) ? 0x1 : 0x0); + v4l2_ctrl_s_ctrl(state->rx_sense_ctrl, adv7511_have_rx_sense(sd) ? 0x1 : 0x0); +- v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 0x0); + + if ((status & MASK_ADV7511_HPD_DETECT) && ((status & MASK_ADV7511_MSEN_DETECT) || state->edid.segments)) { + v4l2_dbg(1, debug, sd, "%s: hotplug and (rx-sense or edid)\n", __func__); +@@ -1181,6 +1189,7 @@ static void adv7511_check_monitor_present_status(struct v4l2_subdev *sd) + } + adv7511_s_power(sd, false); + memset(&state->edid, 0, sizeof(struct adv7511_state_edid)); ++ adv7511_notify_no_edid(sd); + } + } + +@@ -1257,6 +1266,7 @@ static bool adv7511_check_edid_status(struct v4l2_subdev *sd) + } + /* one more segment read ok */ + state->edid.segments = segment + 1; ++ v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, 0x1); + if (((state->edid.data[0x7e] >> 1) + 1) > state->edid.segments) { + /* Request next EDID segment */ + v4l2_dbg(1, debug, sd, "%s: request segment %d\n", __func__, state->edid.segments); +@@ -1276,7 +1286,6 @@ static bool adv7511_check_edid_status(struct v4l2_subdev *sd) + ed.present = true; + ed.segment = 0; + state->edid_detect_counter++; +- v4l2_ctrl_s_ctrl(state->have_edid0_ctrl, state->edid.segments ? 0x1 : 0x0); + v4l2_subdev_notify(sd, ADV7511_EDID_DETECT, (void *)&ed); + return ed.present; + } +diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c +index bc12060e0882..88a9d3a10131 100644 +--- a/drivers/media/pci/bt8xx/bttv-driver.c ++++ b/drivers/media/pci/bt8xx/bttv-driver.c +@@ -2334,6 +2334,19 @@ static int bttv_g_fmt_vid_overlay(struct file *file, void *priv, + return 0; + } + ++static void bttv_get_width_mask_vid_cap(const struct bttv_format *fmt, ++ unsigned int *width_mask, ++ unsigned int *width_bias) ++{ ++ if (fmt->flags & FORMAT_FLAGS_PLANAR) { ++ *width_mask = ~15; /* width must be a multiple of 16 pixels */ ++ *width_bias = 8; /* nearest */ ++ } else { ++ *width_mask = ~3; /* width must be a multiple of 4 pixels */ ++ *width_bias = 2; /* nearest */ ++ } ++} ++ + static int bttv_try_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_format *f) + { +@@ -2343,6 +2356,7 @@ static int bttv_try_fmt_vid_cap(struct file *file, void *priv, + enum v4l2_field field; + __s32 width, height; + __s32 height2; ++ unsigned int width_mask, width_bias; + int rc; + + fmt = format_by_fourcc(f->fmt.pix.pixelformat); +@@ -2375,9 +2389,9 @@ static int bttv_try_fmt_vid_cap(struct file *file, void *priv, + width = f->fmt.pix.width; + height = f->fmt.pix.height; + ++ bttv_get_width_mask_vid_cap(fmt, &width_mask, &width_bias); + rc = limit_scaled_size_lock(fh, &width, &height, field, +- /* width_mask: 4 pixels */ ~3, +- /* width_bias: nearest */ 2, ++ width_mask, width_bias, + /* adjust_size */ 1, + /* adjust_crop */ 0); + if (0 != rc) +@@ -2410,6 +2424,7 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv, + struct bttv_fh *fh = priv; + struct bttv *btv = fh->btv; + __s32 width, height; ++ unsigned int width_mask, width_bias; + enum v4l2_field field; + + retval = bttv_switch_type(fh, f->type); +@@ -2424,9 +2439,10 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv, + height = f->fmt.pix.height; + field = f->fmt.pix.field; + ++ fmt = format_by_fourcc(f->fmt.pix.pixelformat); ++ bttv_get_width_mask_vid_cap(fmt, &width_mask, &width_bias); + retval = limit_scaled_size_lock(fh, &width, &height, f->fmt.pix.field, +- /* width_mask: 4 pixels */ ~3, +- /* width_bias: nearest */ 2, ++ width_mask, width_bias, + /* adjust_size */ 1, + /* adjust_crop */ 1); + if (0 != retval) +@@ -2434,8 +2450,6 @@ static int bttv_s_fmt_vid_cap(struct file *file, void *priv, + + f->fmt.pix.field = field; + +- fmt = format_by_fourcc(f->fmt.pix.pixelformat); +- + /* update our state informations */ + fh->fmt = fmt; + fh->cap.field = f->fmt.pix.field; +diff --git a/drivers/media/pci/saa7134/saa7134-video.c b/drivers/media/pci/saa7134/saa7134-video.c +index 99d09a7566d3..175d3c1f1e6d 100644 +--- a/drivers/media/pci/saa7134/saa7134-video.c ++++ b/drivers/media/pci/saa7134/saa7134-video.c +@@ -1211,10 +1211,13 @@ static int saa7134_g_fmt_vid_cap(struct file *file, void *priv, + f->fmt.pix.height = dev->height; + f->fmt.pix.field = dev->field; + f->fmt.pix.pixelformat = dev->fmt->fourcc; +- f->fmt.pix.bytesperline = +- (f->fmt.pix.width * dev->fmt->depth) >> 3; ++ if (dev->fmt->planar) ++ f->fmt.pix.bytesperline = f->fmt.pix.width; ++ else ++ f->fmt.pix.bytesperline = ++ (f->fmt.pix.width * dev->fmt->depth) / 8; + f->fmt.pix.sizeimage = +- f->fmt.pix.height * f->fmt.pix.bytesperline; ++ (f->fmt.pix.height * f->fmt.pix.width * dev->fmt->depth) / 8; + f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; + return 0; + } +@@ -1290,10 +1293,13 @@ static int saa7134_try_fmt_vid_cap(struct file *file, void *priv, + if (f->fmt.pix.height > maxh) + f->fmt.pix.height = maxh; + f->fmt.pix.width &= ~0x03; +- f->fmt.pix.bytesperline = +- (f->fmt.pix.width * fmt->depth) >> 3; ++ if (fmt->planar) ++ f->fmt.pix.bytesperline = f->fmt.pix.width; ++ else ++ f->fmt.pix.bytesperline = ++ (f->fmt.pix.width * fmt->depth) / 8; + f->fmt.pix.sizeimage = +- f->fmt.pix.height * f->fmt.pix.bytesperline; ++ (f->fmt.pix.height * f->fmt.pix.width * fmt->depth) / 8; + f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; + + return 0; +diff --git a/drivers/media/tuners/si2157.c b/drivers/media/tuners/si2157.c +index c5dbba5b5bc9..6684e2ee3db1 100644 +--- a/drivers/media/tuners/si2157.c ++++ b/drivers/media/tuners/si2157.c +@@ -167,6 +167,7 @@ static int si2157_init(struct dvb_frontend *fe) + len = fw->data[fw->size - remaining]; + if (len > SI2157_ARGLEN) { + dev_err(&client->dev, "Bad firmware length\n"); ++ ret = -EINVAL; + goto err_release_firmware; + } + memcpy(cmd.args, &fw->data[(fw->size - remaining) + 1], len); +diff --git a/drivers/media/usb/pwc/pwc-if.c b/drivers/media/usb/pwc/pwc-if.c +index 702267e208ba..a7e1f6f37790 100644 +--- a/drivers/media/usb/pwc/pwc-if.c ++++ b/drivers/media/usb/pwc/pwc-if.c +@@ -91,6 +91,7 @@ static const struct usb_device_id pwc_device_table [] = { + { USB_DEVICE(0x0471, 0x0312) }, + { USB_DEVICE(0x0471, 0x0313) }, /* the 'new' 720K */ + { USB_DEVICE(0x0471, 0x0329) }, /* Philips SPC 900NC PC Camera */ ++ { USB_DEVICE(0x0471, 0x032C) }, /* Philips SPC 880NC PC Camera */ + { USB_DEVICE(0x069A, 0x0001) }, /* Askey */ + { USB_DEVICE(0x046D, 0x08B0) }, /* Logitech QuickCam Pro 3000 */ + { USB_DEVICE(0x046D, 0x08B1) }, /* Logitech QuickCam Notebook Pro */ +@@ -802,6 +803,11 @@ static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id + name = "Philips SPC 900NC webcam"; + type_id = 740; + break; ++ case 0x032C: ++ PWC_INFO("Philips SPC 880NC USB webcam detected.\n"); ++ name = "Philips SPC 880NC webcam"; ++ type_id = 740; ++ break; + default: + return -ENODEV; + break; +diff --git a/drivers/media/usb/usbvision/usbvision-video.c b/drivers/media/usb/usbvision/usbvision-video.c +index 12b403e78d52..ef5815de2785 100644 +--- a/drivers/media/usb/usbvision/usbvision-video.c ++++ b/drivers/media/usb/usbvision/usbvision-video.c +@@ -1524,9 +1524,23 @@ static int usbvision_probe(struct usb_interface *intf, + + if (usbvision_device_data[model].interface >= 0) + interface = &dev->actconfig->interface[usbvision_device_data[model].interface]->altsetting[0]; +- else ++ else if (ifnum < dev->actconfig->desc.bNumInterfaces) + interface = &dev->actconfig->interface[ifnum]->altsetting[0]; ++ else { ++ dev_err(&intf->dev, "interface %d is invalid, max is %d\n", ++ ifnum, dev->actconfig->desc.bNumInterfaces - 1); ++ ret = -ENODEV; ++ goto err_usb; ++ } ++ ++ if (interface->desc.bNumEndpoints < 2) { ++ dev_err(&intf->dev, "interface %d has %d endpoints, but must" ++ " have minimum 2\n", ifnum, interface->desc.bNumEndpoints); ++ ret = -ENODEV; ++ goto err_usb; ++ } + endpoint = &interface->endpoint[1].desc; ++ + if (!usb_endpoint_xfer_isoc(endpoint)) { + dev_err(&intf->dev, "%s: interface %d. has non-ISO endpoint!\n", + __func__, ifnum); +diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +index af635430524e..8085059ce925 100644 +--- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c ++++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +@@ -394,7 +394,8 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user + get_user(kp->index, &up->index) || + get_user(kp->type, &up->type) || + get_user(kp->flags, &up->flags) || +- get_user(kp->memory, &up->memory)) ++ get_user(kp->memory, &up->memory) || ++ get_user(kp->length, &up->length)) + return -EFAULT; + + if (V4L2_TYPE_IS_OUTPUT(kp->type)) +@@ -406,9 +407,6 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user + return -EFAULT; + + if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) { +- if (get_user(kp->length, &up->length)) +- return -EFAULT; +- + num_planes = kp->length; + if (num_planes == 0) { + kp->m.planes = NULL; +@@ -441,16 +439,14 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user + } else { + switch (kp->memory) { + case V4L2_MEMORY_MMAP: +- if (get_user(kp->length, &up->length) || +- get_user(kp->m.offset, &up->m.offset)) ++ if (get_user(kp->m.offset, &up->m.offset)) + return -EFAULT; + break; + case V4L2_MEMORY_USERPTR: + { + compat_long_t tmp; + +- if (get_user(kp->length, &up->length) || +- get_user(tmp, &up->m.userptr)) ++ if (get_user(tmp, &up->m.userptr)) + return -EFAULT; + + kp->m.userptr = (unsigned long)compat_ptr(tmp); +@@ -492,7 +488,8 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user + copy_to_user(&up->timecode, &kp->timecode, sizeof(struct v4l2_timecode)) || + put_user(kp->sequence, &up->sequence) || + put_user(kp->reserved2, &up->reserved2) || +- put_user(kp->reserved, &up->reserved)) ++ put_user(kp->reserved, &up->reserved) || ++ put_user(kp->length, &up->length)) + return -EFAULT; + + if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) { +@@ -515,13 +512,11 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user + } else { + switch (kp->memory) { + case V4L2_MEMORY_MMAP: +- if (put_user(kp->length, &up->length) || +- put_user(kp->m.offset, &up->m.offset)) ++ if (put_user(kp->m.offset, &up->m.offset)) + return -EFAULT; + break; + case V4L2_MEMORY_USERPTR: +- if (put_user(kp->length, &up->length) || +- put_user(kp->m.userptr, &up->m.userptr)) ++ if (put_user(kp->m.userptr, &up->m.userptr)) + return -EFAULT; + break; + case V4L2_MEMORY_OVERLAY: +diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c +index 4cf38c39878a..883ba74fbc1e 100644 +--- a/drivers/misc/mei/bus.c ++++ b/drivers/misc/mei/bus.c +@@ -238,6 +238,11 @@ static ssize_t ___mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length, + dev = cl->dev; + + mutex_lock(&dev->device_lock); ++ if (dev->dev_state != MEI_DEV_ENABLED) { ++ rets = -ENODEV; ++ goto out; ++ } ++ + if (!mei_cl_is_connected(cl)) { + rets = -ENODEV; + goto out; +@@ -287,6 +292,10 @@ ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length) + dev = cl->dev; + + mutex_lock(&dev->device_lock); ++ if (dev->dev_state != MEI_DEV_ENABLED) { ++ rets = -ENODEV; ++ goto out; ++ } + + cb = mei_cl_read_cb(cl, NULL); + if (cb) +diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c +index 9a39e0b7e583..0c864eb21f58 100644 +--- a/drivers/mmc/host/atmel-mci.c ++++ b/drivers/mmc/host/atmel-mci.c +@@ -2281,6 +2281,23 @@ static int atmci_configure_dma(struct atmel_mci *host) + { + host->dma.chan = dma_request_slave_channel_reason(&host->pdev->dev, + "rxtx"); ++ ++ if (PTR_ERR(host->dma.chan) == -ENODEV) { ++ struct mci_platform_data *pdata = host->pdev->dev.platform_data; ++ dma_cap_mask_t mask; ++ ++ if (!pdata || !pdata->dma_filter) ++ return -ENODEV; ++ ++ dma_cap_zero(mask); ++ dma_cap_set(DMA_SLAVE, mask); ++ ++ host->dma.chan = dma_request_channel(mask, pdata->dma_filter, ++ pdata->dma_slave); ++ if (!host->dma.chan) ++ host->dma.chan = ERR_PTR(-ENODEV); ++ } ++ + if (IS_ERR(host->dma.chan)) + return PTR_ERR(host->dma.chan); + +diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c +index ae19d83bb9de..055cad1e94d5 100644 +--- a/drivers/mmc/host/mmc_spi.c ++++ b/drivers/mmc/host/mmc_spi.c +@@ -1436,6 +1436,12 @@ static int mmc_spi_probe(struct spi_device *spi) + host->pdata->cd_debounce); + if (status != 0) + goto fail_add_host; ++ ++ /* The platform has a CD GPIO signal that may support ++ * interrupts, so let mmc_gpiod_request_cd_irq() decide ++ * if polling is needed or not. ++ */ ++ mmc->caps &= ~MMC_CAP_NEEDS_POLL; + mmc_gpiod_request_cd_irq(mmc); + } + +diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c +index 065dc70caa1d..404a33b3c33e 100644 +--- a/drivers/mmc/host/sdhci-pxav3.c ++++ b/drivers/mmc/host/sdhci-pxav3.c +@@ -136,6 +136,10 @@ static int armada_38x_quirks(struct platform_device *pdev, + struct resource *res; + + host->quirks |= SDHCI_QUIRK_MISSING_CAPS; ++ ++ host->caps = sdhci_readl(host, SDHCI_CAPABILITIES); ++ host->caps1 = sdhci_readl(host, SDHCI_CAPABILITIES_1); ++ + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, + "conf-sdio3"); + if (res) { +@@ -149,7 +153,6 @@ static int armada_38x_quirks(struct platform_device *pdev, + * Configuration register, if the adjustment is not done, + * remove them from the capabilities. + */ +- host->caps1 = sdhci_readl(host, SDHCI_CAPABILITIES_1); + host->caps1 &= ~(SDHCI_SUPPORT_SDR50 | SDHCI_SUPPORT_DDR50); + + dev_warn(&pdev->dev, "conf-sdio3 register not found: disabling SDR50 and DDR50 modes.\nConsider updating your dtb\n"); +@@ -160,7 +163,6 @@ static int armada_38x_quirks(struct platform_device *pdev, + * controller has different capabilities than the ones shown + * in its registers + */ +- host->caps = sdhci_readl(host, SDHCI_CAPABILITIES); + if (of_property_read_bool(np, "no-1-8-v")) { + host->caps &= ~SDHCI_CAN_VDD_180; + host->mmc->caps &= ~MMC_CAP_1_8V_DDR; +diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c +index f47c4a8370be..c60dde917e49 100644 +--- a/drivers/mmc/host/sdhci.c ++++ b/drivers/mmc/host/sdhci.c +@@ -681,9 +681,20 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd) + if (!data) + target_timeout = cmd->busy_timeout * 1000; + else { +- target_timeout = data->timeout_ns / 1000; +- if (host->clock) +- target_timeout += data->timeout_clks / host->clock; ++ target_timeout = DIV_ROUND_UP(data->timeout_ns, 1000); ++ if (host->clock && data->timeout_clks) { ++ unsigned long long val; ++ ++ /* ++ * data->timeout_clks is in units of clock cycles. ++ * host->clock is in Hz. target_timeout is in us. ++ * Hence, us = 1000000 * cycles / Hz. Round up. ++ */ ++ val = 1000000 * data->timeout_clks; ++ if (do_div(val, host->clock)) ++ target_timeout++; ++ target_timeout += val; ++ } + } + + /* +@@ -3126,14 +3137,14 @@ int sdhci_add_host(struct sdhci_host *host) + if (caps[0] & SDHCI_TIMEOUT_CLK_UNIT) + host->timeout_clk *= 1000; + ++ if (override_timeout_clk) ++ host->timeout_clk = override_timeout_clk; ++ + mmc->max_busy_timeout = host->ops->get_max_timeout_count ? + host->ops->get_max_timeout_count(host) : 1 << 27; + mmc->max_busy_timeout /= host->timeout_clk; + } + +- if (override_timeout_clk) +- host->timeout_clk = override_timeout_clk; +- + mmc->caps |= MMC_CAP_SDIO_IRQ | MMC_CAP_ERASE | MMC_CAP_CMD23; + mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD; + +diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c +index 43b3392ffee7..652d01832873 100644 +--- a/drivers/mtd/onenand/onenand_base.c ++++ b/drivers/mtd/onenand/onenand_base.c +@@ -2599,6 +2599,7 @@ static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) + */ + static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs) + { ++ struct onenand_chip *this = mtd->priv; + int ret; + + ret = onenand_block_isbad(mtd, ofs); +@@ -2610,7 +2611,7 @@ static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs) + } + + onenand_get_device(mtd, FL_WRITING); +- ret = mtd_block_markbad(mtd, ofs); ++ ret = this->block_markbad(mtd, ofs); + onenand_release_device(mtd); + return ret; + } +diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c +index e07afc673d7a..e4c079612100 100644 +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -3157,7 +3157,7 @@ static int mvneta_probe(struct platform_device *pdev) + dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; + dev->hw_features |= dev->features; + dev->vlan_features |= dev->features; +- dev->priv_flags |= IFF_UNICAST_FLT; ++ dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE; + dev->gso_max_segs = MVNETA_MAX_TSO_SEGS; + + err = register_netdev(dev); +diff --git a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c +index 696852eb23c3..7a3f990c1935 100644 +--- a/drivers/net/irda/irtty-sir.c ++++ b/drivers/net/irda/irtty-sir.c +@@ -430,16 +430,6 @@ static int irtty_open(struct tty_struct *tty) + + /* Module stuff handled via irda_ldisc.owner - Jean II */ + +- /* First make sure we're not already connected. */ +- if (tty->disc_data != NULL) { +- priv = tty->disc_data; +- if (priv && priv->magic == IRTTY_MAGIC) { +- ret = -EEXIST; +- goto out; +- } +- tty->disc_data = NULL; /* ### */ +- } +- + /* stop the underlying driver */ + irtty_stop_receiver(tty, TRUE); + if (tty->ops->stop) +diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c +index dac7a0d9bb46..18cc2c8d5447 100644 +--- a/drivers/net/rionet.c ++++ b/drivers/net/rionet.c +@@ -280,7 +280,7 @@ static void rionet_outb_msg_event(struct rio_mport *mport, void *dev_id, int mbo + struct net_device *ndev = dev_id; + struct rionet_private *rnet = netdev_priv(ndev); + +- spin_lock(&rnet->lock); ++ spin_lock(&rnet->tx_lock); + + if (netif_msg_intr(rnet)) + printk(KERN_INFO +@@ -299,7 +299,7 @@ static void rionet_outb_msg_event(struct rio_mport *mport, void *dev_id, int mbo + if (rnet->tx_cnt < RIONET_TX_RING_SIZE) + netif_wake_queue(ndev); + +- spin_unlock(&rnet->lock); ++ spin_unlock(&rnet->tx_lock); + } + + static int rionet_open(struct net_device *ndev) +diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c +index 726ebe792813..26fb7b0b856c 100644 +--- a/drivers/of/of_reserved_mem.c ++++ b/drivers/of/of_reserved_mem.c +@@ -31,11 +31,13 @@ int __init __weak early_init_dt_alloc_reserved_memory_arch(phys_addr_t size, + phys_addr_t align, phys_addr_t start, phys_addr_t end, bool nomap, + phys_addr_t *res_base) + { ++ phys_addr_t base; + /* + * We use __memblock_alloc_base() because memblock_alloc_base() + * panic()s on allocation failure. + */ +- phys_addr_t base = __memblock_alloc_base(size, align, end); ++ end = !end ? MEMBLOCK_ALLOC_ANYWHERE : end; ++ base = __memblock_alloc_base(size, align, end); + if (!base) + return -ENOMEM; + +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index c91185721345..25ad1b27ffae 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -176,6 +176,9 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, + u16 orig_cmd; + struct pci_bus_region region, inverted_region; + ++ if (dev->non_compliant_bars) ++ return 0; ++ + mask = type ? PCI_ROM_ADDRESS_MASK : ~0; + + /* No printks while decoding is disabled! */ +@@ -973,6 +976,8 @@ void set_pcie_port_type(struct pci_dev *pdev) + { + int pos; + u16 reg16; ++ int type; ++ struct pci_dev *parent; + + pos = pci_find_capability(pdev, PCI_CAP_ID_EXP); + if (!pos) +@@ -982,6 +987,22 @@ void set_pcie_port_type(struct pci_dev *pdev) + pdev->pcie_flags_reg = reg16; + pci_read_config_word(pdev, pos + PCI_EXP_DEVCAP, ®16); + pdev->pcie_mpss = reg16 & PCI_EXP_DEVCAP_PAYLOAD; ++ ++ /* ++ * A Root Port is always the upstream end of a Link. No PCIe ++ * component has two Links. Two Links are connected by a Switch ++ * that has a Port on each Link and internal logic to connect the ++ * two Ports. ++ */ ++ type = pci_pcie_type(pdev); ++ if (type == PCI_EXP_TYPE_ROOT_PORT) ++ pdev->has_secondary_link = 1; ++ else if (type == PCI_EXP_TYPE_UPSTREAM || ++ type == PCI_EXP_TYPE_DOWNSTREAM) { ++ parent = pci_upstream_bridge(pdev); ++ if (!parent->has_secondary_link) ++ pdev->has_secondary_link = 1; ++ } + } + + void set_pcie_hotplug_bridge(struct pci_dev *pdev) +@@ -1098,6 +1119,7 @@ int pci_cfg_space_size(struct pci_dev *dev) + int pci_setup_device(struct pci_dev *dev) + { + u32 class; ++ u16 cmd; + u8 hdr_type; + struct pci_slot *slot; + int pos = 0; +@@ -1145,6 +1167,16 @@ int pci_setup_device(struct pci_dev *dev) + /* device class may be changed after fixup */ + class = dev->class >> 8; + ++ if (dev->non_compliant_bars) { ++ pci_read_config_word(dev, PCI_COMMAND, &cmd); ++ if (cmd & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { ++ dev_info(&dev->dev, "device has non-compliant BARs; disabling IO/MEM decoding\n"); ++ cmd &= ~PCI_COMMAND_IO; ++ cmd &= ~PCI_COMMAND_MEMORY; ++ pci_write_config_word(dev, PCI_COMMAND, cmd); ++ } ++ } ++ + switch (dev->hdr_type) { /* header type */ + case PCI_HEADER_TYPE_NORMAL: /* standard header */ + if (class == PCI_CLASS_BRIDGE_PCI) +diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c +index 8d908e3f42c3..03ad08ca7e3b 100644 +--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c ++++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c +@@ -786,7 +786,7 @@ static int bcm2835_pctl_dt_node_to_map(struct pinctrl_dev *pctldev, + } + if (num_pulls) { + err = of_property_read_u32_index(np, "brcm,pull", +- (num_funcs > 1) ? i : 0, &pull); ++ (num_pulls > 1) ? i : 0, &pull); + if (err) + goto out; + err = bcm2835_pctl_dt_node_to_map_pull(pc, np, pin, +diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c +index 9a92d13e3917..8cad6c165680 100644 +--- a/drivers/platform/x86/ideapad-laptop.c ++++ b/drivers/platform/x86/ideapad-laptop.c +@@ -845,6 +845,20 @@ static const struct dmi_system_id no_hw_rfkill_list[] = { + }, + }, + { ++ .ident = "Lenovo ideapad Y700-15ISK", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad Y700-15ISK"), ++ }, ++ }, ++ { ++ .ident = "Lenovo ideapad Y700 Touch-15ISK", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad Y700 Touch-15ISK"), ++ }, ++ }, ++ { + .ident = "Lenovo ideapad Y700-17ISK", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), +diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h +index 40fe65c91b41..18c9c0648bd0 100644 +--- a/drivers/scsi/aacraid/aacraid.h ++++ b/drivers/scsi/aacraid/aacraid.h +@@ -939,6 +939,7 @@ struct fib { + */ + struct list_head fiblink; + void *data; ++ u32 vector_no; + struct hw_fib *hw_fib_va; /* Actual shared object */ + dma_addr_t hw_fib_pa; /* physical address of hw_fib*/ + }; +@@ -2098,6 +2099,7 @@ static inline unsigned int cap_to_cyls(sector_t capacity, unsigned divisor) + #define AAC_OWNER_FIRMWARE 0x106 + + const char *aac_driverinfo(struct Scsi_Host *); ++void aac_fib_vector_assign(struct aac_dev *dev); + struct fib *aac_fib_alloc(struct aac_dev *dev); + int aac_fib_setup(struct aac_dev *dev); + void aac_fib_map_free(struct aac_dev *dev); +diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c +index 4da574925284..4b79d9511778 100644 +--- a/drivers/scsi/aacraid/commsup.c ++++ b/drivers/scsi/aacraid/commsup.c +@@ -83,13 +83,38 @@ static int fib_map_alloc(struct aac_dev *dev) + + void aac_fib_map_free(struct aac_dev *dev) + { +- pci_free_consistent(dev->pdev, +- dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB), +- dev->hw_fib_va, dev->hw_fib_pa); ++ if (dev->hw_fib_va && dev->max_fib_size) { ++ pci_free_consistent(dev->pdev, ++ (dev->max_fib_size * ++ (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)), ++ dev->hw_fib_va, dev->hw_fib_pa); ++ } + dev->hw_fib_va = NULL; + dev->hw_fib_pa = 0; + } + ++void aac_fib_vector_assign(struct aac_dev *dev) ++{ ++ u32 i = 0; ++ u32 vector = 1; ++ struct fib *fibptr = NULL; ++ ++ for (i = 0, fibptr = &dev->fibs[i]; ++ i < (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); ++ i++, fibptr++) { ++ if ((dev->max_msix == 1) || ++ (i > ((dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1) ++ - dev->vector_cap))) { ++ fibptr->vector_no = 0; ++ } else { ++ fibptr->vector_no = vector; ++ vector++; ++ if (vector == dev->max_msix) ++ vector = 1; ++ } ++ } ++} ++ + /** + * aac_fib_setup - setup the fibs + * @dev: Adapter to set up +@@ -151,6 +176,12 @@ int aac_fib_setup(struct aac_dev * dev) + hw_fib_pa = hw_fib_pa + + dev->max_fib_size + sizeof(struct aac_fib_xporthdr); + } ++ ++ /* ++ *Assign vector numbers to fibs ++ */ ++ aac_fib_vector_assign(dev); ++ + /* + * Add the fib chain to the free list + */ +diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c +index 4596e9dd757c..81315a14ef39 100644 +--- a/drivers/scsi/aacraid/src.c ++++ b/drivers/scsi/aacraid/src.c +@@ -156,8 +156,8 @@ irqreturn_t aac_src_intr_message(int irq, void *dev_id) + break; + if (dev->msi_enabled && dev->max_msix > 1) + atomic_dec(&dev->rrq_outstanding[vector_no]); +- aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL); + dev->host_rrq[index++] = 0; ++ aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL); + if (index == (vector_no + 1) * dev->vector_cap) + index = vector_no * dev->vector_cap; + dev->host_rrq_idx[vector_no] = index; +@@ -448,36 +448,20 @@ static int aac_src_deliver_message(struct fib *fib) + dma_addr_t address; + struct aac_fib_xporthdr *pFibX; + u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size); ++ u16 vector_no; + + atomic_inc(&q->numpending); + + if (dev->msi_enabled && fib->hw_fib_va->header.Command != AifRequest && + dev->max_msix > 1) { +- u_int16_t vector_no, first_choice = 0xffff; +- +- vector_no = dev->fibs_pushed_no % dev->max_msix; +- do { +- vector_no += 1; +- if (vector_no == dev->max_msix) +- vector_no = 1; +- if (atomic_read(&dev->rrq_outstanding[vector_no]) < +- dev->vector_cap) +- break; +- if (0xffff == first_choice) +- first_choice = vector_no; +- else if (vector_no == first_choice) +- break; +- } while (1); +- if (vector_no == first_choice) +- vector_no = 0; +- atomic_inc(&dev->rrq_outstanding[vector_no]); +- if (dev->fibs_pushed_no == 0xffffffff) +- dev->fibs_pushed_no = 0; +- else +- dev->fibs_pushed_no++; ++ vector_no = fib->vector_no; + fib->hw_fib_va->header.Handle += (vector_no << 16); ++ } else { ++ vector_no = 0; + } + ++ atomic_inc(&dev->rrq_outstanding[vector_no]); ++ + if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { + /* Calculate the amount to the fibsize bits */ + fibsize = (hdr_size + 127) / 128 - 1; +diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c +index a2f2c774cd6b..82529f9830f3 100644 +--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c ++++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c +@@ -1337,6 +1337,7 @@ ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, + case AHC_DEV_Q_TAGGED: + scsi_change_queue_depth(sdev, + dev->openings + dev->active); ++ break; + default: + /* + * We allow the OS to queue 2 untagged transactions to +diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c +index 1f74760ce86c..77a1598bc78d 100644 +--- a/drivers/scsi/be2iscsi/be_main.c ++++ b/drivers/scsi/be2iscsi/be_main.c +@@ -4434,6 +4434,7 @@ put_shost: + scsi_host_put(phba->shost); + free_kset: + iscsi_boot_destroy_kset(phba->boot_kset); ++ phba->boot_kset = NULL; + return -ENOMEM; + } + +diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c +index 3bbf4853733c..ec192939750e 100644 +--- a/drivers/scsi/sg.c ++++ b/drivers/scsi/sg.c +@@ -652,7 +652,8 @@ sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos) + else + hp->dxfer_direction = (mxsize > 0) ? SG_DXFER_FROM_DEV : SG_DXFER_NONE; + hp->dxfer_len = mxsize; +- if (hp->dxfer_direction == SG_DXFER_TO_DEV) ++ if ((hp->dxfer_direction == SG_DXFER_TO_DEV) || ++ (hp->dxfer_direction == SG_DXFER_TO_FROM_DEV)) + hp->dxferp = (char __user *)buf + cmd_size; + else + hp->dxferp = NULL; +diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c +index c66affd993aa..34b3a522668f 100644 +--- a/drivers/staging/comedi/drivers/ni_mio_common.c ++++ b/drivers/staging/comedi/drivers/ni_mio_common.c +@@ -247,24 +247,24 @@ static void ni_writel(struct comedi_device *dev, uint32_t data, int reg) + { + if (dev->mmio) + writel(data, dev->mmio + reg); +- +- outl(data, dev->iobase + reg); ++ else ++ outl(data, dev->iobase + reg); + } + + static void ni_writew(struct comedi_device *dev, uint16_t data, int reg) + { + if (dev->mmio) + writew(data, dev->mmio + reg); +- +- outw(data, dev->iobase + reg); ++ else ++ outw(data, dev->iobase + reg); + } + + static void ni_writeb(struct comedi_device *dev, uint8_t data, int reg) + { + if (dev->mmio) + writeb(data, dev->mmio + reg); +- +- outb(data, dev->iobase + reg); ++ else ++ outb(data, dev->iobase + reg); + } + + static uint32_t ni_readl(struct comedi_device *dev, int reg) +diff --git a/drivers/staging/comedi/drivers/ni_tiocmd.c b/drivers/staging/comedi/drivers/ni_tiocmd.c +index 9b124b09e914..bfd4c3b12cd0 100644 +--- a/drivers/staging/comedi/drivers/ni_tiocmd.c ++++ b/drivers/staging/comedi/drivers/ni_tiocmd.c +@@ -92,7 +92,7 @@ static int ni_tio_input_inttrig(struct comedi_device *dev, + unsigned long flags; + int ret = 0; + +- if (trig_num != cmd->start_src) ++ if (trig_num != cmd->start_arg) + return -EINVAL; + + spin_lock_irqsave(&counter->lock, flags); +diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c +index be12b9d84052..e8848e7fe5d4 100644 +--- a/drivers/target/target_core_transport.c ++++ b/drivers/target/target_core_transport.c +@@ -2617,8 +2617,6 @@ void target_wait_for_sess_cmds(struct se_session *se_sess) + + list_for_each_entry_safe(se_cmd, tmp_cmd, + &se_sess->sess_wait_list, se_cmd_list) { +- list_del_init(&se_cmd->se_cmd_list); +- + pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:" + " %d\n", se_cmd, se_cmd->t_state, + se_cmd->se_tfo->get_cmd_state(se_cmd)); +diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c +index a3282bfb343d..09f1e5f2f013 100644 +--- a/drivers/thermal/thermal_core.c ++++ b/drivers/thermal/thermal_core.c +@@ -391,6 +391,10 @@ static void handle_thermal_trip(struct thermal_zone_device *tz, int trip) + { + enum thermal_trip_type type; + ++ /* Ignore disabled trip points */ ++ if (test_bit(trip, &tz->trips_disabled)) ++ return; ++ + tz->ops->get_trip_type(tz, trip, &type); + + if (type == THERMAL_TRIP_CRITICAL || type == THERMAL_TRIP_HOT) +@@ -1487,6 +1491,7 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type, + { + struct thermal_zone_device *tz; + enum thermal_trip_type trip_type; ++ int trip_temp; + int result; + int count; + int passive = 0; +@@ -1557,9 +1562,15 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type, + goto unregister; + + for (count = 0; count < trips; count++) { +- tz->ops->get_trip_type(tz, count, &trip_type); ++ if (tz->ops->get_trip_type(tz, count, &trip_type)) ++ set_bit(count, &tz->trips_disabled); + if (trip_type == THERMAL_TRIP_PASSIVE) + passive = 1; ++ if (tz->ops->get_trip_temp(tz, count, &trip_temp)) ++ set_bit(count, &tz->trips_disabled); ++ /* Check for bogus trip points */ ++ if (trip_temp == 0) ++ set_bit(count, &tz->trips_disabled); + } + + if (!passive) { +diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c +index df3deb000a80..09084c9da8b7 100644 +--- a/drivers/usb/class/cdc-acm.c ++++ b/drivers/usb/class/cdc-acm.c +@@ -1118,6 +1118,9 @@ static int acm_probe(struct usb_interface *intf, + if (quirks == NO_UNION_NORMAL) { + data_interface = usb_ifnum_to_if(usb_dev, 1); + control_interface = usb_ifnum_to_if(usb_dev, 0); ++ /* we would crash */ ++ if (!data_interface || !control_interface) ++ return -ENODEV; + goto skip_normal_probe; + } + +diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c +index 818369afff63..7792c0e2d3b6 100644 +--- a/drivers/usb/core/driver.c ++++ b/drivers/usb/core/driver.c +@@ -499,11 +499,15 @@ static int usb_unbind_interface(struct device *dev) + int usb_driver_claim_interface(struct usb_driver *driver, + struct usb_interface *iface, void *priv) + { +- struct device *dev = &iface->dev; ++ struct device *dev; + struct usb_device *udev; + int retval = 0; + int lpm_disable_error; + ++ if (!iface) ++ return -ENODEV; ++ ++ dev = &iface->dev; + if (dev->driver) + return -EBUSY; + +diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c +index e56ad83b35a4..ae9eb716c02f 100644 +--- a/drivers/usb/core/hub.c ++++ b/drivers/usb/core/hub.c +@@ -4237,7 +4237,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, + { + struct usb_device *hdev = hub->hdev; + struct usb_hcd *hcd = bus_to_hcd(hdev->bus); +- int i, j, retval; ++ int retries, operations, retval, i; + unsigned delay = HUB_SHORT_RESET_TIME; + enum usb_device_speed oldspeed = udev->speed; + const char *speed; +@@ -4339,7 +4339,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, + * first 8 bytes of the device descriptor to get the ep0 maxpacket + * value. + */ +- for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) { ++ for (retries = 0; retries < GET_DESCRIPTOR_TRIES; (++retries, msleep(100))) { + bool did_new_scheme = false; + + if (use_new_scheme(udev, retry_counter)) { +@@ -4366,7 +4366,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, + * 255 is for WUSB devices, we actually need to use + * 512 (WUSB1.0[4.8.1]). + */ +- for (j = 0; j < 3; ++j) { ++ for (operations = 0; operations < 3; ++operations) { + buf->bMaxPacketSize0 = 0; + r = usb_control_msg(udev, usb_rcvaddr0pipe(), + USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, +@@ -4386,7 +4386,13 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, + r = -EPROTO; + break; + } +- if (r == 0) ++ /* ++ * Some devices time out if they are powered on ++ * when already connected. They need a second ++ * reset. But only on the first attempt, ++ * lest we get into a time out/reset loop ++ */ ++ if (r == 0 || (r == -ETIMEDOUT && retries == 0)) + break; + } + udev->descriptor.bMaxPacketSize0 = +@@ -4418,7 +4424,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, + * authorization will assign the final address. + */ + if (udev->wusb == 0) { +- for (j = 0; j < SET_ADDRESS_TRIES; ++j) { ++ for (operations = 0; operations < SET_ADDRESS_TRIES; ++operations) { + retval = hub_set_address(udev, devnum); + if (retval >= 0) + break; +diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c +index c6bfd13f6c92..1950e87b4219 100644 +--- a/drivers/usb/misc/iowarrior.c ++++ b/drivers/usb/misc/iowarrior.c +@@ -787,6 +787,12 @@ static int iowarrior_probe(struct usb_interface *interface, + iface_desc = interface->cur_altsetting; + dev->product_id = le16_to_cpu(udev->descriptor.idProduct); + ++ if (iface_desc->desc.bNumEndpoints < 1) { ++ dev_err(&interface->dev, "Invalid number of endpoints\n"); ++ retval = -EINVAL; ++ goto error; ++ } ++ + /* set up the endpoint information */ + for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { + endpoint = &iface_desc->endpoint[i].desc; +diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c +index 75e4979e6c15..637ee7754ad5 100644 +--- a/drivers/usb/storage/uas.c ++++ b/drivers/usb/storage/uas.c +@@ -812,7 +812,7 @@ static struct scsi_host_template uas_host_template = { + .slave_configure = uas_slave_configure, + .eh_abort_handler = uas_eh_abort_handler, + .eh_bus_reset_handler = uas_eh_bus_reset_handler, +- .can_queue = 65536, /* Is there a limit on the _host_ ? */ ++ .can_queue = MAX_CMNDS, + .this_id = -1, + .sg_tablesize = SG_NONE, + .cmd_per_lun = 1, /* until we override it */ +diff --git a/drivers/watchdog/rc32434_wdt.c b/drivers/watchdog/rc32434_wdt.c +index 71e78ef4b736..3a75f3b53452 100644 +--- a/drivers/watchdog/rc32434_wdt.c ++++ b/drivers/watchdog/rc32434_wdt.c +@@ -237,7 +237,7 @@ static long rc32434_wdt_ioctl(struct file *file, unsigned int cmd, + return -EINVAL; + /* Fall through */ + case WDIOC_GETTIMEOUT: +- return copy_to_user(argp, &timeout, sizeof(int)); ++ return copy_to_user(argp, &timeout, sizeof(int)) ? -EFAULT : 0; + default: + return -ENOTTY; + } +diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c +index df9932b00d08..1848705506ff 100644 +--- a/fs/btrfs/async-thread.c ++++ b/fs/btrfs/async-thread.c +@@ -316,8 +316,8 @@ static inline void __btrfs_queue_work(struct __btrfs_workqueue *wq, + list_add_tail(&work->ordered_list, &wq->ordered_list); + spin_unlock_irqrestore(&wq->list_lock, flags); + } +- queue_work(wq->normal_wq, &work->normal_work); + trace_btrfs_work_queued(work); ++ queue_work(wq->normal_wq, &work->normal_work); + } + + void btrfs_queue_work(struct btrfs_workqueue *wq, +diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c +index 99e8f60c7962..e4ca0f5746ae 100644 +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -1574,8 +1574,23 @@ int btrfs_init_fs_root(struct btrfs_root *root) + ret = get_anon_bdev(&root->anon_dev); + if (ret) + goto free_writers; ++ ++ mutex_lock(&root->objectid_mutex); ++ ret = btrfs_find_highest_objectid(root, ++ &root->highest_objectid); ++ if (ret) { ++ mutex_unlock(&root->objectid_mutex); ++ goto free_root_dev; ++ } ++ ++ ASSERT(root->highest_objectid <= BTRFS_LAST_FREE_OBJECTID); ++ ++ mutex_unlock(&root->objectid_mutex); ++ + return 0; + ++free_root_dev: ++ free_anon_bdev(root->anon_dev); + free_writers: + btrfs_free_subvolume_writers(root->subv_writers); + fail: +@@ -2622,6 +2637,7 @@ int open_ctree(struct super_block *sb, + if (btrfs_check_super_csum(bh->b_data)) { + printk(KERN_ERR "BTRFS: superblock checksum mismatch\n"); + err = -EINVAL; ++ brelse(bh); + goto fail_alloc; + } + +@@ -2849,6 +2865,18 @@ retry_root_backup: + tree_root->commit_root = btrfs_root_node(tree_root); + btrfs_set_root_refs(&tree_root->root_item, 1); + ++ mutex_lock(&tree_root->objectid_mutex); ++ ret = btrfs_find_highest_objectid(tree_root, ++ &tree_root->highest_objectid); ++ if (ret) { ++ mutex_unlock(&tree_root->objectid_mutex); ++ goto recovery_tree_root; ++ } ++ ++ ASSERT(tree_root->highest_objectid <= BTRFS_LAST_FREE_OBJECTID); ++ ++ mutex_unlock(&tree_root->objectid_mutex); ++ + ret = btrfs_read_roots(fs_info, tree_root); + if (ret) + goto recovery_tree_root; +diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c +index 3c1938000a5d..d1ae1322648a 100644 +--- a/fs/btrfs/extent-tree.c ++++ b/fs/btrfs/extent-tree.c +@@ -3975,6 +3975,11 @@ commit_trans: + !atomic_read(&root->fs_info->open_ioctl_trans)) { + need_commit--; + ++ if (need_commit > 0) { ++ btrfs_start_delalloc_roots(fs_info, 0, -1); ++ btrfs_wait_ordered_roots(fs_info, -1); ++ } ++ + trans = btrfs_join_transaction(root); + if (IS_ERR(trans)) + return PTR_ERR(trans); +diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c +index d4a582ac3f73..9f06e8b4add1 100644 +--- a/fs/btrfs/inode-map.c ++++ b/fs/btrfs/inode-map.c +@@ -515,7 +515,7 @@ out: + return ret; + } + +-static int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid) ++int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid) + { + struct btrfs_path *path; + int ret; +@@ -555,13 +555,6 @@ int btrfs_find_free_objectid(struct btrfs_root *root, u64 *objectid) + int ret; + mutex_lock(&root->objectid_mutex); + +- if (unlikely(root->highest_objectid < BTRFS_FIRST_FREE_OBJECTID)) { +- ret = btrfs_find_highest_objectid(root, +- &root->highest_objectid); +- if (ret) +- goto out; +- } +- + if (unlikely(root->highest_objectid >= BTRFS_LAST_FREE_OBJECTID)) { + ret = -ENOSPC; + goto out; +diff --git a/fs/btrfs/inode-map.h b/fs/btrfs/inode-map.h +index ddb347bfee23..c8e864b2d530 100644 +--- a/fs/btrfs/inode-map.h ++++ b/fs/btrfs/inode-map.h +@@ -9,5 +9,6 @@ int btrfs_save_ino_cache(struct btrfs_root *root, + struct btrfs_trans_handle *trans); + + int btrfs_find_free_objectid(struct btrfs_root *root, u64 *objectid); ++int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid); + + #endif +diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c +index b114a0539d3d..f751ab47e9a5 100644 +--- a/fs/btrfs/inode.c ++++ b/fs/btrfs/inode.c +@@ -6421,7 +6421,7 @@ out_unlock_inode: + static int btrfs_link(struct dentry *old_dentry, struct inode *dir, + struct dentry *dentry) + { +- struct btrfs_trans_handle *trans; ++ struct btrfs_trans_handle *trans = NULL; + struct btrfs_root *root = BTRFS_I(dir)->root; + struct inode *inode = d_inode(old_dentry); + u64 index; +@@ -6447,6 +6447,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, + trans = btrfs_start_transaction(root, 5); + if (IS_ERR(trans)) { + err = PTR_ERR(trans); ++ trans = NULL; + goto fail; + } + +@@ -6480,9 +6481,10 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, + btrfs_log_new_name(trans, inode, NULL, parent); + } + +- btrfs_end_transaction(trans, root); + btrfs_balance_delayed_items(root); + fail: ++ if (trans) ++ btrfs_end_transaction(trans, root); + if (drop_inode) { + inode_dec_link_count(inode); + iput(inode); +@@ -8416,15 +8418,28 @@ int btrfs_readpage(struct file *file, struct page *page) + static int btrfs_writepage(struct page *page, struct writeback_control *wbc) + { + struct extent_io_tree *tree; +- ++ struct inode *inode = page->mapping->host; ++ int ret; + + if (current->flags & PF_MEMALLOC) { + redirty_page_for_writepage(wbc, page); + unlock_page(page); + return 0; + } ++ ++ /* ++ * If we are under memory pressure we will call this directly from the ++ * VM, we need to make sure we have the inode referenced for the ordered ++ * extent. If not just return like we didn't do anything. ++ */ ++ if (!igrab(inode)) { ++ redirty_page_for_writepage(wbc, page); ++ return AOP_WRITEPAGE_ACTIVATE; ++ } + tree = &BTRFS_I(page->mapping->host)->io_tree; +- return extent_write_full_page(tree, page, btrfs_get_extent, wbc); ++ ret = extent_write_full_page(tree, page, btrfs_get_extent, wbc); ++ btrfs_add_delayed_iput(inode); ++ return ret; + } + + static int btrfs_writepages(struct address_space *mapping, +@@ -9505,9 +9520,11 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, + /* + * 2 items for inode item and ref + * 2 items for dir items ++ * 1 item for updating parent inode item ++ * 1 item for the inline extent item + * 1 item for xattr if selinux is on + */ +- trans = btrfs_start_transaction(root, 5); ++ trans = btrfs_start_transaction(root, 7); + if (IS_ERR(trans)) + return PTR_ERR(trans); + +diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c +index 87c720865ebf..5189d54417ab 100644 +--- a/fs/btrfs/ioctl.c ++++ b/fs/btrfs/ioctl.c +@@ -567,6 +567,10 @@ static noinline int create_subvol(struct inode *dir, + goto fail; + } + ++ mutex_lock(&new_root->objectid_mutex); ++ new_root->highest_objectid = new_dirid; ++ mutex_unlock(&new_root->objectid_mutex); ++ + /* + * insert the directory item + */ +diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c +index a1216f9b4917..b2c1ab7cae78 100644 +--- a/fs/btrfs/send.c ++++ b/fs/btrfs/send.c +@@ -1462,7 +1462,21 @@ static int read_symlink(struct btrfs_root *root, + ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); + if (ret < 0) + goto out; +- BUG_ON(ret); ++ if (ret) { ++ /* ++ * An empty symlink inode. Can happen in rare error paths when ++ * creating a symlink (transaction committed before the inode ++ * eviction handler removed the symlink inode items and a crash ++ * happened in between or the subvol was snapshoted in between). ++ * Print an informative message to dmesg/syslog so that the user ++ * can delete the symlink. ++ */ ++ btrfs_err(root->fs_info, ++ "Found empty symlink inode %llu at root %llu", ++ ino, root->root_key.objectid); ++ ret = -EIO; ++ goto out; ++ } + + ei = btrfs_item_ptr(path->nodes[0], path->slots[0], + struct btrfs_file_extent_item); +diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c +index 9e66f5e724db..70734d89193a 100644 +--- a/fs/btrfs/super.c ++++ b/fs/btrfs/super.c +@@ -1822,6 +1822,8 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) + * there are other factors that may change the result (like a new metadata + * chunk). + * ++ * If metadata is exhausted, f_bavail will be 0. ++ * + * FIXME: not accurate for mixed block groups, total and free/used are ok, + * available appears slightly larger. + */ +@@ -1833,11 +1835,13 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + struct btrfs_space_info *found; + u64 total_used = 0; + u64 total_free_data = 0; ++ u64 total_free_meta = 0; + int bits = dentry->d_sb->s_blocksize_bits; + __be32 *fsid = (__be32 *)fs_info->fsid; + unsigned factor = 1; + struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv; + int ret; ++ u64 thresh = 0; + + /* + * holding chunk_muext to avoid allocating new chunks, holding +@@ -1863,6 +1867,8 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + } + } + } ++ if (found->flags & BTRFS_BLOCK_GROUP_METADATA) ++ total_free_meta += found->disk_total - found->disk_used; + + total_used += found->disk_used; + } +@@ -1885,6 +1891,24 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) + buf->f_bavail += div_u64(total_free_data, factor); + buf->f_bavail = buf->f_bavail >> bits; + ++ /* ++ * We calculate the remaining metadata space minus global reserve. If ++ * this is (supposedly) smaller than zero, there's no space. But this ++ * does not hold in practice, the exhausted state happens where's still ++ * some positive delta. So we apply some guesswork and compare the ++ * delta to a 4M threshold. (Practically observed delta was ~2M.) ++ * ++ * We probably cannot calculate the exact threshold value because this ++ * depends on the internal reservations requested by various ++ * operations, so some operations that consume a few metadata will ++ * succeed even if the Avail is zero. But this is better than the other ++ * way around. ++ */ ++ thresh = 4 * 1024 * 1024; ++ ++ if (total_free_meta - thresh < block_rsv->size) ++ buf->f_bavail = 0; ++ + buf->f_type = BTRFS_SUPER_MAGIC; + buf->f_bsize = dentry->d_sb->s_blocksize; + buf->f_namelen = BTRFS_NAME_LEN; +diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c +index 5113b7257b45..18a3573e1444 100644 +--- a/fs/btrfs/volumes.c ++++ b/fs/btrfs/volumes.c +@@ -152,6 +152,7 @@ static struct btrfs_device *__alloc_device(void) + spin_lock_init(&dev->reada_lock); + atomic_set(&dev->reada_in_flight, 0); + atomic_set(&dev->dev_stats_ccnt, 0); ++ btrfs_device_data_ordered_init(dev); + INIT_RADIX_TREE(&dev->reada_zones, GFP_NOFS & ~__GFP_WAIT); + INIT_RADIX_TREE(&dev->reada_extents, GFP_NOFS & ~__GFP_WAIT); + +diff --git a/fs/coredump.c b/fs/coredump.c +index 8dd099dc5f9b..26d05e3bc6db 100644 +--- a/fs/coredump.c ++++ b/fs/coredump.c +@@ -32,6 +32,10 @@ + #include <linux/pipe_fs_i.h> + #include <linux/oom.h> + #include <linux/compat.h> ++#include <linux/sched.h> ++#include <linux/fs.h> ++#include <linux/path.h> ++#include <linux/timekeeping.h> + + #include <asm/uaccess.h> + #include <asm/mmu_context.h> +@@ -225,9 +229,10 @@ static int format_corename(struct core_name *cn, struct coredump_params *cprm) + break; + /* UNIX time of coredump */ + case 't': { +- struct timeval tv; +- do_gettimeofday(&tv); +- err = cn_printf(cn, "%lu", tv.tv_sec); ++ time64_t time; ++ ++ time = ktime_get_real_seconds(); ++ err = cn_printf(cn, "%lld", time); + break; + } + /* hostname */ +@@ -621,6 +626,8 @@ void do_coredump(const siginfo_t *siginfo) + } + } else { + struct inode *inode; ++ int open_flags = O_CREAT | O_RDWR | O_NOFOLLOW | ++ O_LARGEFILE | O_EXCL; + + if (cprm.limit < binfmt->min_coredump) + goto fail_unlock; +@@ -659,10 +666,27 @@ void do_coredump(const siginfo_t *siginfo) + * what matters is that at least one of the two processes + * writes its coredump successfully, not which one. + */ +- cprm.file = filp_open(cn.corename, +- O_CREAT | 2 | O_NOFOLLOW | +- O_LARGEFILE | O_EXCL, +- 0600); ++ if (need_suid_safe) { ++ /* ++ * Using user namespaces, normal user tasks can change ++ * their current->fs->root to point to arbitrary ++ * directories. Since the intention of the "only dump ++ * with a fully qualified path" rule is to control where ++ * coredumps may be placed using root privileges, ++ * current->fs->root must not be used. Instead, use the ++ * root directory of init_task. ++ */ ++ struct path root; ++ ++ task_lock(&init_task); ++ get_fs_root(init_task.fs, &root); ++ task_unlock(&init_task); ++ cprm.file = file_open_root(root.dentry, root.mnt, ++ cn.corename, open_flags, 0600); ++ path_put(&root); ++ } else { ++ cprm.file = filp_open(cn.corename, open_flags, 0600); ++ } + if (IS_ERR(cprm.file)) + goto fail_unlock; + +diff --git a/fs/dax.c b/fs/dax.c +index 6f65f00e58ec..4bb5b7cd5dfd 100644 +--- a/fs/dax.c ++++ b/fs/dax.c +@@ -309,14 +309,11 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, + out: + i_mmap_unlock_read(mapping); + +- if (bh->b_end_io) +- bh->b_end_io(bh, 1); +- + return error; + } + + static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, +- get_block_t get_block) ++ get_block_t get_block, dax_iodone_t complete_unwritten) + { + struct file *file = vma->vm_file; + struct address_space *mapping = file->f_mapping; +@@ -417,7 +414,19 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, + page_cache_release(page); + } + ++ /* ++ * If we successfully insert the new mapping over an unwritten extent, ++ * we need to ensure we convert the unwritten extent. If there is an ++ * error inserting the mapping, the filesystem needs to leave it as ++ * unwritten to prevent exposure of the stale underlying data to ++ * userspace, but we still need to call the completion function so ++ * the private resources on the mapping buffer can be released. We ++ * indicate what the callback should do via the uptodate variable, same ++ * as for normal BH based IO completions. ++ */ + error = dax_insert_mapping(inode, &bh, vma, vmf); ++ if (buffer_unwritten(&bh)) ++ complete_unwritten(&bh, !error); + + out: + if (error == -ENOMEM) +@@ -445,7 +454,7 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, + * fault handler for DAX files. + */ + int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, +- get_block_t get_block) ++ get_block_t get_block, dax_iodone_t complete_unwritten) + { + int result; + struct super_block *sb = file_inode(vma->vm_file)->i_sb; +@@ -454,7 +463,7 @@ int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, + sb_start_pagefault(sb); + file_update_time(vma->vm_file); + } +- result = do_dax_fault(vma, vmf, get_block); ++ result = do_dax_fault(vma, vmf, get_block, complete_unwritten); + if (vmf->flags & FAULT_FLAG_WRITE) + sb_end_pagefault(sb); + +diff --git a/fs/efivarfs/file.c b/fs/efivarfs/file.c +index 90001da9abfd..66842e55c48c 100644 +--- a/fs/efivarfs/file.c ++++ b/fs/efivarfs/file.c +@@ -10,6 +10,7 @@ + #include <linux/efi.h> + #include <linux/fs.h> + #include <linux/slab.h> ++#include <linux/mount.h> + + #include "internal.h" + +@@ -103,9 +104,78 @@ out_free: + return size; + } + ++static int ++efivarfs_ioc_getxflags(struct file *file, void __user *arg) ++{ ++ struct inode *inode = file->f_mapping->host; ++ unsigned int i_flags; ++ unsigned int flags = 0; ++ ++ i_flags = inode->i_flags; ++ if (i_flags & S_IMMUTABLE) ++ flags |= FS_IMMUTABLE_FL; ++ ++ if (copy_to_user(arg, &flags, sizeof(flags))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ++efivarfs_ioc_setxflags(struct file *file, void __user *arg) ++{ ++ struct inode *inode = file->f_mapping->host; ++ unsigned int flags; ++ unsigned int i_flags = 0; ++ int error; ++ ++ if (!inode_owner_or_capable(inode)) ++ return -EACCES; ++ ++ if (copy_from_user(&flags, arg, sizeof(flags))) ++ return -EFAULT; ++ ++ if (flags & ~FS_IMMUTABLE_FL) ++ return -EOPNOTSUPP; ++ ++ if (!capable(CAP_LINUX_IMMUTABLE)) ++ return -EPERM; ++ ++ if (flags & FS_IMMUTABLE_FL) ++ i_flags |= S_IMMUTABLE; ++ ++ ++ error = mnt_want_write_file(file); ++ if (error) ++ return error; ++ ++ mutex_lock(&inode->i_mutex); ++ inode_set_flags(inode, i_flags, S_IMMUTABLE); ++ mutex_unlock(&inode->i_mutex); ++ ++ mnt_drop_write_file(file); ++ ++ return 0; ++} ++ ++long ++efivarfs_file_ioctl(struct file *file, unsigned int cmd, unsigned long p) ++{ ++ void __user *arg = (void __user *)p; ++ ++ switch (cmd) { ++ case FS_IOC_GETFLAGS: ++ return efivarfs_ioc_getxflags(file, arg); ++ case FS_IOC_SETFLAGS: ++ return efivarfs_ioc_setxflags(file, arg); ++ } ++ ++ return -ENOTTY; ++} ++ + const struct file_operations efivarfs_file_operations = { + .open = simple_open, + .read = efivarfs_file_read, + .write = efivarfs_file_write, + .llseek = no_llseek, ++ .unlocked_ioctl = efivarfs_file_ioctl, + }; +diff --git a/fs/efivarfs/inode.c b/fs/efivarfs/inode.c +index 3381b9da9ee6..e2ab6d0497f2 100644 +--- a/fs/efivarfs/inode.c ++++ b/fs/efivarfs/inode.c +@@ -15,7 +15,8 @@ + #include "internal.h" + + struct inode *efivarfs_get_inode(struct super_block *sb, +- const struct inode *dir, int mode, dev_t dev) ++ const struct inode *dir, int mode, ++ dev_t dev, bool is_removable) + { + struct inode *inode = new_inode(sb); + +@@ -23,6 +24,7 @@ struct inode *efivarfs_get_inode(struct super_block *sb, + inode->i_ino = get_next_ino(); + inode->i_mode = mode; + inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; ++ inode->i_flags = is_removable ? 0 : S_IMMUTABLE; + switch (mode & S_IFMT) { + case S_IFREG: + inode->i_fop = &efivarfs_file_operations; +@@ -102,22 +104,17 @@ static void efivarfs_hex_to_guid(const char *str, efi_guid_t *guid) + static int efivarfs_create(struct inode *dir, struct dentry *dentry, + umode_t mode, bool excl) + { +- struct inode *inode; ++ struct inode *inode = NULL; + struct efivar_entry *var; + int namelen, i = 0, err = 0; ++ bool is_removable = false; + + if (!efivarfs_valid_name(dentry->d_name.name, dentry->d_name.len)) + return -EINVAL; + +- inode = efivarfs_get_inode(dir->i_sb, dir, mode, 0); +- if (!inode) +- return -ENOMEM; +- + var = kzalloc(sizeof(struct efivar_entry), GFP_KERNEL); +- if (!var) { +- err = -ENOMEM; +- goto out; +- } ++ if (!var) ++ return -ENOMEM; + + /* length of the variable name itself: remove GUID and separator */ + namelen = dentry->d_name.len - EFI_VARIABLE_GUID_LEN - 1; +@@ -125,6 +122,16 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry, + efivarfs_hex_to_guid(dentry->d_name.name + namelen + 1, + &var->var.VendorGuid); + ++ if (efivar_variable_is_removable(var->var.VendorGuid, ++ dentry->d_name.name, namelen)) ++ is_removable = true; ++ ++ inode = efivarfs_get_inode(dir->i_sb, dir, mode, 0, is_removable); ++ if (!inode) { ++ err = -ENOMEM; ++ goto out; ++ } ++ + for (i = 0; i < namelen; i++) + var->var.VariableName[i] = dentry->d_name.name[i]; + +@@ -138,7 +145,8 @@ static int efivarfs_create(struct inode *dir, struct dentry *dentry, + out: + if (err) { + kfree(var); +- iput(inode); ++ if (inode) ++ iput(inode); + } + return err; + } +diff --git a/fs/efivarfs/internal.h b/fs/efivarfs/internal.h +index b5ff16addb7c..b4505188e799 100644 +--- a/fs/efivarfs/internal.h ++++ b/fs/efivarfs/internal.h +@@ -15,7 +15,8 @@ extern const struct file_operations efivarfs_file_operations; + extern const struct inode_operations efivarfs_dir_inode_operations; + extern bool efivarfs_valid_name(const char *str, int len); + extern struct inode *efivarfs_get_inode(struct super_block *sb, +- const struct inode *dir, int mode, dev_t dev); ++ const struct inode *dir, int mode, dev_t dev, ++ bool is_removable); + + extern struct list_head efivarfs_list; + +diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c +index 86a2121828c3..abb244b06024 100644 +--- a/fs/efivarfs/super.c ++++ b/fs/efivarfs/super.c +@@ -118,8 +118,9 @@ static int efivarfs_callback(efi_char16_t *name16, efi_guid_t vendor, + struct dentry *dentry, *root = sb->s_root; + unsigned long size = 0; + char *name; +- int len, i; ++ int len; + int err = -ENOMEM; ++ bool is_removable = false; + + entry = kzalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) +@@ -128,15 +129,17 @@ static int efivarfs_callback(efi_char16_t *name16, efi_guid_t vendor, + memcpy(entry->var.VariableName, name16, name_size); + memcpy(&(entry->var.VendorGuid), &vendor, sizeof(efi_guid_t)); + +- len = ucs2_strlen(entry->var.VariableName); ++ len = ucs2_utf8size(entry->var.VariableName); + + /* name, plus '-', plus GUID, plus NUL*/ + name = kmalloc(len + 1 + EFI_VARIABLE_GUID_LEN + 1, GFP_KERNEL); + if (!name) + goto fail; + +- for (i = 0; i < len; i++) +- name[i] = entry->var.VariableName[i] & 0xFF; ++ ucs2_as_utf8(name, entry->var.VariableName, len); ++ ++ if (efivar_variable_is_removable(entry->var.VendorGuid, name, len)) ++ is_removable = true; + + name[len] = '-'; + +@@ -144,7 +147,8 @@ static int efivarfs_callback(efi_char16_t *name16, efi_guid_t vendor, + + name[len + EFI_VARIABLE_GUID_LEN+1] = '\0'; + +- inode = efivarfs_get_inode(sb, d_inode(root), S_IFREG | 0644, 0); ++ inode = efivarfs_get_inode(sb, d_inode(root), S_IFREG | 0644, 0, ++ is_removable); + if (!inode) + goto fail_name; + +@@ -200,7 +204,7 @@ static int efivarfs_fill_super(struct super_block *sb, void *data, int silent) + sb->s_d_op = &efivarfs_d_ops; + sb->s_time_gran = 1; + +- inode = efivarfs_get_inode(sb, NULL, S_IFDIR | 0755, 0); ++ inode = efivarfs_get_inode(sb, NULL, S_IFDIR | 0755, 0, true); + if (!inode) + return -ENOMEM; + inode->i_op = &efivarfs_dir_inode_operations; +diff --git a/fs/ext2/file.c b/fs/ext2/file.c +index 3a0a6c6406d0..3b57c9f83c9b 100644 +--- a/fs/ext2/file.c ++++ b/fs/ext2/file.c +@@ -28,12 +28,12 @@ + #ifdef CONFIG_FS_DAX + static int ext2_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) + { +- return dax_fault(vma, vmf, ext2_get_block); ++ return dax_fault(vma, vmf, ext2_get_block, NULL); + } + + static int ext2_dax_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) + { +- return dax_mkwrite(vma, vmf, ext2_get_block); ++ return dax_mkwrite(vma, vmf, ext2_get_block, NULL); + } + + static const struct vm_operations_struct ext2_dax_vm_ops = { +diff --git a/fs/ext4/file.c b/fs/ext4/file.c +index dd65fac5ff2f..0d062ffacb24 100644 +--- a/fs/ext4/file.c ++++ b/fs/ext4/file.c +@@ -192,15 +192,27 @@ out: + } + + #ifdef CONFIG_FS_DAX ++static void ext4_end_io_unwritten(struct buffer_head *bh, int uptodate) ++{ ++ struct inode *inode = bh->b_assoc_map->host; ++ /* XXX: breaks on 32-bit > 16GB. Is that even supported? */ ++ loff_t offset = (loff_t)(uintptr_t)bh->b_private << inode->i_blkbits; ++ int err; ++ if (!uptodate) ++ return; ++ WARN_ON(!buffer_unwritten(bh)); ++ err = ext4_convert_unwritten_extents(NULL, inode, offset, bh->b_size); ++} ++ + static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) + { +- return dax_fault(vma, vmf, ext4_get_block); ++ return dax_fault(vma, vmf, ext4_get_block, ext4_end_io_unwritten); + /* Is this the right get_block? */ + } + + static int ext4_dax_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) + { +- return dax_mkwrite(vma, vmf, ext4_get_block); ++ return dax_mkwrite(vma, vmf, ext4_get_block, ext4_end_io_unwritten); + } + + static const struct vm_operations_struct ext4_dax_vm_ops = { +diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c +index 3291e1af0e24..f43996884242 100644 +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -656,16 +656,32 @@ has_zeroout: + return retval; + } + +-static void ext4_end_io_unwritten(struct buffer_head *bh, int uptodate) ++/* ++ * Update EXT4_MAP_FLAGS in bh->b_state. For buffer heads attached to pages ++ * we have to be careful as someone else may be manipulating b_state as well. ++ */ ++static void ext4_update_bh_state(struct buffer_head *bh, unsigned long flags) + { +- struct inode *inode = bh->b_assoc_map->host; +- /* XXX: breaks on 32-bit > 16GB. Is that even supported? */ +- loff_t offset = (loff_t)(uintptr_t)bh->b_private << inode->i_blkbits; +- int err; +- if (!uptodate) ++ unsigned long old_state; ++ unsigned long new_state; ++ ++ flags &= EXT4_MAP_FLAGS; ++ ++ /* Dummy buffer_head? Set non-atomically. */ ++ if (!bh->b_page) { ++ bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | flags; + return; +- WARN_ON(!buffer_unwritten(bh)); +- err = ext4_convert_unwritten_extents(NULL, inode, offset, bh->b_size); ++ } ++ /* ++ * Someone else may be modifying b_state. Be careful! This is ugly but ++ * once we get rid of using bh as a container for mapping information ++ * to pass to / from get_block functions, this can go away. ++ */ ++ do { ++ old_state = READ_ONCE(bh->b_state); ++ new_state = (old_state & ~EXT4_MAP_FLAGS) | flags; ++ } while (unlikely( ++ cmpxchg(&bh->b_state, old_state, new_state) != old_state)); + } + + /* Maximum number of blocks we map for direct IO at once. */ +@@ -704,11 +720,16 @@ static int _ext4_get_block(struct inode *inode, sector_t iblock, + ext4_io_end_t *io_end = ext4_inode_aio(inode); + + map_bh(bh, inode->i_sb, map.m_pblk); +- bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | map.m_flags; +- if (IS_DAX(inode) && buffer_unwritten(bh) && !io_end) { ++ ext4_update_bh_state(bh, map.m_flags); ++ if (IS_DAX(inode) && buffer_unwritten(bh)) { ++ /* ++ * dgc: I suspect unwritten conversion on ext4+DAX is ++ * fundamentally broken here when there are concurrent ++ * read/write in progress on this inode. ++ */ ++ WARN_ON_ONCE(io_end); + bh->b_assoc_map = inode->i_mapping; + bh->b_private = (void *)(unsigned long)iblock; +- bh->b_end_io = ext4_end_io_unwritten; + } + if (io_end && io_end->flag & EXT4_IO_END_UNWRITTEN) + set_buffer_defer_completion(bh); +@@ -1655,7 +1676,7 @@ int ext4_da_get_block_prep(struct inode *inode, sector_t iblock, + return ret; + + map_bh(bh, inode->i_sb, map.m_pblk); +- bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | map.m_flags; ++ ext4_update_bh_state(bh, map.m_flags); + + if (buffer_unwritten(bh)) { + /* A delayed write to unwritten bh should be marked +diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c +index 7da8ac1047f8..3fb92abe5707 100644 +--- a/fs/ext4/move_extent.c ++++ b/fs/ext4/move_extent.c +@@ -393,6 +393,7 @@ data_copy: + *err = ext4_get_block(orig_inode, orig_blk_offset + i, bh, 0); + if (*err < 0) + break; ++ bh = bh->b_this_page; + } + if (!*err) + *err = block_commit_write(pagep[0], from, from + replaced_size); +diff --git a/fs/fhandle.c b/fs/fhandle.c +index d59712dfa3e7..ca3c3dd01789 100644 +--- a/fs/fhandle.c ++++ b/fs/fhandle.c +@@ -228,7 +228,7 @@ long do_handle_open(int mountdirfd, + path_put(&path); + return fd; + } +- file = file_open_root(path.dentry, path.mnt, "", open_flag); ++ file = file_open_root(path.dentry, path.mnt, "", open_flag, 0); + if (IS_ERR(file)) { + put_unused_fd(fd); + retval = PTR_ERR(file); +diff --git a/fs/fuse/cuse.c b/fs/fuse/cuse.c +index e5bbf748b698..709a0d917b44 100644 +--- a/fs/fuse/cuse.c ++++ b/fs/fuse/cuse.c +@@ -90,7 +90,7 @@ static struct list_head *cuse_conntbl_head(dev_t devt) + + static ssize_t cuse_read_iter(struct kiocb *kiocb, struct iov_iter *to) + { +- struct fuse_io_priv io = { .async = 0, .file = kiocb->ki_filp }; ++ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb->ki_filp); + loff_t pos = 0; + + return fuse_direct_io(&io, to, &pos, FUSE_DIO_CUSE); +@@ -98,7 +98,7 @@ static ssize_t cuse_read_iter(struct kiocb *kiocb, struct iov_iter *to) + + static ssize_t cuse_write_iter(struct kiocb *kiocb, struct iov_iter *from) + { +- struct fuse_io_priv io = { .async = 0, .file = kiocb->ki_filp }; ++ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb->ki_filp); + loff_t pos = 0; + /* + * No locking or generic_write_checks(), the server is +diff --git a/fs/fuse/file.c b/fs/fuse/file.c +index 5ef05b5c4cff..3227091c2a64 100644 +--- a/fs/fuse/file.c ++++ b/fs/fuse/file.c +@@ -528,6 +528,11 @@ static void fuse_release_user_pages(struct fuse_req *req, int write) + } + } + ++static void fuse_io_release(struct kref *kref) ++{ ++ kfree(container_of(kref, struct fuse_io_priv, refcnt)); ++} ++ + static ssize_t fuse_get_res_by_io(struct fuse_io_priv *io) + { + if (io->err) +@@ -585,8 +590,9 @@ static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos) + } + + io->iocb->ki_complete(io->iocb, res, 0); +- kfree(io); + } ++ ++ kref_put(&io->refcnt, fuse_io_release); + } + + static void fuse_aio_complete_req(struct fuse_conn *fc, struct fuse_req *req) +@@ -613,6 +619,7 @@ static size_t fuse_async_req_send(struct fuse_conn *fc, struct fuse_req *req, + size_t num_bytes, struct fuse_io_priv *io) + { + spin_lock(&io->lock); ++ kref_get(&io->refcnt); + io->size += num_bytes; + io->reqs++; + spin_unlock(&io->lock); +@@ -691,7 +698,7 @@ static void fuse_short_read(struct fuse_req *req, struct inode *inode, + + static int fuse_do_readpage(struct file *file, struct page *page) + { +- struct fuse_io_priv io = { .async = 0, .file = file }; ++ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file); + struct inode *inode = page->mapping->host; + struct fuse_conn *fc = get_fuse_conn(inode); + struct fuse_req *req; +@@ -984,7 +991,7 @@ static size_t fuse_send_write_pages(struct fuse_req *req, struct file *file, + size_t res; + unsigned offset; + unsigned i; +- struct fuse_io_priv io = { .async = 0, .file = file }; ++ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file); + + for (i = 0; i < req->num_pages; i++) + fuse_wait_on_page_writeback(inode, req->pages[i]->index); +@@ -1049,6 +1056,7 @@ static ssize_t fuse_fill_write_pages(struct fuse_req *req, + tmp = iov_iter_copy_from_user_atomic(page, ii, offset, bytes); + flush_dcache_page(page); + ++ iov_iter_advance(ii, tmp); + if (!tmp) { + unlock_page(page); + page_cache_release(page); +@@ -1061,7 +1069,6 @@ static ssize_t fuse_fill_write_pages(struct fuse_req *req, + req->page_descs[req->num_pages].length = tmp; + req->num_pages++; + +- iov_iter_advance(ii, tmp); + count += tmp; + pos += tmp; + offset += tmp; +@@ -1398,7 +1405,7 @@ static ssize_t __fuse_direct_read(struct fuse_io_priv *io, + + static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to) + { +- struct fuse_io_priv io = { .async = 0, .file = iocb->ki_filp }; ++ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb->ki_filp); + return __fuse_direct_read(&io, to, &iocb->ki_pos); + } + +@@ -1406,7 +1413,7 @@ static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from) + { + struct file *file = iocb->ki_filp; + struct inode *inode = file_inode(file); +- struct fuse_io_priv io = { .async = 0, .file = file }; ++ struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file); + ssize_t res; + + if (is_bad_inode(inode)) +@@ -2786,6 +2793,7 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) + loff_t i_size; + size_t count = iov_iter_count(iter); + struct fuse_io_priv *io; ++ bool is_sync = is_sync_kiocb(iocb); + + pos = offset; + inode = file->f_mapping->host; +@@ -2806,6 +2814,7 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) + if (!io) + return -ENOMEM; + spin_lock_init(&io->lock); ++ kref_init(&io->refcnt); + io->reqs = 1; + io->bytes = -1; + io->size = 0; +@@ -2825,12 +2834,18 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) + * to wait on real async I/O requests, so we must submit this request + * synchronously. + */ +- if (!is_sync_kiocb(iocb) && (offset + count > i_size) && ++ if (!is_sync && (offset + count > i_size) && + iov_iter_rw(iter) == WRITE) + io->async = false; + +- if (io->async && is_sync_kiocb(iocb)) ++ if (io->async && is_sync) { ++ /* ++ * Additional reference to keep io around after ++ * calling fuse_aio_complete() ++ */ ++ kref_get(&io->refcnt); + io->done = &wait; ++ } + + if (iov_iter_rw(iter) == WRITE) { + ret = fuse_direct_io(io, iter, &pos, FUSE_DIO_WRITE); +@@ -2843,14 +2858,14 @@ fuse_direct_IO(struct kiocb *iocb, struct iov_iter *iter, loff_t offset) + fuse_aio_complete(io, ret < 0 ? ret : 0, -1); + + /* we have a non-extending, async request, so return */ +- if (!is_sync_kiocb(iocb)) ++ if (!is_sync) + return -EIOCBQUEUED; + + wait_for_completion(&wait); + ret = fuse_get_res_by_io(io); + } + +- kfree(io); ++ kref_put(&io->refcnt, fuse_io_release); + + if (iov_iter_rw(iter) == WRITE) { + if (ret > 0) +diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h +index 7354dc142a50..85f9d8273455 100644 +--- a/fs/fuse/fuse_i.h ++++ b/fs/fuse/fuse_i.h +@@ -22,6 +22,7 @@ + #include <linux/rbtree.h> + #include <linux/poll.h> + #include <linux/workqueue.h> ++#include <linux/kref.h> + + /** Max number of pages that can be used in a single read request */ + #define FUSE_MAX_PAGES_PER_REQ 32 +@@ -253,6 +254,7 @@ enum fuse_req_state { + + /** The request IO state (for asynchronous processing) */ + struct fuse_io_priv { ++ struct kref refcnt; + int async; + spinlock_t lock; + unsigned reqs; +@@ -266,6 +268,13 @@ struct fuse_io_priv { + struct completion *done; + }; + ++#define FUSE_IO_PRIV_SYNC(f) \ ++{ \ ++ .refcnt = { ATOMIC_INIT(1) }, \ ++ .async = 0, \ ++ .file = f, \ ++} ++ + /** + * A request to the client + */ +diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c +index 0469f32918a5..e4d224315a1f 100644 +--- a/fs/jbd2/journal.c ++++ b/fs/jbd2/journal.c +@@ -1423,11 +1423,12 @@ out: + /** + * jbd2_mark_journal_empty() - Mark on disk journal as empty. + * @journal: The journal to update. ++ * @write_op: With which operation should we write the journal sb + * + * Update a journal's dynamic superblock fields to show that journal is empty. + * Write updated superblock to disk waiting for IO to complete. + */ +-static void jbd2_mark_journal_empty(journal_t *journal) ++static void jbd2_mark_journal_empty(journal_t *journal, int write_op) + { + journal_superblock_t *sb = journal->j_superblock; + +@@ -1445,7 +1446,7 @@ static void jbd2_mark_journal_empty(journal_t *journal) + sb->s_start = cpu_to_be32(0); + read_unlock(&journal->j_state_lock); + +- jbd2_write_superblock(journal, WRITE_FUA); ++ jbd2_write_superblock(journal, write_op); + + /* Log is no longer empty */ + write_lock(&journal->j_state_lock); +@@ -1730,7 +1731,13 @@ int jbd2_journal_destroy(journal_t *journal) + if (journal->j_sb_buffer) { + if (!is_journal_aborted(journal)) { + mutex_lock(&journal->j_checkpoint_mutex); +- jbd2_mark_journal_empty(journal); ++ ++ write_lock(&journal->j_state_lock); ++ journal->j_tail_sequence = ++ ++journal->j_transaction_sequence; ++ write_unlock(&journal->j_state_lock); ++ ++ jbd2_mark_journal_empty(journal, WRITE_FLUSH_FUA); + mutex_unlock(&journal->j_checkpoint_mutex); + } else + err = -EIO; +@@ -1989,7 +1996,7 @@ int jbd2_journal_flush(journal_t *journal) + * the magic code for a fully-recovered superblock. Any future + * commits of data to the journal will restore the current + * s_start value. */ +- jbd2_mark_journal_empty(journal); ++ jbd2_mark_journal_empty(journal, WRITE_FUA); + mutex_unlock(&journal->j_checkpoint_mutex); + write_lock(&journal->j_state_lock); + J_ASSERT(!journal->j_running_transaction); +@@ -2035,7 +2042,7 @@ int jbd2_journal_wipe(journal_t *journal, int write) + if (write) { + /* Lock to make assertions happy... */ + mutex_lock(&journal->j_checkpoint_mutex); +- jbd2_mark_journal_empty(journal); ++ jbd2_mark_journal_empty(journal, WRITE_FUA); + mutex_unlock(&journal->j_checkpoint_mutex); + } + +diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c +index 864e2003e8de..2b50bc0c545e 100644 +--- a/fs/nfsd/nfs4proc.c ++++ b/fs/nfsd/nfs4proc.c +@@ -881,6 +881,7 @@ nfsd4_secinfo(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, + &exp, &dentry); + if (err) + return err; ++ fh_unlock(&cstate->current_fh); + if (d_really_is_negative(dentry)) { + exp_put(exp); + err = nfserr_noent; +diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c +index 3dd1b616b92b..d8297542f8b3 100644 +--- a/fs/nfsd/nfs4xdr.c ++++ b/fs/nfsd/nfs4xdr.c +@@ -1071,8 +1071,9 @@ nfsd4_decode_rename(struct nfsd4_compoundargs *argp, struct nfsd4_rename *rename + + READ_BUF(4); + rename->rn_snamelen = be32_to_cpup(p++); +- READ_BUF(rename->rn_snamelen + 4); ++ READ_BUF(rename->rn_snamelen); + SAVEMEM(rename->rn_sname, rename->rn_snamelen); ++ READ_BUF(4); + rename->rn_tnamelen = be32_to_cpup(p++); + READ_BUF(rename->rn_tnamelen); + SAVEMEM(rename->rn_tname, rename->rn_tnamelen); +@@ -1154,13 +1155,14 @@ nfsd4_decode_setclientid(struct nfsd4_compoundargs *argp, struct nfsd4_setclient + READ_BUF(8); + setclientid->se_callback_prog = be32_to_cpup(p++); + setclientid->se_callback_netid_len = be32_to_cpup(p++); +- +- READ_BUF(setclientid->se_callback_netid_len + 4); ++ READ_BUF(setclientid->se_callback_netid_len); + SAVEMEM(setclientid->se_callback_netid_val, setclientid->se_callback_netid_len); ++ READ_BUF(4); + setclientid->se_callback_addr_len = be32_to_cpup(p++); + +- READ_BUF(setclientid->se_callback_addr_len + 4); ++ READ_BUF(setclientid->se_callback_addr_len); + SAVEMEM(setclientid->se_callback_addr_val, setclientid->se_callback_addr_len); ++ READ_BUF(4); + setclientid->se_callback_ident = be32_to_cpup(p++); + + DECODE_TAIL; +@@ -1814,8 +1816,9 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp) + + READ_BUF(4); + argp->taglen = be32_to_cpup(p++); +- READ_BUF(argp->taglen + 8); ++ READ_BUF(argp->taglen); + SAVEMEM(argp->tag, argp->taglen); ++ READ_BUF(8); + argp->minorversion = be32_to_cpup(p++); + argp->opcnt = be32_to_cpup(p++); + max_reply += 4 + (XDR_QUADLEN(argp->taglen) << 2); +diff --git a/fs/ocfs2/dlm/dlmconvert.c b/fs/ocfs2/dlm/dlmconvert.c +index e36d63ff1783..f90931335c6b 100644 +--- a/fs/ocfs2/dlm/dlmconvert.c ++++ b/fs/ocfs2/dlm/dlmconvert.c +@@ -262,6 +262,7 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm, + struct dlm_lock *lock, int flags, int type) + { + enum dlm_status status; ++ u8 old_owner = res->owner; + + mlog(0, "type=%d, convert_type=%d, busy=%d\n", lock->ml.type, + lock->ml.convert_type, res->state & DLM_LOCK_RES_IN_PROGRESS); +@@ -287,6 +288,19 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm, + status = DLM_DENIED; + goto bail; + } ++ ++ if (lock->ml.type == type && lock->ml.convert_type == LKM_IVMODE) { ++ mlog(0, "last convert request returned DLM_RECOVERING, but " ++ "owner has already queued and sent ast to me. res %.*s, " ++ "(cookie=%u:%llu, type=%d, conv=%d)\n", ++ res->lockname.len, res->lockname.name, ++ dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)), ++ dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie)), ++ lock->ml.type, lock->ml.convert_type); ++ status = DLM_NORMAL; ++ goto bail; ++ } ++ + res->state |= DLM_LOCK_RES_IN_PROGRESS; + /* move lock to local convert queue */ + /* do not alter lock refcount. switching lists. */ +@@ -316,11 +330,19 @@ enum dlm_status dlmconvert_remote(struct dlm_ctxt *dlm, + spin_lock(&res->spinlock); + res->state &= ~DLM_LOCK_RES_IN_PROGRESS; + lock->convert_pending = 0; +- /* if it failed, move it back to granted queue */ ++ /* if it failed, move it back to granted queue. ++ * if master returns DLM_NORMAL and then down before sending ast, ++ * it may have already been moved to granted queue, reset to ++ * DLM_RECOVERING and retry convert */ + if (status != DLM_NORMAL) { + if (status != DLM_NOTQUEUED) + dlm_error(status); + dlm_revert_pending_convert(res, lock); ++ } else if ((res->state & DLM_LOCK_RES_RECOVERING) || ++ (old_owner != res->owner)) { ++ mlog(0, "res %.*s is in recovering or has been recovered.\n", ++ res->lockname.len, res->lockname.name); ++ status = DLM_RECOVERING; + } + bail: + spin_unlock(&res->spinlock); +diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c +index f25ff5d3a2f9..dad6d841f0da 100644 +--- a/fs/ocfs2/dlm/dlmrecovery.c ++++ b/fs/ocfs2/dlm/dlmrecovery.c +@@ -2064,7 +2064,6 @@ void dlm_move_lockres_to_recovery_list(struct dlm_ctxt *dlm, + dlm_lock_get(lock); + if (lock->convert_pending) { + /* move converting lock back to granted */ +- BUG_ON(i != DLM_CONVERTING_LIST); + mlog(0, "node died with convert pending " + "on %.*s. move back to granted list.\n", + res->lockname.len, res->lockname.name); +diff --git a/fs/open.c b/fs/open.c +index f9d2bf935099..ff80b2542989 100644 +--- a/fs/open.c ++++ b/fs/open.c +@@ -987,14 +987,12 @@ struct file *filp_open(const char *filename, int flags, umode_t mode) + EXPORT_SYMBOL(filp_open); + + struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt, +- const char *filename, int flags) ++ const char *filename, int flags, umode_t mode) + { + struct open_flags op; +- int err = build_open_flags(flags, 0, &op); ++ int err = build_open_flags(flags, mode, &op); + if (err) + return ERR_PTR(err); +- if (flags & O_CREAT) +- return ERR_PTR(-EINVAL); + return do_file_open_root(dentry, mnt, filename, &op); + } + EXPORT_SYMBOL(file_open_root); +diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c +index e505b44a9184..edd2a4a5fd3c 100644 +--- a/fs/overlayfs/inode.c ++++ b/fs/overlayfs/inode.c +@@ -62,15 +62,15 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr) + if (err) + goto out; + +- upperdentry = ovl_dentry_upper(dentry); +- if (upperdentry) { ++ err = ovl_copy_up(dentry); ++ if (!err) { ++ upperdentry = ovl_dentry_upper(dentry); ++ + mutex_lock(&upperdentry->d_inode->i_mutex); + err = notify_change(upperdentry, attr, NULL); + if (!err) + ovl_copyattr(upperdentry->d_inode, dentry->d_inode); + mutex_unlock(&upperdentry->d_inode->i_mutex); +- } else { +- err = ovl_copy_up_last(dentry, attr, false); + } + ovl_drop_write(dentry); + out: +diff --git a/fs/proc/array.c b/fs/proc/array.c +index 70f9c4cba31f..dca04edb6b90 100644 +--- a/fs/proc/array.c ++++ b/fs/proc/array.c +@@ -384,7 +384,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, + + state = *get_task_state(task); + vsize = eip = esp = 0; +- permitted = ptrace_may_access(task, PTRACE_MODE_READ | PTRACE_MODE_NOAUDIT); ++ permitted = ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS | PTRACE_MODE_NOAUDIT); + mm = get_task_mm(task); + if (mm) { + vsize = task_vsize(mm); +diff --git a/fs/proc/base.c b/fs/proc/base.c +index fcdeb1eb3921..68d51ed1666f 100644 +--- a/fs/proc/base.c ++++ b/fs/proc/base.c +@@ -211,7 +211,7 @@ static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns, + static int proc_pid_auxv(struct seq_file *m, struct pid_namespace *ns, + struct pid *pid, struct task_struct *task) + { +- struct mm_struct *mm = mm_access(task, PTRACE_MODE_READ); ++ struct mm_struct *mm = mm_access(task, PTRACE_MODE_READ_FSCREDS); + if (mm && !IS_ERR(mm)) { + unsigned int nwords = 0; + do { +@@ -238,7 +238,8 @@ static int proc_pid_wchan(struct seq_file *m, struct pid_namespace *ns, + + wchan = get_wchan(task); + +- if (wchan && ptrace_may_access(task, PTRACE_MODE_READ) && !lookup_symbol_name(wchan, symname)) ++ if (wchan && ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS) ++ && !lookup_symbol_name(wchan, symname)) + seq_printf(m, "%s", symname); + else + seq_putc(m, '0'); +@@ -252,7 +253,7 @@ static int lock_trace(struct task_struct *task) + int err = mutex_lock_killable(&task->signal->cred_guard_mutex); + if (err) + return err; +- if (!ptrace_may_access(task, PTRACE_MODE_ATTACH)) { ++ if (!ptrace_may_access(task, PTRACE_MODE_ATTACH_FSCREDS)) { + mutex_unlock(&task->signal->cred_guard_mutex); + return -EPERM; + } +@@ -502,7 +503,7 @@ static int proc_fd_access_allowed(struct inode *inode) + */ + task = get_proc_task(inode); + if (task) { +- allowed = ptrace_may_access(task, PTRACE_MODE_READ); ++ allowed = ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS); + put_task_struct(task); + } + return allowed; +@@ -537,7 +538,7 @@ static bool has_pid_permissions(struct pid_namespace *pid, + return true; + if (in_group_p(pid->pid_gid)) + return true; +- return ptrace_may_access(task, PTRACE_MODE_READ); ++ return ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS); + } + + +@@ -614,7 +615,7 @@ struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode) + struct mm_struct *mm = ERR_PTR(-ESRCH); + + if (task) { +- mm = mm_access(task, mode); ++ mm = mm_access(task, mode | PTRACE_MODE_FSCREDS); + put_task_struct(task); + + if (!IS_ERR_OR_NULL(mm)) { +@@ -1676,7 +1677,7 @@ static int map_files_d_revalidate(struct dentry *dentry, unsigned int flags) + if (!task) + goto out_notask; + +- mm = mm_access(task, PTRACE_MODE_READ); ++ mm = mm_access(task, PTRACE_MODE_READ_FSCREDS); + if (IS_ERR_OR_NULL(mm)) + goto out; + +@@ -1808,7 +1809,7 @@ static struct dentry *proc_map_files_lookup(struct inode *dir, + goto out; + + result = -EACCES; +- if (!ptrace_may_access(task, PTRACE_MODE_READ)) ++ if (!ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) + goto out_put_task; + + result = -ENOENT; +@@ -1865,7 +1866,7 @@ proc_map_files_readdir(struct file *file, struct dir_context *ctx) + goto out; + + ret = -EACCES; +- if (!ptrace_may_access(task, PTRACE_MODE_READ)) ++ if (!ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) + goto out_put_task; + + ret = 0; +@@ -2345,7 +2346,7 @@ static int do_io_accounting(struct task_struct *task, struct seq_file *m, int wh + if (result) + return result; + +- if (!ptrace_may_access(task, PTRACE_MODE_READ)) { ++ if (!ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) { + result = -EACCES; + goto out_unlock; + } +diff --git a/fs/proc/namespaces.c b/fs/proc/namespaces.c +index e512642dbbdc..1c70dec8809d 100644 +--- a/fs/proc/namespaces.c ++++ b/fs/proc/namespaces.c +@@ -42,7 +42,7 @@ static void *proc_ns_follow_link(struct dentry *dentry, struct nameidata *nd) + if (!task) + return error; + +- if (ptrace_may_access(task, PTRACE_MODE_READ)) { ++ if (ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) { + error = ns_get_path(&ns_path, task, ns_ops); + if (!error) + nd_jump_link(nd, &ns_path); +@@ -63,7 +63,7 @@ static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int bufl + if (!task) + return res; + +- if (ptrace_may_access(task, PTRACE_MODE_READ)) { ++ if (ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) { + res = ns_get_name(name, sizeof(name), task, ns_ops); + if (res >= 0) + res = readlink_copy(buffer, buflen, name); +diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c +index 8db932da4009..a5644c41a182 100644 +--- a/fs/proc_namespace.c ++++ b/fs/proc_namespace.c +@@ -196,6 +196,8 @@ static int show_vfsstat(struct seq_file *m, struct vfsmount *mnt) + if (sb->s_op->show_devname) { + seq_puts(m, "device "); + err = sb->s_op->show_devname(m, mnt_path.dentry); ++ if (err) ++ goto out; + } else { + if (r->mnt_devname) { + seq_puts(m, "device "); +diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c +index 20d1f74561cf..19c777ad0084 100644 +--- a/fs/quota/dquot.c ++++ b/fs/quota/dquot.c +@@ -1393,7 +1393,7 @@ static int dquot_active(const struct inode *inode) + static void __dquot_initialize(struct inode *inode, int type) + { + int cnt, init_needed = 0; +- struct dquot **dquots, *got[MAXQUOTAS]; ++ struct dquot **dquots, *got[MAXQUOTAS] = {}; + struct super_block *sb = inode->i_sb; + qsize_t rsv; + +@@ -1408,7 +1408,6 @@ static void __dquot_initialize(struct inode *inode, int type) + kprojid_t projid; + int rc; + +- got[cnt] = NULL; + if (type != -1 && cnt != type) + continue; + /* +diff --git a/fs/splice.c b/fs/splice.c +index bfe62ae40f40..e7522c486068 100644 +--- a/fs/splice.c ++++ b/fs/splice.c +@@ -185,6 +185,9 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe, + unsigned int spd_pages = spd->nr_pages; + int ret, do_wakeup, page_nr; + ++ if (!spd_pages) ++ return 0; ++ + ret = 0; + do_wakeup = 0; + page_nr = 0; +diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c +index 65fb37a18e92..8f7e09d0d0f0 100644 +--- a/fs/xfs/xfs_attr_list.c ++++ b/fs/xfs/xfs_attr_list.c +@@ -202,8 +202,10 @@ xfs_attr_shortform_list(xfs_attr_list_context_t *context) + sbp->namelen, + sbp->valuelen, + &sbp->name[sbp->namelen]); +- if (error) ++ if (error) { ++ kmem_free(sbuf); + return error; ++ } + if (context->seen_enough) + break; + cursor->offset++; +@@ -454,14 +456,13 @@ xfs_attr3_leaf_list_int( + args.rmtblkcnt = xfs_attr3_rmt_blocks( + args.dp->i_mount, valuelen); + retval = xfs_attr_rmtval_get(&args); +- if (retval) +- return retval; +- retval = context->put_listent(context, +- entry->flags, +- name_rmt->name, +- (int)name_rmt->namelen, +- valuelen, +- args.value); ++ if (!retval) ++ retval = context->put_listent(context, ++ entry->flags, ++ name_rmt->name, ++ (int)name_rmt->namelen, ++ valuelen, ++ args.value); + kmem_free(args.value); + } else { + retval = context->put_listent(context, +diff --git a/include/asm-generic/bitops/lock.h b/include/asm-generic/bitops/lock.h +index c30266e94806..8ef0ccbf8167 100644 +--- a/include/asm-generic/bitops/lock.h ++++ b/include/asm-generic/bitops/lock.h +@@ -29,16 +29,16 @@ do { \ + * @nr: the bit to set + * @addr: the address to start counting from + * +- * This operation is like clear_bit_unlock, however it is not atomic. +- * It does provide release barrier semantics so it can be used to unlock +- * a bit lock, however it would only be used if no other CPU can modify +- * any bits in the memory until the lock is released (a good example is +- * if the bit lock itself protects access to the other bits in the word). ++ * A weaker form of clear_bit_unlock() as used by __bit_lock_unlock(). If all ++ * the bits in the word are protected by this lock some archs can use weaker ++ * ops to safely unlock. ++ * ++ * See for example x86's implementation. + */ + #define __clear_bit_unlock(nr, addr) \ + do { \ +- smp_mb(); \ +- __clear_bit(nr, addr); \ ++ smp_mb__before_atomic(); \ ++ clear_bit(nr, addr); \ + } while (0) + + #endif /* _ASM_GENERIC_BITOPS_LOCK_H_ */ +diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h +index c7f01d1aa562..653acf4cc44a 100644 +--- a/include/drm/drm_dp_mst_helper.h ++++ b/include/drm/drm_dp_mst_helper.h +@@ -44,8 +44,6 @@ struct drm_dp_vcpi { + /** + * struct drm_dp_mst_port - MST port + * @kref: reference count for this port. +- * @guid_valid: for DP 1.2 devices if we have validated the GUID. +- * @guid: guid for DP 1.2 device on this port. + * @port_num: port number + * @input: if this port is an input port. + * @mcs: message capability status - DP 1.2 spec. +@@ -70,10 +68,6 @@ struct drm_dp_vcpi { + struct drm_dp_mst_port { + struct kref kref; + +- /* if dpcd 1.2 device is on this port - its GUID info */ +- bool guid_valid; +- u8 guid[16]; +- + u8 port_num; + bool input; + bool mcs; +@@ -109,10 +103,12 @@ struct drm_dp_mst_port { + * @tx_slots: transmission slots for this device. + * @last_seqno: last sequence number used to talk to this. + * @link_address_sent: if a link address message has been sent to this device yet. ++ * @guid: guid for DP 1.2 branch device. port under this branch can be ++ * identified by port #. + * + * This structure represents an MST branch device, there is one +- * primary branch device at the root, along with any others connected +- * to downstream ports ++ * primary branch device at the root, along with any other branches connected ++ * to downstream port of parent branches. + */ + struct drm_dp_mst_branch { + struct kref kref; +@@ -131,6 +127,9 @@ struct drm_dp_mst_branch { + struct drm_dp_sideband_msg_tx *tx_slots[2]; + int last_seqno; + bool link_address_sent; ++ ++ /* global unique identifier to identify branch devices */ ++ u8 guid[16]; + }; + + +@@ -404,11 +403,9 @@ struct drm_dp_payload { + * @conn_base_id: DRM connector ID this mgr is connected to. + * @down_rep_recv: msg receiver state for down replies. + * @up_req_recv: msg receiver state for up requests. +- * @lock: protects mst state, primary, guid, dpcd. ++ * @lock: protects mst state, primary, dpcd. + * @mst_state: if this manager is enabled for an MST capable port. + * @mst_primary: pointer to the primary branch device. +- * @guid_valid: GUID valid for the primary branch device. +- * @guid: GUID for primary port. + * @dpcd: cache of DPCD for primary port. + * @pbn_div: PBN to slots divisor. + * +@@ -430,13 +427,11 @@ struct drm_dp_mst_topology_mgr { + struct drm_dp_sideband_msg_rx up_req_recv; + + /* pointer to info about the initial MST device */ +- struct mutex lock; /* protects mst_state + primary + guid + dpcd */ ++ struct mutex lock; /* protects mst_state + primary + dpcd */ + + bool mst_state; + struct drm_dp_mst_branch *mst_primary; +- /* primary MST device GUID */ +- bool guid_valid; +- u8 guid[16]; ++ + u8 dpcd[DP_RECEIVER_CAP_SIZE]; + u8 sink_count; + int pbn_div; +diff --git a/include/linux/atmel-mci.h b/include/linux/atmel-mci.h +index 9177947bf032..e753062b9355 100644 +--- a/include/linux/atmel-mci.h ++++ b/include/linux/atmel-mci.h +@@ -2,6 +2,7 @@ + #define __LINUX_ATMEL_MCI_H + + #include <linux/types.h> ++#include <linux/dmaengine.h> + + #define ATMCI_MAX_NR_SLOTS 2 + +@@ -37,6 +38,7 @@ struct mci_slot_pdata { + */ + struct mci_platform_data { + struct mci_dma_data *dma_slave; ++ dma_filter_fn dma_filter; + struct mci_slot_pdata slot[ATMCI_MAX_NR_SLOTS]; + }; + +diff --git a/include/linux/efi.h b/include/linux/efi.h +index af5be0368dec..7f764000dab9 100644 +--- a/include/linux/efi.h ++++ b/include/linux/efi.h +@@ -1162,7 +1162,10 @@ int efivar_entry_iter(int (*func)(struct efivar_entry *, void *), + struct efivar_entry *efivar_entry_find(efi_char16_t *name, efi_guid_t guid, + struct list_head *head, bool remove); + +-bool efivar_validate(efi_char16_t *var_name, u8 *data, unsigned long len); ++bool efivar_validate(efi_guid_t vendor, efi_char16_t *var_name, u8 *data, ++ unsigned long data_size); ++bool efivar_variable_is_removable(efi_guid_t vendor, const char *name, ++ size_t len); + + extern struct work_struct efivar_work; + void efivar_run_worker(void); +diff --git a/include/linux/fs.h b/include/linux/fs.h +index fdc369fa69e8..ae327f6a53f6 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -70,6 +70,7 @@ typedef int (get_block_t)(struct inode *inode, sector_t iblock, + struct buffer_head *bh_result, int create); + typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, + ssize_t bytes, void *private); ++typedef void (dax_iodone_t)(struct buffer_head *bh_map, int uptodate); + + #define MAY_EXEC 0x00000001 + #define MAY_WRITE 0x00000002 +@@ -2201,7 +2202,7 @@ extern long do_sys_open(int dfd, const char __user *filename, int flags, + extern struct file *file_open_name(struct filename *, int, umode_t); + extern struct file *filp_open(const char *, int, umode_t); + extern struct file *file_open_root(struct dentry *, struct vfsmount *, +- const char *, int); ++ const char *, int, umode_t); + extern struct file * dentry_open(const struct path *, int, const struct cred *); + extern int filp_close(struct file *, fl_owner_t id); + +@@ -2635,9 +2636,10 @@ ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t, + int dax_clear_blocks(struct inode *, sector_t block, long size); + int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t); + int dax_truncate_page(struct inode *, loff_t from, get_block_t); +-int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t); ++int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t, ++ dax_iodone_t); + int dax_pfn_mkwrite(struct vm_area_struct *, struct vm_fault *); +-#define dax_mkwrite(vma, vmf, gb) dax_fault(vma, vmf, gb) ++#define dax_mkwrite(vma, vmf, gb, iod) dax_fault(vma, vmf, gb, iod) + + #ifdef CONFIG_BLOCK + typedef void (dio_submit_t)(int rw, struct bio *bio, struct inode *inode, +diff --git a/include/linux/kernel.h b/include/linux/kernel.h +index 3a5b48e52a9e..d837f2a41665 100644 +--- a/include/linux/kernel.h ++++ b/include/linux/kernel.h +@@ -606,7 +606,7 @@ do { \ + + #define do_trace_printk(fmt, args...) \ + do { \ +- static const char *trace_printk_fmt \ ++ static const char *trace_printk_fmt __used \ + __attribute__((section("__trace_printk_fmt"))) = \ + __builtin_constant_p(fmt) ? fmt : NULL; \ + \ +@@ -650,7 +650,7 @@ int __trace_printk(unsigned long ip, const char *fmt, ...); + */ + + #define trace_puts(str) ({ \ +- static const char *trace_printk_fmt \ ++ static const char *trace_printk_fmt __used \ + __attribute__((section("__trace_printk_fmt"))) = \ + __builtin_constant_p(str) ? str : NULL; \ + \ +@@ -672,7 +672,7 @@ extern void trace_dump_stack(int skip); + #define ftrace_vprintk(fmt, vargs) \ + do { \ + if (__builtin_constant_p(fmt)) { \ +- static const char *trace_printk_fmt \ ++ static const char *trace_printk_fmt __used \ + __attribute__((section("__trace_printk_fmt"))) = \ + __builtin_constant_p(fmt) ? fmt : NULL; \ + \ +diff --git a/include/linux/mm.h b/include/linux/mm.h +index b2085582d44e..6b85ec64d302 100644 +--- a/include/linux/mm.h ++++ b/include/linux/mm.h +@@ -588,7 +588,7 @@ static inline compound_page_dtor *get_compound_page_dtor(struct page *page) + return page[1].compound_dtor; + } + +-static inline int compound_order(struct page *page) ++static inline unsigned int compound_order(struct page *page) + { + if (!PageHead(page)) + return 0; +@@ -1771,7 +1771,8 @@ extern void si_meminfo(struct sysinfo * val); + extern void si_meminfo_node(struct sysinfo *val, int nid); + + extern __printf(3, 4) +-void warn_alloc_failed(gfp_t gfp_mask, int order, const char *fmt, ...); ++void warn_alloc_failed(gfp_t gfp_mask, unsigned int order, ++ const char *fmt, ...); + + extern void setup_per_cpu_pageset(void); + +diff --git a/include/linux/module.h b/include/linux/module.h +index c883b86ea964..b2da02e1591d 100644 +--- a/include/linux/module.h ++++ b/include/linux/module.h +@@ -210,6 +210,12 @@ enum module_state { + MODULE_STATE_UNFORMED, /* Still setting it up. */ + }; + ++struct mod_kallsyms { ++ Elf_Sym *symtab; ++ unsigned int num_symtab; ++ char *strtab; ++}; ++ + struct module { + enum module_state state; + +@@ -297,14 +303,9 @@ struct module { + #endif + + #ifdef CONFIG_KALLSYMS +- /* +- * We keep the symbol and string tables for kallsyms. +- * The core_* fields below are temporary, loader-only (they +- * could really be discarded after module init). +- */ +- Elf_Sym *symtab, *core_symtab; +- unsigned int num_symtab, core_num_syms; +- char *strtab, *core_strtab; ++ /* Protected by RCU and/or module_mutex: use rcu_dereference() */ ++ struct mod_kallsyms *kallsyms; ++ struct mod_kallsyms core_kallsyms; + + /* Section attributes */ + struct module_sect_attrs *sect_attrs; +diff --git a/include/linux/pageblock-flags.h b/include/linux/pageblock-flags.h +index 2baeee12f48e..e942558b3585 100644 +--- a/include/linux/pageblock-flags.h ++++ b/include/linux/pageblock-flags.h +@@ -44,7 +44,7 @@ enum pageblock_bits { + #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE + + /* Huge page sizes are variable */ +-extern int pageblock_order; ++extern unsigned int pageblock_order; + + #else /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */ + +diff --git a/include/linux/pci.h b/include/linux/pci.h +index 6e935e5eab56..109ccee9e3e6 100644 +--- a/include/linux/pci.h ++++ b/include/linux/pci.h +@@ -357,6 +357,8 @@ struct pci_dev { + unsigned int broken_intx_masking:1; + unsigned int io_window_1k:1; /* Intel P2P bridge 1K I/O windows */ + unsigned int irq_managed:1; ++ unsigned int has_secondary_link:1; ++ unsigned int non_compliant_bars:1; /* broken BARs; ignore them */ + pci_dev_flags_t dev_flags; + atomic_t enable_cnt; /* pci_enable_device has been called */ + +diff --git a/include/linux/poison.h b/include/linux/poison.h +index 2110a81c5e2a..253c9b4198ef 100644 +--- a/include/linux/poison.h ++++ b/include/linux/poison.h +@@ -19,8 +19,8 @@ + * under normal circumstances, used to verify that nobody uses + * non-initialized list entries. + */ +-#define LIST_POISON1 ((void *) 0x00100100 + POISON_POINTER_DELTA) +-#define LIST_POISON2 ((void *) 0x00200200 + POISON_POINTER_DELTA) ++#define LIST_POISON1 ((void *) 0x100 + POISON_POINTER_DELTA) ++#define LIST_POISON2 ((void *) 0x200 + POISON_POINTER_DELTA) + + /********** include/linux/timer.h **********/ + /* +diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h +index 987a73a40ef8..998c098dd172 100644 +--- a/include/linux/ptrace.h ++++ b/include/linux/ptrace.h +@@ -56,7 +56,29 @@ extern void exit_ptrace(struct task_struct *tracer, struct list_head *dead); + #define PTRACE_MODE_READ 0x01 + #define PTRACE_MODE_ATTACH 0x02 + #define PTRACE_MODE_NOAUDIT 0x04 +-/* Returns true on success, false on denial. */ ++#define PTRACE_MODE_FSCREDS 0x08 ++#define PTRACE_MODE_REALCREDS 0x10 ++ ++/* shorthands for READ/ATTACH and FSCREDS/REALCREDS combinations */ ++#define PTRACE_MODE_READ_FSCREDS (PTRACE_MODE_READ | PTRACE_MODE_FSCREDS) ++#define PTRACE_MODE_READ_REALCREDS (PTRACE_MODE_READ | PTRACE_MODE_REALCREDS) ++#define PTRACE_MODE_ATTACH_FSCREDS (PTRACE_MODE_ATTACH | PTRACE_MODE_FSCREDS) ++#define PTRACE_MODE_ATTACH_REALCREDS (PTRACE_MODE_ATTACH | PTRACE_MODE_REALCREDS) ++ ++/** ++ * ptrace_may_access - check whether the caller is permitted to access ++ * a target task. ++ * @task: target task ++ * @mode: selects type of access and caller credentials ++ * ++ * Returns true on success, false on denial. ++ * ++ * One of the flags PTRACE_MODE_FSCREDS and PTRACE_MODE_REALCREDS must ++ * be set in @mode to specify whether the access was requested through ++ * a filesystem syscall (should use effective capabilities and fsuid ++ * of the caller) or through an explicit syscall such as ++ * process_vm_writev or ptrace (and should use the real credentials). ++ */ + extern bool ptrace_may_access(struct task_struct *task, unsigned int mode); + + static inline int ptrace_reparented(struct task_struct *child) +diff --git a/include/linux/thermal.h b/include/linux/thermal.h +index 2e7d0f7a0ecc..63830c4a49e6 100644 +--- a/include/linux/thermal.h ++++ b/include/linux/thermal.h +@@ -146,6 +146,7 @@ struct thermal_attr { + * @trip_hyst_attrs: attributes for trip points for sysfs: trip hysteresis + * @devdata: private pointer for device private data + * @trips: number of trip points the thermal zone supports ++ * @trips_disabled; bitmap for disabled trips + * @passive_delay: number of milliseconds to wait between polls when + * performing passive cooling. Currenty only used by the + * step-wise governor +@@ -182,6 +183,7 @@ struct thermal_zone_device { + struct thermal_attr *trip_hyst_attrs; + void *devdata; + int trips; ++ unsigned long trips_disabled; /* bitmap for disabled trips */ + int passive_delay; + int polling_delay; + int temperature; +diff --git a/include/linux/tty.h b/include/linux/tty.h +index 9580c09afdbe..5e704e26f9a2 100644 +--- a/include/linux/tty.h ++++ b/include/linux/tty.h +@@ -592,7 +592,7 @@ static inline int tty_ldisc_receive_buf(struct tty_ldisc *ld, unsigned char *p, + count = ld->ops->receive_buf2(ld->tty, p, f, count); + else { + count = min_t(int, count, ld->tty->receive_room); +- if (count) ++ if (count && ld->ops->receive_buf) + ld->ops->receive_buf(ld->tty, p, f, count); + } + return count; +diff --git a/include/linux/ucs2_string.h b/include/linux/ucs2_string.h +index cbb20afdbc01..bb679b48f408 100644 +--- a/include/linux/ucs2_string.h ++++ b/include/linux/ucs2_string.h +@@ -11,4 +11,8 @@ unsigned long ucs2_strlen(const ucs2_char_t *s); + unsigned long ucs2_strsize(const ucs2_char_t *data, unsigned long maxlength); + int ucs2_strncmp(const ucs2_char_t *a, const ucs2_char_t *b, size_t len); + ++unsigned long ucs2_utf8size(const ucs2_char_t *src); ++unsigned long ucs2_as_utf8(u8 *dest, const ucs2_char_t *src, ++ unsigned long maxlength); ++ + #endif /* _LINUX_UCS2_STRING_H_ */ +diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h +index 2a8aa9dfb83d..3b78437d0c4c 100644 +--- a/include/sound/hdaudio.h ++++ b/include/sound/hdaudio.h +@@ -137,15 +137,15 @@ static inline int snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid, + } + + #ifdef CONFIG_PM +-void snd_hdac_power_up(struct hdac_device *codec); +-void snd_hdac_power_down(struct hdac_device *codec); +-void snd_hdac_power_up_pm(struct hdac_device *codec); +-void snd_hdac_power_down_pm(struct hdac_device *codec); ++int snd_hdac_power_up(struct hdac_device *codec); ++int snd_hdac_power_down(struct hdac_device *codec); ++int snd_hdac_power_up_pm(struct hdac_device *codec); ++int snd_hdac_power_down_pm(struct hdac_device *codec); + #else +-static inline void snd_hdac_power_up(struct hdac_device *codec) {} +-static inline void snd_hdac_power_down(struct hdac_device *codec) {} +-static inline void snd_hdac_power_up_pm(struct hdac_device *codec) {} +-static inline void snd_hdac_power_down_pm(struct hdac_device *codec) {} ++static inline int snd_hdac_power_up(struct hdac_device *codec) { return 0; } ++static inline int snd_hdac_power_down(struct hdac_device *codec) { return 0; } ++static inline int snd_hdac_power_up_pm(struct hdac_device *codec) { return 0; } ++static inline int snd_hdac_power_down_pm(struct hdac_device *codec) { return 0; } + #endif + + /* +diff --git a/kernel/events/core.c b/kernel/events/core.c +index 66e6568a4736..6da64f0d0630 100644 +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -3314,7 +3314,7 @@ find_lively_task_by_vpid(pid_t vpid) + + /* Reuse ptrace permission checks for now. */ + err = -EACCES; +- if (!ptrace_may_access(task, PTRACE_MODE_READ)) ++ if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS)) + goto errout; + + return task; +diff --git a/kernel/futex.c b/kernel/futex.c +index f3043db6d36f..b75fbddacf0e 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -2763,7 +2763,7 @@ SYSCALL_DEFINE3(get_robust_list, int, pid, + } + + ret = -EPERM; +- if (!ptrace_may_access(p, PTRACE_MODE_READ)) ++ if (!ptrace_may_access(p, PTRACE_MODE_READ_REALCREDS)) + goto err_unlock; + + head = p->robust_list; +diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c +index 55c8c9349cfe..4ae3232e7a28 100644 +--- a/kernel/futex_compat.c ++++ b/kernel/futex_compat.c +@@ -155,7 +155,7 @@ COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid, + } + + ret = -EPERM; +- if (!ptrace_may_access(p, PTRACE_MODE_READ)) ++ if (!ptrace_may_access(p, PTRACE_MODE_READ_REALCREDS)) + goto err_unlock; + + head = p->compat_robust_list; +diff --git a/kernel/kcmp.c b/kernel/kcmp.c +index 0aa69ea1d8fd..3a47fa998fe0 100644 +--- a/kernel/kcmp.c ++++ b/kernel/kcmp.c +@@ -122,8 +122,8 @@ SYSCALL_DEFINE5(kcmp, pid_t, pid1, pid_t, pid2, int, type, + &task2->signal->cred_guard_mutex); + if (ret) + goto err; +- if (!ptrace_may_access(task1, PTRACE_MODE_READ) || +- !ptrace_may_access(task2, PTRACE_MODE_READ)) { ++ if (!ptrace_may_access(task1, PTRACE_MODE_READ_REALCREDS) || ++ !ptrace_may_access(task2, PTRACE_MODE_READ_REALCREDS)) { + ret = -EPERM; + goto err_unlock; + } +diff --git a/kernel/module.c b/kernel/module.c +index 3b9ff966edb9..be8971d817ed 100644 +--- a/kernel/module.c ++++ b/kernel/module.c +@@ -178,6 +178,9 @@ struct load_info { + struct _ddebug *debug; + unsigned int num_debug; + bool sig_ok; ++#ifdef CONFIG_KALLSYMS ++ unsigned long mod_kallsyms_init_off; ++#endif + struct { + unsigned int sym, str, mod, vers, info, pcpu; + } index; +@@ -2321,10 +2324,21 @@ static void layout_symtab(struct module *mod, struct load_info *info) + strsect->sh_flags |= SHF_ALLOC; + strsect->sh_entsize = get_offset(mod, &mod->init_size, strsect, + info->index.str) | INIT_OFFSET_MASK; +- mod->init_size = debug_align(mod->init_size); + pr_debug("\t%s\n", info->secstrings + strsect->sh_name); ++ ++ /* We'll tack temporary mod_kallsyms on the end. */ ++ mod->init_size = ALIGN(mod->init_size, ++ __alignof__(struct mod_kallsyms)); ++ info->mod_kallsyms_init_off = mod->init_size; ++ mod->init_size += sizeof(struct mod_kallsyms); ++ mod->init_size = debug_align(mod->init_size); + } + ++/* ++ * We use the full symtab and strtab which layout_symtab arranged to ++ * be appended to the init section. Later we switch to the cut-down ++ * core-only ones. ++ */ + static void add_kallsyms(struct module *mod, const struct load_info *info) + { + unsigned int i, ndst; +@@ -2333,28 +2347,33 @@ static void add_kallsyms(struct module *mod, const struct load_info *info) + char *s; + Elf_Shdr *symsec = &info->sechdrs[info->index.sym]; + +- mod->symtab = (void *)symsec->sh_addr; +- mod->num_symtab = symsec->sh_size / sizeof(Elf_Sym); ++ /* Set up to point into init section. */ ++ mod->kallsyms = mod->module_init + info->mod_kallsyms_init_off; ++ ++ mod->kallsyms->symtab = (void *)symsec->sh_addr; ++ mod->kallsyms->num_symtab = symsec->sh_size / sizeof(Elf_Sym); + /* Make sure we get permanent strtab: don't use info->strtab. */ +- mod->strtab = (void *)info->sechdrs[info->index.str].sh_addr; ++ mod->kallsyms->strtab = (void *)info->sechdrs[info->index.str].sh_addr; + + /* Set types up while we still have access to sections. */ +- for (i = 0; i < mod->num_symtab; i++) +- mod->symtab[i].st_info = elf_type(&mod->symtab[i], info); +- +- mod->core_symtab = dst = mod->module_core + info->symoffs; +- mod->core_strtab = s = mod->module_core + info->stroffs; +- src = mod->symtab; +- for (ndst = i = 0; i < mod->num_symtab; i++) { ++ for (i = 0; i < mod->kallsyms->num_symtab; i++) ++ mod->kallsyms->symtab[i].st_info ++ = elf_type(&mod->kallsyms->symtab[i], info); ++ ++ /* Now populate the cut down core kallsyms for after init. */ ++ mod->core_kallsyms.symtab = dst = mod->module_core + info->symoffs; ++ mod->core_kallsyms.strtab = s = mod->module_core + info->stroffs; ++ src = mod->kallsyms->symtab; ++ for (ndst = i = 0; i < mod->kallsyms->num_symtab; i++) { + if (i == 0 || + is_core_symbol(src+i, info->sechdrs, info->hdr->e_shnum)) { + dst[ndst] = src[i]; +- dst[ndst++].st_name = s - mod->core_strtab; +- s += strlcpy(s, &mod->strtab[src[i].st_name], ++ dst[ndst++].st_name = s - mod->core_kallsyms.strtab; ++ s += strlcpy(s, &mod->kallsyms->strtab[src[i].st_name], + KSYM_NAME_LEN) + 1; + } + } +- mod->core_num_syms = ndst; ++ mod->core_kallsyms.num_symtab = ndst; + } + #else + static inline void layout_symtab(struct module *mod, struct load_info *info) +@@ -3119,9 +3138,8 @@ static noinline int do_init_module(struct module *mod) + module_put(mod); + trim_init_extable(mod); + #ifdef CONFIG_KALLSYMS +- mod->num_symtab = mod->core_num_syms; +- mod->symtab = mod->core_symtab; +- mod->strtab = mod->core_strtab; ++ /* Switch to core kallsyms now init is done: kallsyms may be walking! */ ++ rcu_assign_pointer(mod->kallsyms, &mod->core_kallsyms); + #endif + unset_module_init_ro_nx(mod); + module_arch_freeing_init(mod); +@@ -3469,6 +3487,11 @@ static inline int is_arm_mapping_symbol(const char *str) + && (str[2] == '\0' || str[2] == '.'); + } + ++static const char *symname(struct mod_kallsyms *kallsyms, unsigned int symnum) ++{ ++ return kallsyms->strtab + kallsyms->symtab[symnum].st_name; ++} ++ + static const char *get_ksymbol(struct module *mod, + unsigned long addr, + unsigned long *size, +@@ -3476,6 +3499,7 @@ static const char *get_ksymbol(struct module *mod, + { + unsigned int i, best = 0; + unsigned long nextval; ++ struct mod_kallsyms *kallsyms = rcu_dereference_sched(mod->kallsyms); + + /* At worse, next value is at end of module */ + if (within_module_init(addr, mod)) +@@ -3485,32 +3509,32 @@ static const char *get_ksymbol(struct module *mod, + + /* Scan for closest preceding symbol, and next symbol. (ELF + starts real symbols at 1). */ +- for (i = 1; i < mod->num_symtab; i++) { +- if (mod->symtab[i].st_shndx == SHN_UNDEF) ++ for (i = 1; i < kallsyms->num_symtab; i++) { ++ if (kallsyms->symtab[i].st_shndx == SHN_UNDEF) + continue; + + /* We ignore unnamed symbols: they're uninformative + * and inserted at a whim. */ +- if (mod->symtab[i].st_value <= addr +- && mod->symtab[i].st_value > mod->symtab[best].st_value +- && *(mod->strtab + mod->symtab[i].st_name) != '\0' +- && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) ++ if (*symname(kallsyms, i) == '\0' ++ || is_arm_mapping_symbol(symname(kallsyms, i))) ++ continue; ++ ++ if (kallsyms->symtab[i].st_value <= addr ++ && kallsyms->symtab[i].st_value > kallsyms->symtab[best].st_value) + best = i; +- if (mod->symtab[i].st_value > addr +- && mod->symtab[i].st_value < nextval +- && *(mod->strtab + mod->symtab[i].st_name) != '\0' +- && !is_arm_mapping_symbol(mod->strtab + mod->symtab[i].st_name)) +- nextval = mod->symtab[i].st_value; ++ if (kallsyms->symtab[i].st_value > addr ++ && kallsyms->symtab[i].st_value < nextval) ++ nextval = kallsyms->symtab[i].st_value; + } + + if (!best) + return NULL; + + if (size) +- *size = nextval - mod->symtab[best].st_value; ++ *size = nextval - kallsyms->symtab[best].st_value; + if (offset) +- *offset = addr - mod->symtab[best].st_value; +- return mod->strtab + mod->symtab[best].st_name; ++ *offset = addr - kallsyms->symtab[best].st_value; ++ return symname(kallsyms, best); + } + + /* For kallsyms to ask for address resolution. NULL means not found. Careful +@@ -3603,19 +3627,21 @@ int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type, + + preempt_disable(); + list_for_each_entry_rcu(mod, &modules, list) { ++ struct mod_kallsyms *kallsyms; ++ + if (mod->state == MODULE_STATE_UNFORMED) + continue; +- if (symnum < mod->num_symtab) { +- *value = mod->symtab[symnum].st_value; +- *type = mod->symtab[symnum].st_info; +- strlcpy(name, mod->strtab + mod->symtab[symnum].st_name, +- KSYM_NAME_LEN); ++ kallsyms = rcu_dereference_sched(mod->kallsyms); ++ if (symnum < kallsyms->num_symtab) { ++ *value = kallsyms->symtab[symnum].st_value; ++ *type = kallsyms->symtab[symnum].st_info; ++ strlcpy(name, symname(kallsyms, symnum), KSYM_NAME_LEN); + strlcpy(module_name, mod->name, MODULE_NAME_LEN); + *exported = is_exported(name, *value, mod); + preempt_enable(); + return 0; + } +- symnum -= mod->num_symtab; ++ symnum -= kallsyms->num_symtab; + } + preempt_enable(); + return -ERANGE; +@@ -3624,11 +3650,12 @@ int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type, + static unsigned long mod_find_symname(struct module *mod, const char *name) + { + unsigned int i; ++ struct mod_kallsyms *kallsyms = rcu_dereference_sched(mod->kallsyms); + +- for (i = 0; i < mod->num_symtab; i++) +- if (strcmp(name, mod->strtab+mod->symtab[i].st_name) == 0 && +- mod->symtab[i].st_info != 'U') +- return mod->symtab[i].st_value; ++ for (i = 0; i < kallsyms->num_symtab; i++) ++ if (strcmp(name, symname(kallsyms, i)) == 0 && ++ kallsyms->symtab[i].st_info != 'U') ++ return kallsyms->symtab[i].st_value; + return 0; + } + +@@ -3665,11 +3692,14 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *, + int ret; + + list_for_each_entry(mod, &modules, list) { ++ /* We hold module_mutex: no need for rcu_dereference_sched */ ++ struct mod_kallsyms *kallsyms = mod->kallsyms; ++ + if (mod->state == MODULE_STATE_UNFORMED) + continue; +- for (i = 0; i < mod->num_symtab; i++) { +- ret = fn(data, mod->strtab + mod->symtab[i].st_name, +- mod, mod->symtab[i].st_value); ++ for (i = 0; i < kallsyms->num_symtab; i++) { ++ ret = fn(data, symname(kallsyms, i), ++ mod, kallsyms->symtab[i].st_value); + if (ret != 0) + return ret; + } +diff --git a/kernel/ptrace.c b/kernel/ptrace.c +index c8e0e050a36a..261ee21e62db 100644 +--- a/kernel/ptrace.c ++++ b/kernel/ptrace.c +@@ -219,6 +219,14 @@ static int ptrace_has_cap(struct user_namespace *ns, unsigned int mode) + static int __ptrace_may_access(struct task_struct *task, unsigned int mode) + { + const struct cred *cred = current_cred(), *tcred; ++ int dumpable = 0; ++ kuid_t caller_uid; ++ kgid_t caller_gid; ++ ++ if (!(mode & PTRACE_MODE_FSCREDS) == !(mode & PTRACE_MODE_REALCREDS)) { ++ WARN(1, "denying ptrace access check without PTRACE_MODE_*CREDS\n"); ++ return -EPERM; ++ } + + /* May we inspect the given task? + * This check is used both for attaching with ptrace +@@ -228,18 +236,33 @@ static int __ptrace_may_access(struct task_struct *task, unsigned int mode) + * because setting up the necessary parent/child relationship + * or halting the specified task is impossible. + */ +- int dumpable = 0; ++ + /* Don't let security modules deny introspection */ + if (same_thread_group(task, current)) + return 0; + rcu_read_lock(); ++ if (mode & PTRACE_MODE_FSCREDS) { ++ caller_uid = cred->fsuid; ++ caller_gid = cred->fsgid; ++ } else { ++ /* ++ * Using the euid would make more sense here, but something ++ * in userland might rely on the old behavior, and this ++ * shouldn't be a security problem since ++ * PTRACE_MODE_REALCREDS implies that the caller explicitly ++ * used a syscall that requests access to another process ++ * (and not a filesystem syscall to procfs). ++ */ ++ caller_uid = cred->uid; ++ caller_gid = cred->gid; ++ } + tcred = __task_cred(task); +- if (uid_eq(cred->uid, tcred->euid) && +- uid_eq(cred->uid, tcred->suid) && +- uid_eq(cred->uid, tcred->uid) && +- gid_eq(cred->gid, tcred->egid) && +- gid_eq(cred->gid, tcred->sgid) && +- gid_eq(cred->gid, tcred->gid)) ++ if (uid_eq(caller_uid, tcred->euid) && ++ uid_eq(caller_uid, tcred->suid) && ++ uid_eq(caller_uid, tcred->uid) && ++ gid_eq(caller_gid, tcred->egid) && ++ gid_eq(caller_gid, tcred->sgid) && ++ gid_eq(caller_gid, tcred->gid)) + goto ok; + if (ptrace_has_cap(tcred->user_ns, mode)) + goto ok; +@@ -306,7 +329,7 @@ static int ptrace_attach(struct task_struct *task, long request, + goto out; + + task_lock(task); +- retval = __ptrace_may_access(task, PTRACE_MODE_ATTACH); ++ retval = __ptrace_may_access(task, PTRACE_MODE_ATTACH_REALCREDS); + task_unlock(task); + if (retval) + goto unlock_creds; +diff --git a/kernel/resource.c b/kernel/resource.c +index 90552aab5f2d..a7c27cb71fc5 100644 +--- a/kernel/resource.c ++++ b/kernel/resource.c +@@ -1072,9 +1072,10 @@ struct resource * __request_region(struct resource *parent, + if (!conflict) + break; + if (conflict != parent) { +- parent = conflict; +- if (!(conflict->flags & IORESOURCE_BUSY)) ++ if (!(conflict->flags & IORESOURCE_BUSY)) { ++ parent = conflict; + continue; ++ } + } + if (conflict->flags & flags & IORESOURCE_MUXED) { + add_wait_queue(&muxed_resource_wait, &wait); +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 4d870eb6086b..3b0f4c09ab92 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -6480,7 +6480,7 @@ static void sched_init_numa(void) + + sched_domains_numa_masks[i][j] = mask; + +- for (k = 0; k < nr_node_ids; k++) { ++ for_each_node(k) { + if (node_distance(j, k) > sched_domains_numa_distance[i]) + continue; + +diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c +index 8394b1ee600c..87b8576cbd50 100644 +--- a/kernel/sched/cputime.c ++++ b/kernel/sched/cputime.c +@@ -259,21 +259,21 @@ static __always_inline bool steal_account_process_tick(void) + #ifdef CONFIG_PARAVIRT + if (static_key_false(¶virt_steal_enabled)) { + u64 steal; +- cputime_t steal_ct; ++ unsigned long steal_jiffies; + + steal = paravirt_steal_clock(smp_processor_id()); + steal -= this_rq()->prev_steal_time; + + /* +- * cputime_t may be less precise than nsecs (eg: if it's +- * based on jiffies). Lets cast the result to cputime ++ * steal is in nsecs but our caller is expecting steal ++ * time in jiffies. Lets cast the result to jiffies + * granularity and account the rest on the next rounds. + */ +- steal_ct = nsecs_to_cputime(steal); +- this_rq()->prev_steal_time += cputime_to_nsecs(steal_ct); ++ steal_jiffies = nsecs_to_jiffies(steal); ++ this_rq()->prev_steal_time += jiffies_to_nsecs(steal_jiffies); + +- account_steal_time(steal_ct); +- return steal_ct; ++ account_steal_time(jiffies_to_cputime(steal_jiffies)); ++ return steal_jiffies; + } + #endif + return false; +diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c +index 7e7746a42a62..10a1d7dc9313 100644 +--- a/kernel/sysctl_binary.c ++++ b/kernel/sysctl_binary.c +@@ -1321,7 +1321,7 @@ static ssize_t binary_sysctl(const int *name, int nlen, + } + + mnt = task_active_pid_ns(current)->proc_mnt; +- file = file_open_root(mnt->mnt_root, mnt, pathname, flags); ++ file = file_open_root(mnt->mnt_root, mnt, pathname, flags, 0); + result = PTR_ERR(file); + if (IS_ERR(file)) + goto out_putname; +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c +index 05330494a0df..de6ea94c41bb 100644 +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -4916,7 +4916,10 @@ static ssize_t tracing_splice_read_pipe(struct file *filp, + + spd.nr_pages = i; + +- ret = splice_to_pipe(pipe, &spd); ++ if (i) ++ ret = splice_to_pipe(pipe, &spd); ++ else ++ ret = 0; + out: + splice_shrink_spd(&spd); + return ret; +diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c +index 36c1455b7567..6d6c0411cbe8 100644 +--- a/kernel/trace/trace_printk.c ++++ b/kernel/trace/trace_printk.c +@@ -289,6 +289,9 @@ static int t_show(struct seq_file *m, void *v) + const char *str = *fmt; + int i; + ++ if (!*fmt) ++ return 0; ++ + seq_printf(m, "0x%lx : \"", *(unsigned long *)fmt); + + /* +diff --git a/kernel/watchdog.c b/kernel/watchdog.c +index 581a68a04c64..f89ea713213f 100644 +--- a/kernel/watchdog.c ++++ b/kernel/watchdog.c +@@ -812,6 +812,9 @@ static int proc_watchdog_common(int which, struct ctl_table *table, int write, + * Update the run state of the lockup detectors. + * Restore 'watchdog_enabled' on failure. + */ ++ if (old == new) ++ goto out; ++ + err = proc_watchdog_update(); + if (err) + watchdog_enabled = old; +@@ -857,7 +860,7 @@ int proc_soft_watchdog(struct ctl_table *table, int write, + int proc_watchdog_thresh(struct ctl_table *table, int write, + void __user *buffer, size_t *lenp, loff_t *ppos) + { +- int err, old; ++ int err, old, new; + + mutex_lock(&watchdog_proc_mutex); + +@@ -871,6 +874,10 @@ int proc_watchdog_thresh(struct ctl_table *table, int write, + * Update the sample period. + * Restore 'watchdog_thresh' on failure. + */ ++ new = ACCESS_ONCE(watchdog_thresh); ++ if (old == new) ++ goto out; ++ + set_sample_period(); + err = proc_watchdog_update(); + if (err) +diff --git a/lib/ucs2_string.c b/lib/ucs2_string.c +index 6f500ef2301d..f0b323abb4c6 100644 +--- a/lib/ucs2_string.c ++++ b/lib/ucs2_string.c +@@ -49,3 +49,65 @@ ucs2_strncmp(const ucs2_char_t *a, const ucs2_char_t *b, size_t len) + } + } + EXPORT_SYMBOL(ucs2_strncmp); ++ ++unsigned long ++ucs2_utf8size(const ucs2_char_t *src) ++{ ++ unsigned long i; ++ unsigned long j = 0; ++ ++ for (i = 0; i < ucs2_strlen(src); i++) { ++ u16 c = src[i]; ++ ++ if (c >= 0x800) ++ j += 3; ++ else if (c >= 0x80) ++ j += 2; ++ else ++ j += 1; ++ } ++ ++ return j; ++} ++EXPORT_SYMBOL(ucs2_utf8size); ++ ++/* ++ * copy at most maxlength bytes of whole utf8 characters to dest from the ++ * ucs2 string src. ++ * ++ * The return value is the number of characters copied, not including the ++ * final NUL character. ++ */ ++unsigned long ++ucs2_as_utf8(u8 *dest, const ucs2_char_t *src, unsigned long maxlength) ++{ ++ unsigned int i; ++ unsigned long j = 0; ++ unsigned long limit = ucs2_strnlen(src, maxlength); ++ ++ for (i = 0; maxlength && i < limit; i++) { ++ u16 c = src[i]; ++ ++ if (c >= 0x800) { ++ if (maxlength < 3) ++ break; ++ maxlength -= 3; ++ dest[j++] = 0xe0 | (c & 0xf000) >> 12; ++ dest[j++] = 0x80 | (c & 0x0fc0) >> 6; ++ dest[j++] = 0x80 | (c & 0x003f); ++ } else if (c >= 0x80) { ++ if (maxlength < 2) ++ break; ++ maxlength -= 2; ++ dest[j++] = 0xc0 | (c & 0x7c0) >> 6; ++ dest[j++] = 0x80 | (c & 0x03f); ++ } else { ++ maxlength -= 1; ++ dest[j++] = c & 0x7f; ++ } ++ } ++ if (maxlength) ++ dest[j] = '\0'; ++ return j; ++} ++EXPORT_SYMBOL(ucs2_as_utf8); +diff --git a/mm/bootmem.c b/mm/bootmem.c +index 477be696511d..a23dd1934654 100644 +--- a/mm/bootmem.c ++++ b/mm/bootmem.c +@@ -164,7 +164,7 @@ void __init free_bootmem_late(unsigned long physaddr, unsigned long size) + end = PFN_DOWN(physaddr + size); + + for (; cursor < end; cursor++) { +- __free_pages_bootmem(pfn_to_page(cursor), 0); ++ __free_pages_bootmem(pfn_to_page(cursor), cursor, 0); + totalram_pages++; + } + } +@@ -172,7 +172,7 @@ void __init free_bootmem_late(unsigned long physaddr, unsigned long size) + static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) + { + struct page *page; +- unsigned long *map, start, end, pages, count = 0; ++ unsigned long *map, start, end, pages, cur, count = 0; + + if (!bdata->node_bootmem_map) + return 0; +@@ -210,17 +210,17 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) + if (IS_ALIGNED(start, BITS_PER_LONG) && vec == ~0UL) { + int order = ilog2(BITS_PER_LONG); + +- __free_pages_bootmem(pfn_to_page(start), order); ++ __free_pages_bootmem(pfn_to_page(start), start, order); + count += BITS_PER_LONG; + start += BITS_PER_LONG; + } else { +- unsigned long cur = start; ++ cur = start; + + start = ALIGN(start + 1, BITS_PER_LONG); + while (vec && cur != start) { + if (vec & 1) { + page = pfn_to_page(cur); +- __free_pages_bootmem(page, 0); ++ __free_pages_bootmem(page, cur, 0); + count++; + } + vec >>= 1; +@@ -229,12 +229,13 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) + } + } + ++ cur = bdata->node_min_pfn; + page = virt_to_page(bdata->node_bootmem_map); + pages = bdata->node_low_pfn - bdata->node_min_pfn; + pages = bootmem_bootmap_pages(pages); + count += pages; + while (pages--) +- __free_pages_bootmem(page++, 0); ++ __free_pages_bootmem(page++, cur++, 0); + + bdebug("nid=%td released=%lx\n", bdata - bootmem_node_data, count); + +diff --git a/mm/hugetlb.c b/mm/hugetlb.c +index a6ff935476e3..9d724c0383d2 100644 +--- a/mm/hugetlb.c ++++ b/mm/hugetlb.c +@@ -755,7 +755,7 @@ static int hstate_next_node_to_free(struct hstate *h, nodemask_t *nodes_allowed) + + #if defined(CONFIG_CMA) && defined(CONFIG_X86_64) + static void destroy_compound_gigantic_page(struct page *page, +- unsigned long order) ++ unsigned int order) + { + int i; + int nr_pages = 1 << order; +@@ -771,7 +771,7 @@ static void destroy_compound_gigantic_page(struct page *page, + __ClearPageHead(page); + } + +-static void free_gigantic_page(struct page *page, unsigned order) ++static void free_gigantic_page(struct page *page, unsigned int order) + { + free_contig_range(page_to_pfn(page), 1 << order); + } +@@ -815,7 +815,7 @@ static bool zone_spans_last_pfn(const struct zone *zone, + return zone_spans_pfn(zone, last_pfn); + } + +-static struct page *alloc_gigantic_page(int nid, unsigned order) ++static struct page *alloc_gigantic_page(int nid, unsigned int order) + { + unsigned long nr_pages = 1 << order; + unsigned long ret, pfn, flags; +@@ -851,7 +851,7 @@ static struct page *alloc_gigantic_page(int nid, unsigned order) + } + + static void prep_new_huge_page(struct hstate *h, struct page *page, int nid); +-static void prep_compound_gigantic_page(struct page *page, unsigned long order); ++static void prep_compound_gigantic_page(struct page *page, unsigned int order); + + static struct page *alloc_fresh_gigantic_page_node(struct hstate *h, int nid) + { +@@ -884,9 +884,9 @@ static int alloc_fresh_gigantic_page(struct hstate *h, + static inline bool gigantic_page_supported(void) { return true; } + #else + static inline bool gigantic_page_supported(void) { return false; } +-static inline void free_gigantic_page(struct page *page, unsigned order) { } ++static inline void free_gigantic_page(struct page *page, unsigned int order) { } + static inline void destroy_compound_gigantic_page(struct page *page, +- unsigned long order) { } ++ unsigned int order) { } + static inline int alloc_fresh_gigantic_page(struct hstate *h, + nodemask_t *nodes_allowed) { return 0; } + #endif +@@ -1013,7 +1013,7 @@ static void prep_new_huge_page(struct hstate *h, struct page *page, int nid) + put_page(page); /* free it into the hugepage allocator */ + } + +-static void prep_compound_gigantic_page(struct page *page, unsigned long order) ++static void prep_compound_gigantic_page(struct page *page, unsigned int order) + { + int i; + int nr_pages = 1 << order; +@@ -1567,7 +1567,8 @@ found: + return 1; + } + +-static void __init prep_compound_huge_page(struct page *page, int order) ++static void __init prep_compound_huge_page(struct page *page, ++ unsigned int order) + { + if (unlikely(order > (MAX_ORDER - 1))) + prep_compound_gigantic_page(page, order); +@@ -2278,7 +2279,7 @@ static int __init hugetlb_init(void) + module_init(hugetlb_init); + + /* Should be called on processing a hugepagesz=... option */ +-void __init hugetlb_add_hstate(unsigned order) ++void __init hugetlb_add_hstate(unsigned int order) + { + struct hstate *h; + unsigned long i; +diff --git a/mm/internal.h b/mm/internal.h +index a25e359a4039..a415872aab06 100644 +--- a/mm/internal.h ++++ b/mm/internal.h +@@ -155,8 +155,9 @@ __find_buddy_index(unsigned long page_idx, unsigned int order) + } + + extern int __isolate_free_page(struct page *page, unsigned int order); +-extern void __free_pages_bootmem(struct page *page, unsigned int order); +-extern void prep_compound_page(struct page *page, unsigned long order); ++extern void __free_pages_bootmem(struct page *page, unsigned long pfn, ++ unsigned int order); ++extern void prep_compound_page(struct page *page, unsigned int order); + #ifdef CONFIG_MEMORY_FAILURE + extern bool is_free_buddy_page(struct page *page); + #endif +@@ -213,7 +214,7 @@ int find_suitable_fallback(struct free_area *area, unsigned int order, + * page cannot be allocated or merged in parallel. Alternatively, it must + * handle invalid values gracefully, and use page_order_unsafe() below. + */ +-static inline unsigned long page_order(struct page *page) ++static inline unsigned int page_order(struct page *page) + { + /* PageBuddy() must be checked by the caller */ + return page_private(page); +diff --git a/mm/memblock.c b/mm/memblock.c +index 9318b567ed79..9742d1ac10a5 100644 +--- a/mm/memblock.c ++++ b/mm/memblock.c +@@ -1316,7 +1316,7 @@ void __init __memblock_free_late(phys_addr_t base, phys_addr_t size) + end = PFN_DOWN(base + size); + + for (; cursor < end; cursor++) { +- __free_pages_bootmem(pfn_to_page(cursor), 0); ++ __free_pages_bootmem(pfn_to_page(cursor), cursor, 0); + totalram_pages++; + } + } +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index aac1c98a9bc7..221762e24a68 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -5289,6 +5289,7 @@ static ssize_t memory_high_write(struct kernfs_open_file *of, + char *buf, size_t nbytes, loff_t off) + { + struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of)); ++ unsigned long nr_pages; + unsigned long high; + int err; + +@@ -5299,6 +5300,11 @@ static ssize_t memory_high_write(struct kernfs_open_file *of, + + memcg->high = high; + ++ nr_pages = page_counter_read(&memcg->memory); ++ if (nr_pages > high) ++ try_to_free_mem_cgroup_pages(memcg, nr_pages - high, ++ GFP_KERNEL, true); ++ + return nbytes; + } + +diff --git a/mm/nobootmem.c b/mm/nobootmem.c +index 90b50468333e..4bea539921df 100644 +--- a/mm/nobootmem.c ++++ b/mm/nobootmem.c +@@ -77,7 +77,7 @@ void __init free_bootmem_late(unsigned long addr, unsigned long size) + end = PFN_DOWN(addr + size); + + for (; cursor < end; cursor++) { +- __free_pages_bootmem(pfn_to_page(cursor), 0); ++ __free_pages_bootmem(pfn_to_page(cursor), cursor, 0); + totalram_pages++; + } + } +@@ -92,7 +92,7 @@ static void __init __free_pages_memory(unsigned long start, unsigned long end) + while (start + (1UL << order) > end) + order--; + +- __free_pages_bootmem(pfn_to_page(start), order); ++ __free_pages_bootmem(pfn_to_page(start), start, order); + + start += (1UL << order); + } +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index 18490f3bd7f1..872b2ac95dec 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -162,7 +162,7 @@ bool pm_suspended_storage(void) + #endif /* CONFIG_PM_SLEEP */ + + #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE +-int pageblock_order __read_mostly; ++unsigned int pageblock_order __read_mostly; + #endif + + static void __free_pages_ok(struct page *page, unsigned int order); +@@ -362,7 +362,7 @@ static void free_compound_page(struct page *page) + __free_pages_ok(page, compound_order(page)); + } + +-void prep_compound_page(struct page *page, unsigned long order) ++void prep_compound_page(struct page *page, unsigned int order) + { + int i; + int nr_pages = 1 << order; +@@ -579,34 +579,28 @@ static inline void __free_one_page(struct page *page, + unsigned long combined_idx; + unsigned long uninitialized_var(buddy_idx); + struct page *buddy; +- int max_order = MAX_ORDER; ++ unsigned int max_order; ++ ++ max_order = min_t(unsigned int, MAX_ORDER, pageblock_order + 1); + + VM_BUG_ON(!zone_is_initialized(zone)); + VM_BUG_ON_PAGE(page->flags & PAGE_FLAGS_CHECK_AT_PREP, page); + + VM_BUG_ON(migratetype == -1); +- if (is_migrate_isolate(migratetype)) { +- /* +- * We restrict max order of merging to prevent merge +- * between freepages on isolate pageblock and normal +- * pageblock. Without this, pageblock isolation +- * could cause incorrect freepage accounting. +- */ +- max_order = min(MAX_ORDER, pageblock_order + 1); +- } else { ++ if (likely(!is_migrate_isolate(migratetype))) + __mod_zone_freepage_state(zone, 1 << order, migratetype); +- } + +- page_idx = pfn & ((1 << max_order) - 1); ++ page_idx = pfn & ((1 << MAX_ORDER) - 1); + + VM_BUG_ON_PAGE(page_idx & ((1 << order) - 1), page); + VM_BUG_ON_PAGE(bad_range(zone, page), page); + ++continue_merging: + while (order < max_order - 1) { + buddy_idx = __find_buddy_index(page_idx, order); + buddy = page + (buddy_idx - page_idx); + if (!page_is_buddy(page, buddy, order)) +- break; ++ goto done_merging; + /* + * Our buddy is free or it is CONFIG_DEBUG_PAGEALLOC guard page, + * merge with it and move up one order. +@@ -623,6 +617,32 @@ static inline void __free_one_page(struct page *page, + page_idx = combined_idx; + order++; + } ++ if (max_order < MAX_ORDER) { ++ /* If we are here, it means order is >= pageblock_order. ++ * We want to prevent merge between freepages on isolate ++ * pageblock and normal pageblock. Without this, pageblock ++ * isolation could cause incorrect freepage or CMA accounting. ++ * ++ * We don't want to hit this code for the more frequent ++ * low-order merging. ++ */ ++ if (unlikely(has_isolate_pageblock(zone))) { ++ int buddy_mt; ++ ++ buddy_idx = __find_buddy_index(page_idx, order); ++ buddy = page + (buddy_idx - page_idx); ++ buddy_mt = get_pageblock_migratetype(buddy); ++ ++ if (migratetype != buddy_mt ++ && (is_migrate_isolate(migratetype) || ++ is_migrate_isolate(buddy_mt))) ++ goto done_merging; ++ } ++ max_order++; ++ goto continue_merging; ++ } ++ ++done_merging: + set_page_order(page, order); + + /* +@@ -832,7 +852,8 @@ static void __free_pages_ok(struct page *page, unsigned int order) + local_irq_restore(flags); + } + +-void __init __free_pages_bootmem(struct page *page, unsigned int order) ++void __init __free_pages_bootmem(struct page *page, unsigned long pfn, ++ unsigned int order) + { + unsigned int nr_pages = 1 << order; + struct page *p = page; +@@ -1066,7 +1087,7 @@ int move_freepages(struct zone *zone, + int migratetype) + { + struct page *page; +- unsigned long order; ++ unsigned int order; + int pages_moved = 0; + + #ifndef CONFIG_HOLES_IN_ZONE +@@ -1180,7 +1201,7 @@ static bool can_steal_fallback(unsigned int order, int start_mt) + static void steal_suitable_fallback(struct zone *zone, struct page *page, + int start_type) + { +- int current_order = page_order(page); ++ unsigned int current_order = page_order(page); + int pages; + + /* Take ownership for orders >= pageblock_order */ +@@ -2283,7 +2304,7 @@ static DEFINE_RATELIMIT_STATE(nopage_rs, + DEFAULT_RATELIMIT_INTERVAL, + DEFAULT_RATELIMIT_BURST); + +-void warn_alloc_failed(gfp_t gfp_mask, int order, const char *fmt, ...) ++void warn_alloc_failed(gfp_t gfp_mask, unsigned int order, const char *fmt, ...) + { + unsigned int filter = SHOW_MEM_FILTER_NODES; + +@@ -2317,7 +2338,7 @@ void warn_alloc_failed(gfp_t gfp_mask, int order, const char *fmt, ...) + va_end(args); + } + +- pr_warn("%s: page allocation failure: order:%d, mode:0x%x\n", ++ pr_warn("%s: page allocation failure: order:%u, mode:0x%x\n", + current->comm, order, gfp_mask); + + dump_stack(); +@@ -3018,7 +3039,8 @@ void free_kmem_pages(unsigned long addr, unsigned int order) + } + } + +-static void *make_alloc_exact(unsigned long addr, unsigned order, size_t size) ++static void *make_alloc_exact(unsigned long addr, unsigned int order, ++ size_t size) + { + if (addr) { + unsigned long alloc_end = addr + (PAGE_SIZE << order); +@@ -3070,7 +3092,7 @@ EXPORT_SYMBOL(alloc_pages_exact); + */ + void * __meminit alloc_pages_exact_nid(int nid, size_t size, gfp_t gfp_mask) + { +- unsigned order = get_order(size); ++ unsigned int order = get_order(size); + struct page *p = alloc_pages_node(nid, gfp_mask, order); + if (!p) + return NULL; +@@ -3372,7 +3394,8 @@ void show_free_areas(unsigned int filter) + } + + for_each_populated_zone(zone) { +- unsigned long nr[MAX_ORDER], flags, order, total = 0; ++ unsigned int order; ++ unsigned long nr[MAX_ORDER], flags, total = 0; + unsigned char types[MAX_ORDER]; + + if (skip_free_areas_node(filter, zone_to_nid(zone))) +@@ -3721,7 +3744,7 @@ static void build_zonelists(pg_data_t *pgdat) + nodemask_t used_mask; + int local_node, prev_node; + struct zonelist *zonelist; +- int order = current_zonelist_order; ++ unsigned int order = current_zonelist_order; + + /* initialize zonelists */ + for (i = 0; i < MAX_ZONELISTS; i++) { +@@ -6408,7 +6431,8 @@ int alloc_contig_range(unsigned long start, unsigned long end, + unsigned migratetype) + { + unsigned long outer_start, outer_end; +- int ret = 0, order; ++ unsigned int order; ++ int ret = 0; + + struct compact_control cc = { + .nr_migratepages = 0, +diff --git a/mm/process_vm_access.c b/mm/process_vm_access.c +index e88d071648c2..5d453e58ddbf 100644 +--- a/mm/process_vm_access.c ++++ b/mm/process_vm_access.c +@@ -194,7 +194,7 @@ static ssize_t process_vm_rw_core(pid_t pid, struct iov_iter *iter, + goto free_proc_pages; + } + +- mm = mm_access(task, PTRACE_MODE_ATTACH); ++ mm = mm_access(task, PTRACE_MODE_ATTACH_REALCREDS); + if (!mm || IS_ERR(mm)) { + rc = IS_ERR(mm) ? PTR_ERR(mm) : -ESRCH; + /* +diff --git a/scripts/coccinelle/iterators/use_after_iter.cocci b/scripts/coccinelle/iterators/use_after_iter.cocci +index f085f5968c52..ce8cc9c006e5 100644 +--- a/scripts/coccinelle/iterators/use_after_iter.cocci ++++ b/scripts/coccinelle/iterators/use_after_iter.cocci +@@ -123,7 +123,7 @@ list_remove_head(x,c,...) + | + sizeof(<+...c...+>) + | +-&c->member ++ &c->member + | + c = E + | +diff --git a/security/commoncap.c b/security/commoncap.c +index f2875cd9f677..4cdc8eb8d5d2 100644 +--- a/security/commoncap.c ++++ b/security/commoncap.c +@@ -142,12 +142,17 @@ int cap_ptrace_access_check(struct task_struct *child, unsigned int mode) + { + int ret = 0; + const struct cred *cred, *child_cred; ++ const kernel_cap_t *caller_caps; + + rcu_read_lock(); + cred = current_cred(); + child_cred = __task_cred(child); ++ if (mode & PTRACE_MODE_FSCREDS) ++ caller_caps = &cred->cap_effective; ++ else ++ caller_caps = &cred->cap_permitted; + if (cred->user_ns == child_cred->user_ns && +- cap_issubset(child_cred->cap_permitted, cred->cap_permitted)) ++ cap_issubset(child_cred->cap_permitted, *caller_caps)) + goto out; + if (ns_capable(child_cred->user_ns, CAP_SYS_PTRACE)) + goto out; +diff --git a/security/keys/encrypted-keys/encrypted.c b/security/keys/encrypted-keys/encrypted.c +index 7bed4ad7cd76..0a374a2ce030 100644 +--- a/security/keys/encrypted-keys/encrypted.c ++++ b/security/keys/encrypted-keys/encrypted.c +@@ -845,6 +845,8 @@ static int encrypted_update(struct key *key, struct key_preparsed_payload *prep) + size_t datalen = prep->datalen; + int ret = 0; + ++ if (test_bit(KEY_FLAG_NEGATIVE, &key->flags)) ++ return -ENOKEY; + if (datalen <= 0 || datalen > 32767 || !prep->data) + return -EINVAL; + +diff --git a/security/keys/trusted.c b/security/keys/trusted.c +index c0594cb07ada..aeb38f1a12e7 100644 +--- a/security/keys/trusted.c ++++ b/security/keys/trusted.c +@@ -984,13 +984,16 @@ static void trusted_rcu_free(struct rcu_head *rcu) + */ + static int trusted_update(struct key *key, struct key_preparsed_payload *prep) + { +- struct trusted_key_payload *p = key->payload.data; ++ struct trusted_key_payload *p; + struct trusted_key_payload *new_p; + struct trusted_key_options *new_o; + size_t datalen = prep->datalen; + char *datablob; + int ret = 0; + ++ if (test_bit(KEY_FLAG_NEGATIVE, &key->flags)) ++ return -ENOKEY; ++ p = key->payload.data; + if (!p->migratable) + return -EPERM; + if (datalen <= 0 || datalen > 32767 || !prep->data) +diff --git a/security/keys/user_defined.c b/security/keys/user_defined.c +index 36b47bbd3d8c..7cf22260bdff 100644 +--- a/security/keys/user_defined.c ++++ b/security/keys/user_defined.c +@@ -120,7 +120,10 @@ int user_update(struct key *key, struct key_preparsed_payload *prep) + + if (ret == 0) { + /* attach the new data, displacing the old */ +- zap = key->payload.data; ++ if (!test_bit(KEY_FLAG_NEGATIVE, &key->flags)) ++ zap = key->payload.data; ++ else ++ zap = NULL; + rcu_assign_keypointer(key, upayload); + key->expiry = 0; + } +diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c +index b644757886bc..e45f0a3df127 100644 +--- a/security/smack/smack_lsm.c ++++ b/security/smack/smack_lsm.c +@@ -354,12 +354,10 @@ static int smk_copy_rules(struct list_head *nhead, struct list_head *ohead, + */ + static inline unsigned int smk_ptrace_mode(unsigned int mode) + { +- switch (mode) { +- case PTRACE_MODE_READ: +- return MAY_READ; +- case PTRACE_MODE_ATTACH: ++ if (mode & PTRACE_MODE_ATTACH) + return MAY_READWRITE; +- } ++ if (mode & PTRACE_MODE_READ) ++ return MAY_READ; + + return 0; + } +diff --git a/security/yama/yama_lsm.c b/security/yama/yama_lsm.c +index 24aae2ae2b30..d3f7fb55b835 100644 +--- a/security/yama/yama_lsm.c ++++ b/security/yama/yama_lsm.c +@@ -292,7 +292,7 @@ int yama_ptrace_access_check(struct task_struct *child, + return rc; + + /* require ptrace target be a child of ptracer on attach */ +- if (mode == PTRACE_MODE_ATTACH) { ++ if (mode & PTRACE_MODE_ATTACH) { + switch (ptrace_scope) { + case YAMA_SCOPE_DISABLED: + /* No additional restrictions. */ +@@ -318,7 +318,7 @@ int yama_ptrace_access_check(struct task_struct *child, + } + } + +- if (rc) { ++ if (rc && (mode & PTRACE_MODE_NOAUDIT) == 0) { + printk_ratelimited(KERN_NOTICE + "ptrace of pid %d was attempted by: %s (pid %d)\n", + child->pid, current->comm, current->pid); +diff --git a/sound/hda/hdac_device.c b/sound/hda/hdac_device.c +index f75bf5622687..961ca32ee989 100644 +--- a/sound/hda/hdac_device.c ++++ b/sound/hda/hdac_device.c +@@ -500,23 +500,27 @@ EXPORT_SYMBOL_GPL(snd_hdac_get_connections); + * This function calls the runtime PM helper to power up the given codec. + * Unlike snd_hdac_power_up_pm(), you should call this only for the code + * path that isn't included in PM path. Otherwise it gets stuck. ++ * ++ * Returns zero if successful, or a negative error code. + */ +-void snd_hdac_power_up(struct hdac_device *codec) ++int snd_hdac_power_up(struct hdac_device *codec) + { +- pm_runtime_get_sync(&codec->dev); ++ return pm_runtime_get_sync(&codec->dev); + } + EXPORT_SYMBOL_GPL(snd_hdac_power_up); + + /** + * snd_hdac_power_down - power down the codec + * @codec: the codec object ++ * ++ * Returns zero if successful, or a negative error code. + */ +-void snd_hdac_power_down(struct hdac_device *codec) ++int snd_hdac_power_down(struct hdac_device *codec) + { + struct device *dev = &codec->dev; + + pm_runtime_mark_last_busy(dev); +- pm_runtime_put_autosuspend(dev); ++ return pm_runtime_put_autosuspend(dev); + } + EXPORT_SYMBOL_GPL(snd_hdac_power_down); + +@@ -528,11 +532,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_power_down); + * which may be called by PM suspend/resume again. OTOH, if a power-up + * call must wake up the sleeper (e.g. in a kctl callback), use + * snd_hdac_power_up() instead. ++ * ++ * Returns zero if successful, or a negative error code. + */ +-void snd_hdac_power_up_pm(struct hdac_device *codec) ++int snd_hdac_power_up_pm(struct hdac_device *codec) + { + if (!atomic_inc_not_zero(&codec->in_pm)) +- snd_hdac_power_up(codec); ++ return snd_hdac_power_up(codec); ++ return 0; + } + EXPORT_SYMBOL_GPL(snd_hdac_power_up_pm); + +@@ -542,11 +549,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_power_up_pm); + * + * Like snd_hdac_power_up_pm(), this function is used in a recursive + * code path like init code which may be called by PM suspend/resume again. ++ * ++ * Returns zero if successful, or a negative error code. + */ +-void snd_hdac_power_down_pm(struct hdac_device *codec) ++int snd_hdac_power_down_pm(struct hdac_device *codec) + { + if (atomic_dec_if_positive(&codec->in_pm) < 0) +- snd_hdac_power_down(codec); ++ return snd_hdac_power_down(codec); ++ return 0; + } + EXPORT_SYMBOL_GPL(snd_hdac_power_down_pm); + #endif +diff --git a/sound/hda/hdac_regmap.c b/sound/hda/hdac_regmap.c +index 1eabcdf69457..b0ed870ffb88 100644 +--- a/sound/hda/hdac_regmap.c ++++ b/sound/hda/hdac_regmap.c +@@ -410,8 +410,9 @@ int snd_hdac_regmap_write_raw(struct hdac_device *codec, unsigned int reg, + + err = reg_raw_write(codec, reg, val); + if (err == -EAGAIN) { +- snd_hdac_power_up_pm(codec); +- err = reg_raw_write(codec, reg, val); ++ err = snd_hdac_power_up_pm(codec); ++ if (!err) ++ err = reg_raw_write(codec, reg, val); + snd_hdac_power_down_pm(codec); + } + return err; +@@ -442,8 +443,9 @@ int snd_hdac_regmap_read_raw(struct hdac_device *codec, unsigned int reg, + + err = reg_raw_read(codec, reg, val); + if (err == -EAGAIN) { +- snd_hdac_power_up_pm(codec); +- err = reg_raw_read(codec, reg, val); ++ err = snd_hdac_power_up_pm(codec); ++ if (!err) ++ err = reg_raw_read(codec, reg, val); + snd_hdac_power_down_pm(codec); + } + return err; +diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c +index 194627c6c42b..16e0ebacbdb0 100644 +--- a/sound/pci/hda/hda_generic.c ++++ b/sound/pci/hda/hda_generic.c +@@ -771,9 +771,6 @@ static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir, + unsigned int caps; + unsigned int mask, val; + +- if (!enable && is_active_nid(codec, nid, dir, idx_to_check)) +- return; +- + caps = query_amp_caps(codec, nid, dir); + val = get_amp_val_to_activate(codec, nid, dir, caps, enable); + mask = get_amp_mask_to_modify(codec, nid, dir, idx_to_check, caps); +@@ -784,12 +781,22 @@ static void activate_amp(struct hda_codec *codec, hda_nid_t nid, int dir, + update_amp(codec, nid, dir, idx, mask, val); + } + ++static void check_and_activate_amp(struct hda_codec *codec, hda_nid_t nid, ++ int dir, int idx, int idx_to_check, ++ bool enable) ++{ ++ /* check whether the given amp is still used by others */ ++ if (!enable && is_active_nid(codec, nid, dir, idx_to_check)) ++ return; ++ activate_amp(codec, nid, dir, idx, idx_to_check, enable); ++} ++ + static void activate_amp_out(struct hda_codec *codec, struct nid_path *path, + int i, bool enable) + { + hda_nid_t nid = path->path[i]; + init_amp(codec, nid, HDA_OUTPUT, 0); +- activate_amp(codec, nid, HDA_OUTPUT, 0, 0, enable); ++ check_and_activate_amp(codec, nid, HDA_OUTPUT, 0, 0, enable); + } + + static void activate_amp_in(struct hda_codec *codec, struct nid_path *path, +@@ -817,9 +824,16 @@ static void activate_amp_in(struct hda_codec *codec, struct nid_path *path, + * when aa-mixer is available, we need to enable the path as well + */ + for (n = 0; n < nums; n++) { +- if (n != idx && (!add_aamix || conn[n] != spec->mixer_merge_nid)) +- continue; +- activate_amp(codec, nid, HDA_INPUT, n, idx, enable); ++ if (n != idx) { ++ if (conn[n] != spec->mixer_merge_nid) ++ continue; ++ /* when aamix is disabled, force to off */ ++ if (!add_aamix) { ++ activate_amp(codec, nid, HDA_INPUT, n, n, false); ++ continue; ++ } ++ } ++ check_and_activate_amp(codec, nid, HDA_INPUT, n, idx, enable); + } + } + +@@ -1580,6 +1594,12 @@ static bool map_singles(struct hda_codec *codec, int outs, + return found; + } + ++static inline bool has_aamix_out_paths(struct hda_gen_spec *spec) ++{ ++ return spec->aamix_out_paths[0] || spec->aamix_out_paths[1] || ++ spec->aamix_out_paths[2]; ++} ++ + /* create a new path including aamix if available, and return its index */ + static int check_aamix_out_path(struct hda_codec *codec, int path_idx) + { +@@ -2422,25 +2442,51 @@ static void update_aamix_paths(struct hda_codec *codec, bool do_mix, + } + } + ++/* re-initialize the output paths; only called from loopback_mixing_put() */ ++static void update_output_paths(struct hda_codec *codec, int num_outs, ++ const int *paths) ++{ ++ struct hda_gen_spec *spec = codec->spec; ++ struct nid_path *path; ++ int i; ++ ++ for (i = 0; i < num_outs; i++) { ++ path = snd_hda_get_path_from_idx(codec, paths[i]); ++ if (path) ++ snd_hda_activate_path(codec, path, path->active, ++ spec->aamix_mode); ++ } ++} ++ + static int loopback_mixing_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) + { + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); + struct hda_gen_spec *spec = codec->spec; ++ const struct auto_pin_cfg *cfg = &spec->autocfg; + unsigned int val = ucontrol->value.enumerated.item[0]; + + if (val == spec->aamix_mode) + return 0; + spec->aamix_mode = val; +- update_aamix_paths(codec, val, spec->out_paths[0], +- spec->aamix_out_paths[0], +- spec->autocfg.line_out_type); +- update_aamix_paths(codec, val, spec->hp_paths[0], +- spec->aamix_out_paths[1], +- AUTO_PIN_HP_OUT); +- update_aamix_paths(codec, val, spec->speaker_paths[0], +- spec->aamix_out_paths[2], +- AUTO_PIN_SPEAKER_OUT); ++ if (has_aamix_out_paths(spec)) { ++ update_aamix_paths(codec, val, spec->out_paths[0], ++ spec->aamix_out_paths[0], ++ cfg->line_out_type); ++ update_aamix_paths(codec, val, spec->hp_paths[0], ++ spec->aamix_out_paths[1], ++ AUTO_PIN_HP_OUT); ++ update_aamix_paths(codec, val, spec->speaker_paths[0], ++ spec->aamix_out_paths[2], ++ AUTO_PIN_SPEAKER_OUT); ++ } else { ++ update_output_paths(codec, cfg->line_outs, spec->out_paths); ++ if (cfg->line_out_type != AUTO_PIN_HP_OUT) ++ update_output_paths(codec, cfg->hp_outs, spec->hp_paths); ++ if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) ++ update_output_paths(codec, cfg->speaker_outs, ++ spec->speaker_paths); ++ } + return 1; + } + +@@ -2458,12 +2504,13 @@ static int create_loopback_mixing_ctl(struct hda_codec *codec) + + if (!spec->mixer_nid) + return 0; +- if (!(spec->aamix_out_paths[0] || spec->aamix_out_paths[1] || +- spec->aamix_out_paths[2])) +- return 0; + if (!snd_hda_gen_add_kctl(spec, NULL, &loopback_mixing_enum)) + return -ENOMEM; + spec->have_aamix_ctl = 1; ++ /* if no explicit aamix path is present (e.g. for Realtek codecs), ++ * enable aamix as default -- just for compatibility ++ */ ++ spec->aamix_mode = !has_aamix_out_paths(spec); + return 0; + } + +@@ -5664,6 +5711,8 @@ static void init_aamix_paths(struct hda_codec *codec) + + if (!spec->have_aamix_ctl) + return; ++ if (!has_aamix_out_paths(spec)) ++ return; + update_aamix_paths(codec, spec->aamix_mode, spec->out_paths[0], + spec->aamix_out_paths[0], + spec->autocfg.line_out_type); +diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c +index 8f50a257a80d..aeb054ca9ed9 100644 +--- a/sound/pci/hda/patch_cirrus.c ++++ b/sound/pci/hda/patch_cirrus.c +@@ -174,8 +174,12 @@ static void cs_automute(struct hda_codec *codec) + snd_hda_gen_update_outputs(codec); + + if (spec->gpio_eapd_hp || spec->gpio_eapd_speaker) { +- spec->gpio_data = spec->gen.hp_jack_present ? +- spec->gpio_eapd_hp : spec->gpio_eapd_speaker; ++ if (spec->gen.automute_speaker) ++ spec->gpio_data = spec->gen.hp_jack_present ? ++ spec->gpio_eapd_hp : spec->gpio_eapd_speaker; ++ else ++ spec->gpio_data = ++ spec->gpio_eapd_hp | spec->gpio_eapd_speaker; + snd_hda_codec_write(codec, 0x01, 0, + AC_VERB_SET_GPIO_DATA, spec->gpio_data); + } +diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c +index 488f4c7be33e..91b77bad03ea 100644 +--- a/sound/pci/hda/patch_conexant.c ++++ b/sound/pci/hda/patch_conexant.c +@@ -204,8 +204,13 @@ static void cx_auto_reboot_notify(struct hda_codec *codec) + { + struct conexant_spec *spec = codec->spec; + +- if (codec->core.vendor_id != 0x14f150f2) ++ switch (codec->core.vendor_id) { ++ case 0x14f150f2: /* CX20722 */ ++ case 0x14f150f4: /* CX20724 */ ++ break; ++ default: + return; ++ } + + /* Turn the CX20722 codec into D3 to avoid spurious noises + from the internal speaker during (and after) reboot */ +diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c +index 51d519554744..193426e223c9 100644 +--- a/sound/pci/hda/patch_hdmi.c ++++ b/sound/pci/hda/patch_hdmi.c +@@ -1526,6 +1526,57 @@ static int hdmi_read_pin_conn(struct hda_codec *codec, int pin_idx) + return 0; + } + ++/* update per_pin ELD from the given new ELD; ++ * setup info frame and notification accordingly ++ */ ++static void update_eld(struct hda_codec *codec, ++ struct hdmi_spec_per_pin *per_pin, ++ struct hdmi_eld *eld) ++{ ++ struct hdmi_eld *pin_eld = &per_pin->sink_eld; ++ bool old_eld_valid = pin_eld->eld_valid; ++ bool eld_changed; ++ ++ if (eld->eld_valid) ++ snd_hdmi_show_eld(codec, &eld->info); ++ ++ eld_changed = (pin_eld->eld_valid != eld->eld_valid); ++ if (eld->eld_valid && pin_eld->eld_valid) ++ if (pin_eld->eld_size != eld->eld_size || ++ memcmp(pin_eld->eld_buffer, eld->eld_buffer, ++ eld->eld_size) != 0) ++ eld_changed = true; ++ ++ pin_eld->monitor_present = eld->monitor_present; ++ pin_eld->eld_valid = eld->eld_valid; ++ pin_eld->eld_size = eld->eld_size; ++ if (eld->eld_valid) ++ memcpy(pin_eld->eld_buffer, eld->eld_buffer, eld->eld_size); ++ pin_eld->info = eld->info; ++ ++ /* ++ * Re-setup pin and infoframe. This is needed e.g. when ++ * - sink is first plugged-in ++ * - transcoder can change during stream playback on Haswell ++ * and this can make HW reset converter selection on a pin. ++ */ ++ if (eld->eld_valid && !old_eld_valid && per_pin->setup) { ++ if (is_haswell_plus(codec) || is_valleyview_plus(codec)) { ++ intel_verify_pin_cvt_connect(codec, per_pin); ++ intel_not_share_assigned_cvt(codec, per_pin->pin_nid, ++ per_pin->mux_idx); ++ } ++ ++ hdmi_setup_audio_infoframe(codec, per_pin, per_pin->non_pcm); ++ } ++ ++ if (eld_changed) ++ snd_ctl_notify(codec->card, ++ SNDRV_CTL_EVENT_MASK_VALUE | ++ SNDRV_CTL_EVENT_MASK_INFO, ++ &per_pin->eld_ctl->id); ++} ++ + static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) + { + struct hda_jack_tbl *jack; +@@ -1543,8 +1594,6 @@ static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) + * the unsolicited response to avoid custom WARs. + */ + int present; +- bool update_eld = false; +- bool eld_changed = false; + bool ret; + + snd_hda_power_up_pm(codec); +@@ -1552,6 +1601,8 @@ static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) + + mutex_lock(&per_pin->lock); + pin_eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE); ++ eld->monitor_present = pin_eld->monitor_present; ++ + if (pin_eld->monitor_present) + eld->eld_valid = !!(present & AC_PINSENSE_ELDV); + else +@@ -1571,61 +1622,13 @@ static bool hdmi_present_sense(struct hdmi_spec_per_pin *per_pin, int repoll) + eld->eld_size) < 0) + eld->eld_valid = false; + } +- +- if (eld->eld_valid) { +- snd_hdmi_show_eld(codec, &eld->info); +- update_eld = true; +- } +- else if (repoll) { +- schedule_delayed_work(&per_pin->work, +- msecs_to_jiffies(300)); +- goto unlock; +- } + } + +- if (pin_eld->eld_valid != eld->eld_valid) +- eld_changed = true; +- +- if (pin_eld->eld_valid && !eld->eld_valid) +- update_eld = true; +- +- if (update_eld) { +- bool old_eld_valid = pin_eld->eld_valid; +- pin_eld->eld_valid = eld->eld_valid; +- if (pin_eld->eld_size != eld->eld_size || +- memcmp(pin_eld->eld_buffer, eld->eld_buffer, +- eld->eld_size) != 0) { +- memcpy(pin_eld->eld_buffer, eld->eld_buffer, +- eld->eld_size); +- eld_changed = true; +- } +- pin_eld->eld_size = eld->eld_size; +- pin_eld->info = eld->info; +- +- /* +- * Re-setup pin and infoframe. This is needed e.g. when +- * - sink is first plugged-in (infoframe is not set up if !monitor_present) +- * - transcoder can change during stream playback on Haswell +- * and this can make HW reset converter selection on a pin. +- */ +- if (eld->eld_valid && !old_eld_valid && per_pin->setup) { +- if (is_haswell_plus(codec) || +- is_valleyview_plus(codec)) { +- intel_verify_pin_cvt_connect(codec, per_pin); +- intel_not_share_assigned_cvt(codec, pin_nid, +- per_pin->mux_idx); +- } +- +- hdmi_setup_audio_infoframe(codec, per_pin, +- per_pin->non_pcm); +- } +- } ++ if (!eld->eld_valid && repoll) ++ schedule_delayed_work(&per_pin->work, msecs_to_jiffies(300)); ++ else ++ update_eld(codec, per_pin, eld); + +- if (eld_changed) +- snd_ctl_notify(codec->card, +- SNDRV_CTL_EVENT_MASK_VALUE | SNDRV_CTL_EVENT_MASK_INFO, +- &per_pin->eld_ctl->id); +- unlock: + ret = !repoll || !pin_eld->monitor_present || pin_eld->eld_valid; + + jack = snd_hda_jack_tbl_get(codec, pin_nid); +@@ -3336,6 +3339,8 @@ static const struct hda_codec_preset snd_hda_preset_hdmi[] = { + { .id = 0x10de0071, .name = "GPU 71 HDMI/DP", .patch = patch_nvhdmi }, + { .id = 0x10de0072, .name = "GPU 72 HDMI/DP", .patch = patch_nvhdmi }, + { .id = 0x10de007d, .name = "GPU 7d HDMI/DP", .patch = patch_nvhdmi }, ++{ .id = 0x10de0082, .name = "GPU 82 HDMI/DP", .patch = patch_nvhdmi }, ++{ .id = 0x10de0083, .name = "GPU 83 HDMI/DP", .patch = patch_nvhdmi }, + { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, + { .id = 0x11069f80, .name = "VX900 HDMI/DP", .patch = patch_via_hdmi }, + { .id = 0x11069f81, .name = "VX900 HDMI/DP", .patch = patch_via_hdmi }, +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index 91cc6897d595..90cf6168267e 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -4608,6 +4608,7 @@ enum { + ALC290_FIXUP_SUBWOOFER, + ALC290_FIXUP_SUBWOOFER_HSJACK, + ALC269_FIXUP_THINKPAD_ACPI, ++ ALC269_FIXUP_DMIC_THINKPAD_ACPI, + ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, + ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, + ALC255_FIXUP_HEADSET_MODE, +@@ -5046,6 +5047,12 @@ static const struct hda_fixup alc269_fixups[] = { + .type = HDA_FIXUP_FUNC, + .v.func = hda_fixup_thinkpad_acpi, + }, ++ [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = { ++ .type = HDA_FIXUP_FUNC, ++ .v.func = alc_fixup_inv_dmic, ++ .chained = true, ++ .chain_id = ALC269_FIXUP_THINKPAD_ACPI, ++ }, + [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl[]) { +@@ -5280,6 +5287,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { + SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK), + SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), + SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS), ++ SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X), ++ SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X), + SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X), + SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X), + SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER), +@@ -5414,6 +5423,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { + SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), + SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE), + SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), ++ SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), ++ SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), + SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), + SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), + SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), +diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c +index b120925223ae..51a684c6d8e3 100644 +--- a/sound/pci/intel8x0.c ++++ b/sound/pci/intel8x0.c +@@ -2879,6 +2879,7 @@ static void intel8x0_measure_ac97_clock(struct intel8x0 *chip) + + static struct snd_pci_quirk intel8x0_clock_list[] = { + SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000), ++ SND_PCI_QUIRK(0x1014, 0x0581, "AD1981B", 48000), + SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100), + SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000), + SND_PCI_QUIRK(0x1028, 0x01ad, "AD1981B", 48000), +diff --git a/sound/usb/card.c b/sound/usb/card.c +index 0450593980fd..86cf7b585e01 100644 +--- a/sound/usb/card.c ++++ b/sound/usb/card.c +@@ -365,13 +365,15 @@ static int snd_usb_audio_create(struct usb_interface *intf, + } + + mutex_init(&chip->mutex); +- init_rwsem(&chip->shutdown_rwsem); ++ init_waitqueue_head(&chip->shutdown_wait); + chip->index = idx; + chip->dev = dev; + chip->card = card; + chip->setup = device_setup[idx]; + chip->autoclock = autoclock; + chip->probing = 1; ++ atomic_set(&chip->usage_count, 0); ++ atomic_set(&chip->shutdown, 0); + + chip->usb_id = USB_ID(le16_to_cpu(dev->descriptor.idVendor), + le16_to_cpu(dev->descriptor.idProduct)); +@@ -495,7 +497,7 @@ static int usb_audio_probe(struct usb_interface *intf, + mutex_lock(®ister_mutex); + for (i = 0; i < SNDRV_CARDS; i++) { + if (usb_chip[i] && usb_chip[i]->dev == dev) { +- if (usb_chip[i]->shutdown) { ++ if (atomic_read(&usb_chip[i]->shutdown)) { + dev_err(&dev->dev, "USB device is in the shutdown state, cannot create a card instance\n"); + err = -EIO; + goto __error; +@@ -585,23 +587,23 @@ static void usb_audio_disconnect(struct usb_interface *intf) + struct snd_usb_audio *chip = usb_get_intfdata(intf); + struct snd_card *card; + struct list_head *p; +- bool was_shutdown; + + if (chip == (void *)-1L) + return; + + card = chip->card; +- down_write(&chip->shutdown_rwsem); +- was_shutdown = chip->shutdown; +- chip->shutdown = 1; +- up_write(&chip->shutdown_rwsem); + + mutex_lock(®ister_mutex); +- if (!was_shutdown) { ++ if (atomic_inc_return(&chip->shutdown) == 1) { + struct snd_usb_stream *as; + struct snd_usb_endpoint *ep; + struct usb_mixer_interface *mixer; + ++ /* wait until all pending tasks done; ++ * they are protected by snd_usb_lock_shutdown() ++ */ ++ wait_event(chip->shutdown_wait, ++ !atomic_read(&chip->usage_count)); + snd_card_disconnect(card); + /* release the pcm resources */ + list_for_each_entry(as, &chip->pcm_list, list) { +@@ -631,28 +633,56 @@ static void usb_audio_disconnect(struct usb_interface *intf) + } + } + +-#ifdef CONFIG_PM +- +-int snd_usb_autoresume(struct snd_usb_audio *chip) ++/* lock the shutdown (disconnect) task and autoresume */ ++int snd_usb_lock_shutdown(struct snd_usb_audio *chip) + { +- int err = -ENODEV; ++ int err; + +- down_read(&chip->shutdown_rwsem); +- if (chip->probing || chip->in_pm) +- err = 0; +- else if (!chip->shutdown) +- err = usb_autopm_get_interface(chip->pm_intf); +- up_read(&chip->shutdown_rwsem); ++ atomic_inc(&chip->usage_count); ++ if (atomic_read(&chip->shutdown)) { ++ err = -EIO; ++ goto error; ++ } ++ err = snd_usb_autoresume(chip); ++ if (err < 0) ++ goto error; ++ return 0; + ++ error: ++ if (atomic_dec_and_test(&chip->usage_count)) ++ wake_up(&chip->shutdown_wait); + return err; + } + ++/* autosuspend and unlock the shutdown */ ++void snd_usb_unlock_shutdown(struct snd_usb_audio *chip) ++{ ++ snd_usb_autosuspend(chip); ++ if (atomic_dec_and_test(&chip->usage_count)) ++ wake_up(&chip->shutdown_wait); ++} ++ ++#ifdef CONFIG_PM ++ ++int snd_usb_autoresume(struct snd_usb_audio *chip) ++{ ++ if (atomic_read(&chip->shutdown)) ++ return -EIO; ++ if (chip->probing) ++ return 0; ++ if (atomic_inc_return(&chip->active) == 1) ++ return usb_autopm_get_interface(chip->pm_intf); ++ return 0; ++} ++ + void snd_usb_autosuspend(struct snd_usb_audio *chip) + { +- down_read(&chip->shutdown_rwsem); +- if (!chip->shutdown && !chip->probing && !chip->in_pm) ++ if (chip->probing) ++ return; ++ if (atomic_read(&chip->shutdown)) ++ return; ++ if (atomic_dec_and_test(&chip->active)) + usb_autopm_put_interface(chip->pm_intf); +- up_read(&chip->shutdown_rwsem); + } + + static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message) +@@ -705,7 +735,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume) + if (--chip->num_suspended_intf) + return 0; + +- chip->in_pm = 1; ++ atomic_inc(&chip->active); /* avoid autopm */ + /* + * ALSA leaves material resumption to user space + * we just notify and restart the mixers +@@ -725,7 +755,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume) + chip->autosuspended = 0; + + err_out: +- chip->in_pm = 0; ++ atomic_dec(&chip->active); /* allow autopm after this point */ + return err; + } + +diff --git a/sound/usb/clock.c b/sound/usb/clock.c +index 2ed260b10f6d..7ccbcaf6a147 100644 +--- a/sound/usb/clock.c ++++ b/sound/usb/clock.c +@@ -285,6 +285,8 @@ static int set_sample_rate_v1(struct snd_usb_audio *chip, int iface, + unsigned char data[3]; + int err, crate; + ++ if (get_iface_desc(alts)->bNumEndpoints < 1) ++ return -EINVAL; + ep = get_endpoint(alts, 0)->bEndpointAddress; + + /* if endpoint doesn't have sampling rate control, bail out */ +diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c +index 03b074419964..c2131b851602 100644 +--- a/sound/usb/endpoint.c ++++ b/sound/usb/endpoint.c +@@ -355,8 +355,10 @@ static void snd_complete_urb(struct urb *urb) + if (unlikely(urb->status == -ENOENT || /* unlinked */ + urb->status == -ENODEV || /* device removed */ + urb->status == -ECONNRESET || /* unlinked */ +- urb->status == -ESHUTDOWN || /* device disabled */ +- ep->chip->shutdown)) /* device disconnected */ ++ urb->status == -ESHUTDOWN)) /* device disabled */ ++ goto exit_clear; ++ /* device disconnected */ ++ if (unlikely(atomic_read(&ep->chip->shutdown))) + goto exit_clear; + + if (usb_pipeout(ep->pipe)) { +@@ -413,6 +415,9 @@ exit_clear: + * + * New endpoints will be added to chip->ep_list and must be freed by + * calling snd_usb_endpoint_free(). ++ * ++ * For SND_USB_ENDPOINT_TYPE_SYNC, the caller needs to guarantee that ++ * bNumEndpoints > 1 beforehand. + */ + struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip, + struct usb_host_interface *alts, +@@ -529,7 +534,7 @@ static int deactivate_urbs(struct snd_usb_endpoint *ep, bool force) + { + unsigned int i; + +- if (!force && ep->chip->shutdown) /* to be sure... */ ++ if (!force && atomic_read(&ep->chip->shutdown)) /* to be sure... */ + return -EBADFD; + + clear_bit(EP_FLAG_RUNNING, &ep->flags); +@@ -868,7 +873,7 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, bool can_sleep) + int err; + unsigned int i; + +- if (ep->chip->shutdown) ++ if (atomic_read(&ep->chip->shutdown)) + return -EBADFD; + + /* already running? */ +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index f9a9752d4dbc..e0fc02763024 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -282,6 +282,21 @@ static int get_abs_value(struct usb_mixer_elem_info *cval, int val) + return val; + } + ++static int uac2_ctl_value_size(int val_type) ++{ ++ switch (val_type) { ++ case USB_MIXER_S32: ++ case USB_MIXER_U32: ++ return 4; ++ case USB_MIXER_S16: ++ case USB_MIXER_U16: ++ return 2; ++ default: ++ return 1; ++ } ++ return 0; /* unreachable */ ++} ++ + + /* + * retrieve a mixer value +@@ -296,14 +311,11 @@ static int get_ctl_value_v1(struct usb_mixer_elem_info *cval, int request, + int timeout = 10; + int idx = 0, err; + +- err = snd_usb_autoresume(chip); ++ err = snd_usb_lock_shutdown(chip); + if (err < 0) + return -EIO; + +- down_read(&chip->shutdown_rwsem); + while (timeout-- > 0) { +- if (chip->shutdown) +- break; + idx = snd_usb_ctrl_intf(chip) | (cval->head.id << 8); + if (snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), request, + USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, +@@ -319,8 +331,7 @@ static int get_ctl_value_v1(struct usb_mixer_elem_info *cval, int request, + err = -EINVAL; + + out: +- up_read(&chip->shutdown_rwsem); +- snd_usb_autosuspend(chip); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +@@ -328,14 +339,14 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, + int validx, int *value_ret) + { + struct snd_usb_audio *chip = cval->head.mixer->chip; +- unsigned char buf[2 + 3 * sizeof(__u16)]; /* enough space for one range */ ++ unsigned char buf[4 + 3 * sizeof(__u32)]; /* enough space for one range */ + unsigned char *val; + int idx = 0, ret, size; + __u8 bRequest; + + if (request == UAC_GET_CUR) { + bRequest = UAC2_CS_CUR; +- size = sizeof(__u16); ++ size = uac2_ctl_value_size(cval->val_type); + } else { + bRequest = UAC2_CS_RANGE; + size = sizeof(buf); +@@ -343,21 +354,15 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, + + memset(buf, 0, sizeof(buf)); + +- ret = snd_usb_autoresume(chip) ? -EIO : 0; ++ ret = snd_usb_lock_shutdown(chip) ? -EIO : 0; + if (ret) + goto error; + +- down_read(&chip->shutdown_rwsem); +- if (chip->shutdown) { +- ret = -ENODEV; +- } else { +- idx = snd_usb_ctrl_intf(chip) | (cval->head.id << 8); +- ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), bRequest, ++ idx = snd_usb_ctrl_intf(chip) | (cval->head.id << 8); ++ ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), bRequest, + USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, + validx, idx, buf, size); +- } +- up_read(&chip->shutdown_rwsem); +- snd_usb_autosuspend(chip); ++ snd_usb_unlock_shutdown(chip); + + if (ret < 0) { + error: +@@ -446,7 +451,7 @@ int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval, + int request, int validx, int value_set) + { + struct snd_usb_audio *chip = cval->head.mixer->chip; +- unsigned char buf[2]; ++ unsigned char buf[4]; + int idx = 0, val_len, err, timeout = 10; + + validx += cval->idx_off; +@@ -454,8 +459,7 @@ int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval, + if (cval->head.mixer->protocol == UAC_VERSION_1) { + val_len = cval->val_type >= USB_MIXER_S16 ? 2 : 1; + } else { /* UAC_VERSION_2 */ +- /* audio class v2 controls are always 2 bytes in size */ +- val_len = sizeof(__u16); ++ val_len = uac2_ctl_value_size(cval->val_type); + + /* FIXME */ + if (request != UAC_SET_CUR) { +@@ -469,13 +473,14 @@ int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval, + value_set = convert_bytes_value(cval, value_set); + buf[0] = value_set & 0xff; + buf[1] = (value_set >> 8) & 0xff; +- err = snd_usb_autoresume(chip); ++ buf[2] = (value_set >> 16) & 0xff; ++ buf[3] = (value_set >> 24) & 0xff; ++ ++ err = snd_usb_lock_shutdown(chip); + if (err < 0) + return -EIO; +- down_read(&chip->shutdown_rwsem); ++ + while (timeout-- > 0) { +- if (chip->shutdown) +- break; + idx = snd_usb_ctrl_intf(chip) | (cval->head.id << 8); + if (snd_usb_ctl_msg(chip->dev, + usb_sndctrlpipe(chip->dev, 0), request, +@@ -490,8 +495,7 @@ int snd_usb_mixer_set_ctl_value(struct usb_mixer_elem_info *cval, + err = -EINVAL; + + out: +- up_read(&chip->shutdown_rwsem); +- snd_usb_autosuspend(chip); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +@@ -798,24 +802,25 @@ static int check_input_term(struct mixer_build *state, int id, + /* feature unit control information */ + struct usb_feature_control_info { + const char *name; +- unsigned int type; /* control type (mute, volume, etc.) */ ++ int type; /* data type for uac1 */ ++ int type_uac2; /* data type for uac2 if different from uac1, else -1 */ + }; + + static struct usb_feature_control_info audio_feature_info[] = { +- { "Mute", USB_MIXER_INV_BOOLEAN }, +- { "Volume", USB_MIXER_S16 }, +- { "Tone Control - Bass", USB_MIXER_S8 }, +- { "Tone Control - Mid", USB_MIXER_S8 }, +- { "Tone Control - Treble", USB_MIXER_S8 }, +- { "Graphic Equalizer", USB_MIXER_S8 }, /* FIXME: not implemeted yet */ +- { "Auto Gain Control", USB_MIXER_BOOLEAN }, +- { "Delay Control", USB_MIXER_U16 }, +- { "Bass Boost", USB_MIXER_BOOLEAN }, +- { "Loudness", USB_MIXER_BOOLEAN }, ++ { "Mute", USB_MIXER_INV_BOOLEAN, -1 }, ++ { "Volume", USB_MIXER_S16, -1 }, ++ { "Tone Control - Bass", USB_MIXER_S8, -1 }, ++ { "Tone Control - Mid", USB_MIXER_S8, -1 }, ++ { "Tone Control - Treble", USB_MIXER_S8, -1 }, ++ { "Graphic Equalizer", USB_MIXER_S8, -1 }, /* FIXME: not implemeted yet */ ++ { "Auto Gain Control", USB_MIXER_BOOLEAN, -1 }, ++ { "Delay Control", USB_MIXER_U16, USB_MIXER_U32 }, ++ { "Bass Boost", USB_MIXER_BOOLEAN, -1 }, ++ { "Loudness", USB_MIXER_BOOLEAN, -1 }, + /* UAC2 specific */ +- { "Input Gain Control", USB_MIXER_U16 }, +- { "Input Gain Pad Control", USB_MIXER_BOOLEAN }, +- { "Phase Inverter Control", USB_MIXER_BOOLEAN }, ++ { "Input Gain Control", USB_MIXER_S16, -1 }, ++ { "Input Gain Pad Control", USB_MIXER_S16, -1 }, ++ { "Phase Inverter Control", USB_MIXER_BOOLEAN, -1 }, + }; + + /* private_free callback */ +@@ -1215,6 +1220,7 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, + int readonly_mask) + { + struct uac_feature_unit_descriptor *desc = raw_desc; ++ struct usb_feature_control_info *ctl_info; + unsigned int len = 0; + int mapped_name = 0; + int nameid = uac_feature_unit_iFeature(desc); +@@ -1240,7 +1246,13 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc, + snd_usb_mixer_elem_init_std(&cval->head, state->mixer, unitid); + cval->control = control; + cval->cmask = ctl_mask; +- cval->val_type = audio_feature_info[control-1].type; ++ ctl_info = &audio_feature_info[control-1]; ++ if (state->mixer->protocol == UAC_VERSION_1) ++ cval->val_type = ctl_info->type; ++ else /* UAC_VERSION_2 */ ++ cval->val_type = ctl_info->type_uac2 >= 0 ? ++ ctl_info->type_uac2 : ctl_info->type; ++ + if (ctl_mask == 0) { + cval->channels = 1; /* master channel */ + cval->master_readonly = readonly_mask; +diff --git a/sound/usb/mixer.h b/sound/usb/mixer.h +index d3268f0ee2b3..3417ef347e40 100644 +--- a/sound/usb/mixer.h ++++ b/sound/usb/mixer.h +@@ -33,6 +33,8 @@ enum { + USB_MIXER_U8, + USB_MIXER_S16, + USB_MIXER_U16, ++ USB_MIXER_S32, ++ USB_MIXER_U32, + }; + + typedef void (*usb_mixer_elem_dump_func_t)(struct snd_info_buffer *buffer, +diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c +index db9547d04f38..940442848fc8 100644 +--- a/sound/usb/mixer_quirks.c ++++ b/sound/usb/mixer_quirks.c +@@ -309,11 +309,10 @@ static int snd_audigy2nx_led_update(struct usb_mixer_interface *mixer, + struct snd_usb_audio *chip = mixer->chip; + int err; + +- down_read(&chip->shutdown_rwsem); +- if (chip->shutdown) { +- err = -ENODEV; +- goto out; +- } ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; ++ + if (chip->usb_id == USB_ID(0x041e, 0x3042)) + err = snd_usb_ctl_msg(chip->dev, + usb_sndctrlpipe(chip->dev, 0), 0x24, +@@ -330,8 +329,7 @@ static int snd_audigy2nx_led_update(struct usb_mixer_interface *mixer, + usb_sndctrlpipe(chip->dev, 0), 0x24, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER, + value, index + 2, NULL, 0); +- out: +- up_read(&chip->shutdown_rwsem); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +@@ -442,16 +440,15 @@ static void snd_audigy2nx_proc_read(struct snd_info_entry *entry, + + for (i = 0; jacks[i].name; ++i) { + snd_iprintf(buffer, "%s: ", jacks[i].name); +- down_read(&mixer->chip->shutdown_rwsem); +- if (mixer->chip->shutdown) +- err = 0; +- else +- err = snd_usb_ctl_msg(mixer->chip->dev, ++ err = snd_usb_lock_shutdown(mixer->chip); ++ if (err < 0) ++ return; ++ err = snd_usb_ctl_msg(mixer->chip->dev, + usb_rcvctrlpipe(mixer->chip->dev, 0), + UAC_GET_MEM, USB_DIR_IN | USB_TYPE_CLASS | + USB_RECIP_INTERFACE, 0, + jacks[i].unitid << 8, buf, 3); +- up_read(&mixer->chip->shutdown_rwsem); ++ snd_usb_unlock_shutdown(mixer->chip); + if (err == 3 && (buf[0] == 3 || buf[0] == 6)) + snd_iprintf(buffer, "%02x %02x\n", buf[1], buf[2]); + else +@@ -482,11 +479,9 @@ static int snd_emu0204_ch_switch_update(struct usb_mixer_interface *mixer, + int err; + unsigned char buf[2]; + +- down_read(&chip->shutdown_rwsem); +- if (mixer->chip->shutdown) { +- err = -ENODEV; +- goto out; +- } ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; + + buf[0] = 0x01; + buf[1] = value ? 0x02 : 0x01; +@@ -494,8 +489,7 @@ static int snd_emu0204_ch_switch_update(struct usb_mixer_interface *mixer, + usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR, + USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT, + 0x0400, 0x0e00, buf, 2); +- out: +- up_read(&chip->shutdown_rwsem); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +@@ -555,15 +549,14 @@ static int snd_xonar_u1_switch_update(struct usb_mixer_interface *mixer, + struct snd_usb_audio *chip = mixer->chip; + int err; + +- down_read(&chip->shutdown_rwsem); +- if (chip->shutdown) +- err = -ENODEV; +- else +- err = snd_usb_ctl_msg(chip->dev, ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; ++ err = snd_usb_ctl_msg(chip->dev, + usb_sndctrlpipe(chip->dev, 0), 0x08, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER, + 50, 0, &status, 1); +- up_read(&chip->shutdown_rwsem); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +@@ -624,11 +617,9 @@ static int snd_mbox1_switch_update(struct usb_mixer_interface *mixer, int val) + int err; + unsigned char buff[3]; + +- down_read(&chip->shutdown_rwsem); +- if (chip->shutdown) { +- err = -ENODEV; +- goto err; +- } ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; + + /* Prepare for magic command to toggle clock source */ + err = snd_usb_ctl_msg(chip->dev, +@@ -684,7 +675,7 @@ static int snd_mbox1_switch_update(struct usb_mixer_interface *mixer, int val) + goto err; + + err: +- up_read(&chip->shutdown_rwsem); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +@@ -779,15 +770,14 @@ static int snd_ni_update_cur_val(struct usb_mixer_elem_list *list) + unsigned int pval = list->kctl->private_value; + int err; + +- down_read(&chip->shutdown_rwsem); +- if (chip->shutdown) +- err = -ENODEV; +- else +- err = usb_control_msg(chip->dev, usb_sndctrlpipe(chip->dev, 0), +- (pval >> 16) & 0xff, +- USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, +- pval >> 24, pval & 0xffff, NULL, 0, 1000); +- up_read(&chip->shutdown_rwsem); ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; ++ err = usb_control_msg(chip->dev, usb_sndctrlpipe(chip->dev, 0), ++ (pval >> 16) & 0xff, ++ USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, ++ pval >> 24, pval & 0xffff, NULL, 0, 1000); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +@@ -945,18 +935,17 @@ static int snd_ftu_eff_switch_update(struct usb_mixer_elem_list *list) + value[0] = pval >> 24; + value[1] = 0; + +- down_read(&chip->shutdown_rwsem); +- if (chip->shutdown) +- err = -ENODEV; +- else +- err = snd_usb_ctl_msg(chip->dev, +- usb_sndctrlpipe(chip->dev, 0), +- UAC_SET_CUR, +- USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT, +- pval & 0xff00, +- snd_usb_ctrl_intf(chip) | ((pval & 0xff) << 8), +- value, 2); +- up_read(&chip->shutdown_rwsem); ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; ++ err = snd_usb_ctl_msg(chip->dev, ++ usb_sndctrlpipe(chip->dev, 0), ++ UAC_SET_CUR, ++ USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT, ++ pval & 0xff00, ++ snd_usb_ctrl_intf(chip) | ((pval & 0xff) << 8), ++ value, 2); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +@@ -1520,11 +1509,9 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol, + unsigned char data[3]; + int rate; + +- down_read(&chip->shutdown_rwsem); +- if (chip->shutdown) { +- err = -ENODEV; +- goto end; +- } ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; + + ucontrol->value.iec958.status[0] = kcontrol->private_value & 0xff; + ucontrol->value.iec958.status[1] = (kcontrol->private_value >> 8) & 0xff; +@@ -1532,7 +1519,11 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol, + + /* use known values for that card: interface#1 altsetting#1 */ + iface = usb_ifnum_to_if(chip->dev, 1); ++ if (!iface || iface->num_altsetting < 2) ++ return -EINVAL; + alts = &iface->altsetting[1]; ++ if (get_iface_desc(alts)->bNumEndpoints < 1) ++ return -EINVAL; + ep = get_endpoint(alts, 0)->bEndpointAddress; + + err = snd_usb_ctl_msg(chip->dev, +@@ -1552,7 +1543,7 @@ static int snd_microii_spdif_default_get(struct snd_kcontrol *kcontrol, + + err = 0; + end: +- up_read(&chip->shutdown_rwsem); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +@@ -1563,11 +1554,9 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list) + u8 reg; + int err; + +- down_read(&chip->shutdown_rwsem); +- if (chip->shutdown) { +- err = -ENODEV; +- goto end; +- } ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; + + reg = ((pval >> 4) & 0xf0) | (pval & 0x0f); + err = snd_usb_ctl_msg(chip->dev, +@@ -1595,7 +1584,7 @@ static int snd_microii_spdif_default_update(struct usb_mixer_elem_list *list) + goto end; + + end: +- up_read(&chip->shutdown_rwsem); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +@@ -1651,11 +1640,9 @@ static int snd_microii_spdif_switch_update(struct usb_mixer_elem_list *list) + u8 reg = list->kctl->private_value; + int err; + +- down_read(&chip->shutdown_rwsem); +- if (chip->shutdown) { +- err = -ENODEV; +- goto end; +- } ++ err = snd_usb_lock_shutdown(chip); ++ if (err < 0) ++ return err; + + err = snd_usb_ctl_msg(chip->dev, + usb_sndctrlpipe(chip->dev, 0), +@@ -1666,8 +1653,7 @@ static int snd_microii_spdif_switch_update(struct usb_mixer_elem_list *list) + NULL, + 0); + +- end: +- up_read(&chip->shutdown_rwsem); ++ snd_usb_unlock_shutdown(chip); + return err; + } + +diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c +index b4ef410e5a98..a51155197277 100644 +--- a/sound/usb/pcm.c ++++ b/sound/usb/pcm.c +@@ -80,7 +80,7 @@ static snd_pcm_uframes_t snd_usb_pcm_pointer(struct snd_pcm_substream *substream + unsigned int hwptr_done; + + subs = (struct snd_usb_substream *)substream->runtime->private_data; +- if (subs->stream->chip->shutdown) ++ if (atomic_read(&subs->stream->chip->shutdown)) + return SNDRV_PCM_POS_XRUN; + spin_lock(&subs->lock); + hwptr_done = subs->hwptr_done; +@@ -159,6 +159,8 @@ static int init_pitch_v1(struct snd_usb_audio *chip, int iface, + unsigned char data[1]; + int err; + ++ if (get_iface_desc(alts)->bNumEndpoints < 1) ++ return -EINVAL; + ep = get_endpoint(alts, 0)->bEndpointAddress; + + data[0] = 1; +@@ -707,12 +709,11 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream, + return -EINVAL; + } + +- down_read(&subs->stream->chip->shutdown_rwsem); +- if (subs->stream->chip->shutdown) +- ret = -ENODEV; +- else +- ret = set_format(subs, fmt); +- up_read(&subs->stream->chip->shutdown_rwsem); ++ ret = snd_usb_lock_shutdown(subs->stream->chip); ++ if (ret < 0) ++ return ret; ++ ret = set_format(subs, fmt); ++ snd_usb_unlock_shutdown(subs->stream->chip); + if (ret < 0) + return ret; + +@@ -735,13 +736,12 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream) + subs->cur_audiofmt = NULL; + subs->cur_rate = 0; + subs->period_bytes = 0; +- down_read(&subs->stream->chip->shutdown_rwsem); +- if (!subs->stream->chip->shutdown) { ++ if (!snd_usb_lock_shutdown(subs->stream->chip)) { + stop_endpoints(subs, true); + snd_usb_endpoint_deactivate(subs->sync_endpoint); + snd_usb_endpoint_deactivate(subs->data_endpoint); ++ snd_usb_unlock_shutdown(subs->stream->chip); + } +- up_read(&subs->stream->chip->shutdown_rwsem); + return snd_pcm_lib_free_vmalloc_buffer(substream); + } + +@@ -763,11 +763,9 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream) + return -ENXIO; + } + +- down_read(&subs->stream->chip->shutdown_rwsem); +- if (subs->stream->chip->shutdown) { +- ret = -ENODEV; +- goto unlock; +- } ++ ret = snd_usb_lock_shutdown(subs->stream->chip); ++ if (ret < 0) ++ return ret; + if (snd_BUG_ON(!subs->data_endpoint)) { + ret = -EIO; + goto unlock; +@@ -816,7 +814,7 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream) + ret = start_endpoints(subs, true); + + unlock: +- up_read(&subs->stream->chip->shutdown_rwsem); ++ snd_usb_unlock_shutdown(subs->stream->chip); + return ret; + } + +@@ -1218,9 +1216,11 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream, int direction) + + stop_endpoints(subs, true); + +- if (!as->chip->shutdown && subs->interface >= 0) { ++ if (subs->interface >= 0 && ++ !snd_usb_lock_shutdown(subs->stream->chip)) { + usb_set_interface(subs->dev, subs->interface, 0); + subs->interface = -1; ++ snd_usb_unlock_shutdown(subs->stream->chip); + } + + subs->pcm_substream = NULL; +diff --git a/sound/usb/proc.c b/sound/usb/proc.c +index 5f761ab34c01..0ac89e294d31 100644 +--- a/sound/usb/proc.c ++++ b/sound/usb/proc.c +@@ -46,14 +46,14 @@ static inline unsigned get_high_speed_hz(unsigned int usb_rate) + static void proc_audio_usbbus_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) + { + struct snd_usb_audio *chip = entry->private_data; +- if (!chip->shutdown) ++ if (!atomic_read(&chip->shutdown)) + snd_iprintf(buffer, "%03d/%03d\n", chip->dev->bus->busnum, chip->dev->devnum); + } + + static void proc_audio_usbid_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer) + { + struct snd_usb_audio *chip = entry->private_data; +- if (!chip->shutdown) ++ if (!atomic_read(&chip->shutdown)) + snd_iprintf(buffer, "%04x:%04x\n", + USB_ID_VENDOR(chip->usb_id), + USB_ID_PRODUCT(chip->usb_id)); +diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c +index a4d03e5da3e0..5fb308d39e2a 100644 +--- a/sound/usb/quirks.c ++++ b/sound/usb/quirks.c +@@ -177,6 +177,12 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, + } + alts = &iface->altsetting[fp->altset_idx]; + altsd = get_iface_desc(alts); ++ if (altsd->bNumEndpoints < 1) { ++ kfree(fp); ++ kfree(rate_table); ++ return -EINVAL; ++ } ++ + fp->protocol = altsd->bInterfaceProtocol; + + if (fp->datainterval == 0) +@@ -1118,6 +1124,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) + switch (chip->usb_id) { + case USB_ID(0x045E, 0x075D): /* MS Lifecam Cinema */ + case USB_ID(0x045E, 0x076D): /* MS Lifecam HD-5000 */ ++ case USB_ID(0x045E, 0x076E): /* MS Lifecam HD-5001 */ + case USB_ID(0x045E, 0x076F): /* MS Lifecam HD-6000 */ + case USB_ID(0x045E, 0x0772): /* MS Lifecam Studio */ + case USB_ID(0x045E, 0x0779): /* MS Lifecam HD-3000 */ +diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h +index 991aa84491cd..66cba05258af 100644 +--- a/sound/usb/usbaudio.h ++++ b/sound/usb/usbaudio.h +@@ -37,11 +37,12 @@ struct snd_usb_audio { + struct usb_interface *pm_intf; + u32 usb_id; + struct mutex mutex; +- struct rw_semaphore shutdown_rwsem; +- unsigned int shutdown:1; + unsigned int probing:1; +- unsigned int in_pm:1; + unsigned int autosuspended:1; ++ atomic_t active; ++ atomic_t shutdown; ++ atomic_t usage_count; ++ wait_queue_head_t shutdown_wait; + unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */ + + int num_interfaces; +@@ -116,4 +117,7 @@ struct snd_usb_audio_quirk { + #define combine_triple(s) (combine_word(s) | ((unsigned int)(s)[2] << 16)) + #define combine_quad(s) (combine_triple(s) | ((unsigned int)(s)[3] << 24)) + ++int snd_usb_lock_shutdown(struct snd_usb_audio *chip); ++void snd_usb_unlock_shutdown(struct snd_usb_audio *chip); ++ + #endif /* __USBAUDIO_H */ +diff --git a/tools/hv/Makefile b/tools/hv/Makefile +index a8ab79556926..a8c4644022a6 100644 +--- a/tools/hv/Makefile ++++ b/tools/hv/Makefile +@@ -5,6 +5,8 @@ PTHREAD_LIBS = -lpthread + WARNINGS = -Wall -Wextra + CFLAGS = $(WARNINGS) -g $(PTHREAD_LIBS) $(shell getconf LFS_CFLAGS) + ++CFLAGS += -D__EXPORTED_HEADERS__ -I../../include/uapi -I../../include ++ + all: hv_kvp_daemon hv_vss_daemon hv_fcopy_daemon + %: %.c + $(CC) $(CFLAGS) -o $@ $^ +diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c +index 48411674da0f..8b02a4355659 100644 +--- a/tools/perf/util/pmu.c ++++ b/tools/perf/util/pmu.c +@@ -263,13 +263,12 @@ static int pmu_aliases_parse(char *dir, struct list_head *head) + { + struct dirent *evt_ent; + DIR *event_dir; +- int ret = 0; + + event_dir = opendir(dir); + if (!event_dir) + return -EINVAL; + +- while (!ret && (evt_ent = readdir(event_dir))) { ++ while ((evt_ent = readdir(event_dir))) { + char path[PATH_MAX]; + char *name = evt_ent->d_name; + FILE *file; +@@ -285,17 +284,19 @@ static int pmu_aliases_parse(char *dir, struct list_head *head) + + snprintf(path, PATH_MAX, "%s/%s", dir, name); + +- ret = -EINVAL; + file = fopen(path, "r"); +- if (!file) +- break; ++ if (!file) { ++ pr_debug("Cannot open %s\n", path); ++ continue; ++ } + +- ret = perf_pmu__new_alias(head, dir, name, file); ++ if (perf_pmu__new_alias(head, dir, name, file) < 0) ++ pr_debug("Cannot set up %s\n", name); + fclose(file); + } + + closedir(event_dir); +- return ret; ++ return 0; + } + + /* +diff --git a/tools/testing/selftests/efivarfs/efivarfs.sh b/tools/testing/selftests/efivarfs/efivarfs.sh +index 77edcdcc016b..057278448515 100755 +--- a/tools/testing/selftests/efivarfs/efivarfs.sh ++++ b/tools/testing/selftests/efivarfs/efivarfs.sh +@@ -88,7 +88,11 @@ test_delete() + exit 1 + fi + +- rm $file ++ rm $file 2>/dev/null ++ if [ $? -ne 0 ]; then ++ chattr -i $file ++ rm $file ++ fi + + if [ -e $file ]; then + echo "$file couldn't be deleted" >&2 +@@ -111,6 +115,7 @@ test_zero_size_delete() + exit 1 + fi + ++ chattr -i $file + printf "$attrs" > $file + + if [ -e $file ]; then +@@ -141,7 +146,11 @@ test_valid_filenames() + echo "$file could not be created" >&2 + ret=1 + else +- rm $file ++ rm $file 2>/dev/null ++ if [ $? -ne 0 ]; then ++ chattr -i $file ++ rm $file ++ fi + fi + done + +@@ -174,7 +183,11 @@ test_invalid_filenames() + + if [ -e $file ]; then + echo "Creating $file should have failed" >&2 +- rm $file ++ rm $file 2>/dev/null ++ if [ $? -ne 0 ]; then ++ chattr -i $file ++ rm $file ++ fi + ret=1 + fi + done +diff --git a/tools/testing/selftests/efivarfs/open-unlink.c b/tools/testing/selftests/efivarfs/open-unlink.c +index 8c0764407b3c..4af74f733036 100644 +--- a/tools/testing/selftests/efivarfs/open-unlink.c ++++ b/tools/testing/selftests/efivarfs/open-unlink.c +@@ -1,10 +1,68 @@ ++#include <errno.h> + #include <stdio.h> + #include <stdint.h> + #include <stdlib.h> + #include <unistd.h> ++#include <sys/ioctl.h> + #include <sys/types.h> + #include <sys/stat.h> + #include <fcntl.h> ++#include <linux/fs.h> ++ ++static int set_immutable(const char *path, int immutable) ++{ ++ unsigned int flags; ++ int fd; ++ int rc; ++ int error; ++ ++ fd = open(path, O_RDONLY); ++ if (fd < 0) ++ return fd; ++ ++ rc = ioctl(fd, FS_IOC_GETFLAGS, &flags); ++ if (rc < 0) { ++ error = errno; ++ close(fd); ++ errno = error; ++ return rc; ++ } ++ ++ if (immutable) ++ flags |= FS_IMMUTABLE_FL; ++ else ++ flags &= ~FS_IMMUTABLE_FL; ++ ++ rc = ioctl(fd, FS_IOC_SETFLAGS, &flags); ++ error = errno; ++ close(fd); ++ errno = error; ++ return rc; ++} ++ ++static int get_immutable(const char *path) ++{ ++ unsigned int flags; ++ int fd; ++ int rc; ++ int error; ++ ++ fd = open(path, O_RDONLY); ++ if (fd < 0) ++ return fd; ++ ++ rc = ioctl(fd, FS_IOC_GETFLAGS, &flags); ++ if (rc < 0) { ++ error = errno; ++ close(fd); ++ errno = error; ++ return rc; ++ } ++ close(fd); ++ if (flags & FS_IMMUTABLE_FL) ++ return 1; ++ return 0; ++} + + int main(int argc, char **argv) + { +@@ -27,7 +85,7 @@ int main(int argc, char **argv) + buf[4] = 0; + + /* create a test variable */ +- fd = open(path, O_WRONLY | O_CREAT); ++ fd = open(path, O_WRONLY | O_CREAT, 0600); + if (fd < 0) { + perror("open(O_WRONLY)"); + return EXIT_FAILURE; +@@ -41,6 +99,18 @@ int main(int argc, char **argv) + + close(fd); + ++ rc = get_immutable(path); ++ if (rc < 0) { ++ perror("ioctl(FS_IOC_GETFLAGS)"); ++ return EXIT_FAILURE; ++ } else if (rc) { ++ rc = set_immutable(path, 0); ++ if (rc < 0) { ++ perror("ioctl(FS_IOC_SETFLAGS)"); ++ return EXIT_FAILURE; ++ } ++ } ++ + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("open"); +diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c +index 85422985235f..c2f87ff0061d 100644 +--- a/virt/kvm/kvm_main.c ++++ b/virt/kvm/kvm_main.c +@@ -457,6 +457,16 @@ static struct kvm *kvm_create_vm(unsigned long type) + if (!kvm) + return ERR_PTR(-ENOMEM); + ++ spin_lock_init(&kvm->mmu_lock); ++ atomic_inc(¤t->mm->mm_count); ++ kvm->mm = current->mm; ++ kvm_eventfd_init(kvm); ++ mutex_init(&kvm->lock); ++ mutex_init(&kvm->irq_lock); ++ mutex_init(&kvm->slots_lock); ++ atomic_set(&kvm->users_count, 1); ++ INIT_LIST_HEAD(&kvm->devices); ++ + r = kvm_arch_init_vm(kvm, type); + if (r) + goto out_err_no_disable; +@@ -494,16 +504,6 @@ static struct kvm *kvm_create_vm(unsigned long type) + goto out_err; + } + +- spin_lock_init(&kvm->mmu_lock); +- kvm->mm = current->mm; +- atomic_inc(&kvm->mm->mm_count); +- kvm_eventfd_init(kvm); +- mutex_init(&kvm->lock); +- mutex_init(&kvm->irq_lock); +- mutex_init(&kvm->slots_lock); +- atomic_set(&kvm->users_count, 1); +- INIT_LIST_HEAD(&kvm->devices); +- + r = kvm_init_mmu_notifier(kvm); + if (r) + goto out_err; +@@ -525,6 +525,7 @@ out_err_no_disable: + kfree(kvm->buses[i]); + kvfree(kvm->memslots); + kvm_arch_free_vm(kvm); ++ mmdrop(current->mm); + return ERR_PTR(r); + } +