From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 25F0F139082 for ; Thu, 30 Nov 2017 12:26:02 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 2BA1AE0DA7; Thu, 30 Nov 2017 12:26:01 +0000 (UTC) Received: from smtp.gentoo.org (dev.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id EAC43E0DA7 for ; Thu, 30 Nov 2017 12:26:00 +0000 (UTC) Received: from oystercatcher.gentoo.org (unknown [IPv6:2a01:4f8:202:4333:225:90ff:fed9:fc84]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 2FC2D33C770 for ; Thu, 30 Nov 2017 12:25:58 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 95C0AACBB for ; Thu, 30 Nov 2017 12:25:56 +0000 (UTC) From: "Alice Ferrazzi" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Alice Ferrazzi" Message-ID: <1512044380.593e35d016571ad38b9f87465ac74b1b3e213e85.alicef@gentoo> Subject: [gentoo-commits] proj/linux-patches:4.4 commit in: / X-VCS-Repository: proj/linux-patches X-VCS-Files: 0000_README 1102_linux-4.4.103.patch X-VCS-Directories: / X-VCS-Committer: alicef X-VCS-Committer-Name: Alice Ferrazzi X-VCS-Revision: 593e35d016571ad38b9f87465ac74b1b3e213e85 X-VCS-Branch: 4.4 Date: Thu, 30 Nov 2017 12:25:56 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: e0849b8e-6dec-44d6-9c93-d59dcaed53ce X-Archives-Hash: fd0ff198db92b2377d8ad1e49aa01a04 commit: 593e35d016571ad38b9f87465ac74b1b3e213e85 Author: Alice Ferrazzi gentoo org> AuthorDate: Thu Nov 30 12:19:40 2017 +0000 Commit: Alice Ferrazzi gentoo org> CommitDate: Thu Nov 30 12:19:40 2017 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=593e35d0 linux kernel 4.4.103 0000_README | 4 + 1102_linux-4.4.103.patch | 3056 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3060 insertions(+) diff --git a/0000_README b/0000_README index 069312b..21ecaf0 100644 --- a/0000_README +++ b/0000_README @@ -451,6 +451,10 @@ Patch: 1101_linux-4.4.102.patch From: http://www.kernel.org Desc: Linux 4.4.102 +Patch: 1102_linux-4.4.103.patch +From: http://www.kernel.org +Desc: Linux 4.4.103 + 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/1102_linux-4.4.103.patch b/1102_linux-4.4.103.patch new file mode 100644 index 0000000..447afae --- /dev/null +++ b/1102_linux-4.4.103.patch @@ -0,0 +1,3056 @@ +diff --git a/Makefile b/Makefile +index 9e036fac9c04..f5a51cd7ca49 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 4 + PATCHLEVEL = 4 +-SUBLEVEL = 102 ++SUBLEVEL = 103 + EXTRAVERSION = + NAME = Blurry Fish Butt + +diff --git a/arch/arm/mm/dump.c b/arch/arm/mm/dump.c +index 9fe8e241335c..e1f6f0daa847 100644 +--- a/arch/arm/mm/dump.c ++++ b/arch/arm/mm/dump.c +@@ -126,8 +126,8 @@ static const struct prot_bits section_bits[] = { + .val = PMD_SECT_USER, + .set = "USR", + }, { +- .mask = L_PMD_SECT_RDONLY, +- .val = L_PMD_SECT_RDONLY, ++ .mask = L_PMD_SECT_RDONLY | PMD_SECT_AP2, ++ .val = L_PMD_SECT_RDONLY | PMD_SECT_AP2, + .set = "ro", + .clear = "RW", + #elif __LINUX_ARM_ARCH__ >= 6 +diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c +index 7f8cd1b3557f..c29ad610311b 100644 +--- a/arch/arm/mm/init.c ++++ b/arch/arm/mm/init.c +@@ -611,8 +611,8 @@ static struct section_perm ro_perms[] = { + .start = (unsigned long)_stext, + .end = (unsigned long)__init_begin, + #ifdef CONFIG_ARM_LPAE +- .mask = ~L_PMD_SECT_RDONLY, +- .prot = L_PMD_SECT_RDONLY, ++ .mask = ~(L_PMD_SECT_RDONLY | PMD_SECT_AP2), ++ .prot = L_PMD_SECT_RDONLY | PMD_SECT_AP2, + #else + .mask = ~(PMD_SECT_APX | PMD_SECT_AP_WRITE), + .prot = PMD_SECT_APX | PMD_SECT_AP_WRITE, +diff --git a/arch/mips/bcm47xx/leds.c b/arch/mips/bcm47xx/leds.c +index d20ae63eb3c2..46abe9e4e0e0 100644 +--- a/arch/mips/bcm47xx/leds.c ++++ b/arch/mips/bcm47xx/leds.c +@@ -330,7 +330,7 @@ bcm47xx_leds_linksys_wrt54g3gv2[] __initconst = { + /* Verified on: WRT54GS V1.0 */ + static const struct gpio_led + bcm47xx_leds_linksys_wrt54g_type_0101[] __initconst = { +- BCM47XX_GPIO_LED(0, "green", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF), ++ BCM47XX_GPIO_LED(0, "green", "wlan", 1, LEDS_GPIO_DEFSTATE_OFF), + BCM47XX_GPIO_LED(1, "green", "power", 0, LEDS_GPIO_DEFSTATE_ON), + BCM47XX_GPIO_LED(7, "green", "dmz", 1, LEDS_GPIO_DEFSTATE_OFF), + }; +diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c +index 24c115a0721a..a3f38e6b7ea1 100644 +--- a/arch/mips/kernel/ptrace.c ++++ b/arch/mips/kernel/ptrace.c +@@ -650,6 +650,19 @@ static const struct user_regset_view user_mips64_view = { + .n = ARRAY_SIZE(mips64_regsets), + }; + ++#ifdef CONFIG_MIPS32_N32 ++ ++static const struct user_regset_view user_mipsn32_view = { ++ .name = "mipsn32", ++ .e_flags = EF_MIPS_ABI2, ++ .e_machine = ELF_ARCH, ++ .ei_osabi = ELF_OSABI, ++ .regsets = mips64_regsets, ++ .n = ARRAY_SIZE(mips64_regsets), ++}; ++ ++#endif /* CONFIG_MIPS32_N32 */ ++ + #endif /* CONFIG_64BIT */ + + const struct user_regset_view *task_user_regset_view(struct task_struct *task) +@@ -660,6 +673,10 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task) + #ifdef CONFIG_MIPS32_O32 + if (test_tsk_thread_flag(task, TIF_32BIT_REGS)) + return &user_mips_view; ++#endif ++#ifdef CONFIG_MIPS32_N32 ++ if (test_tsk_thread_flag(task, TIF_32BIT_ADDR)) ++ return &user_mipsn32_view; + #endif + return &user_mips64_view; + #endif +diff --git a/arch/mips/ralink/mt7620.c b/arch/mips/ralink/mt7620.c +index 48d6349fd9d7..c5f45fc96c74 100644 +--- a/arch/mips/ralink/mt7620.c ++++ b/arch/mips/ralink/mt7620.c +@@ -141,8 +141,8 @@ static struct rt2880_pmx_func i2c_grp_mt7628[] = { + FUNC("i2c", 0, 4, 2), + }; + +-static struct rt2880_pmx_func refclk_grp_mt7628[] = { FUNC("reclk", 0, 36, 1) }; +-static struct rt2880_pmx_func perst_grp_mt7628[] = { FUNC("perst", 0, 37, 1) }; ++static struct rt2880_pmx_func refclk_grp_mt7628[] = { FUNC("refclk", 0, 37, 1) }; ++static struct rt2880_pmx_func perst_grp_mt7628[] = { FUNC("perst", 0, 36, 1) }; + static struct rt2880_pmx_func wdt_grp_mt7628[] = { FUNC("wdt", 0, 38, 1) }; + static struct rt2880_pmx_func spi_grp_mt7628[] = { FUNC("spi", 0, 7, 4) }; + +diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S +index c6b855f7892c..9f22195b90ed 100644 +--- a/arch/parisc/kernel/syscall.S ++++ b/arch/parisc/kernel/syscall.S +@@ -688,15 +688,15 @@ cas_action: + /* ELF32 Process entry path */ + lws_compare_and_swap_2: + #ifdef CONFIG_64BIT +- /* Clip the input registers */ ++ /* Clip the input registers. We don't need to clip %r23 as we ++ only use it for word operations */ + depdi 0, 31, 32, %r26 + depdi 0, 31, 32, %r25 + depdi 0, 31, 32, %r24 +- depdi 0, 31, 32, %r23 + #endif + + /* Check the validity of the size pointer */ +- subi,>>= 4, %r23, %r0 ++ subi,>>= 3, %r23, %r0 + b,n lws_exit_nosys + + /* Jump to the functions which will load the old and new values into +diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c +index cf8c7e4e0b21..984a54c85952 100644 +--- a/arch/powerpc/kernel/signal.c ++++ b/arch/powerpc/kernel/signal.c +@@ -102,7 +102,7 @@ static void check_syscall_restart(struct pt_regs *regs, struct k_sigaction *ka, + static void do_signal(struct pt_regs *regs) + { + sigset_t *oldset = sigmask_to_save(); +- struct ksignal ksig; ++ struct ksignal ksig = { .sig = 0 }; + int ret; + int is32 = is_32bit_task(); + +diff --git a/arch/s390/include/asm/asm-prototypes.h b/arch/s390/include/asm/asm-prototypes.h +new file mode 100644 +index 000000000000..2c3413b0ca52 +--- /dev/null ++++ b/arch/s390/include/asm/asm-prototypes.h +@@ -0,0 +1,8 @@ ++#ifndef _ASM_S390_PROTOTYPES_H ++ ++#include ++#include ++#include ++#include ++ ++#endif /* _ASM_S390_PROTOTYPES_H */ +diff --git a/arch/s390/include/asm/switch_to.h b/arch/s390/include/asm/switch_to.h +index 12d45f0cfdd9..dde6b52359c5 100644 +--- a/arch/s390/include/asm/switch_to.h ++++ b/arch/s390/include/asm/switch_to.h +@@ -34,8 +34,8 @@ static inline void restore_access_regs(unsigned int *acrs) + save_access_regs(&prev->thread.acrs[0]); \ + save_ri_cb(prev->thread.ri_cb); \ + } \ ++ update_cr_regs(next); \ + if (next->mm) { \ +- update_cr_regs(next); \ + set_cpu_flag(CIF_FPU); \ + restore_access_regs(&next->thread.acrs[0]); \ + restore_ri_cb(next->thread.ri_cb, prev->thread.ri_cb); \ +diff --git a/arch/s390/kernel/dis.c b/arch/s390/kernel/dis.c +index 6e72961608f0..07477ba392b7 100644 +--- a/arch/s390/kernel/dis.c ++++ b/arch/s390/kernel/dis.c +@@ -1549,6 +1549,7 @@ static struct s390_insn opcode_e7[] = { + { "vfsq", 0xce, INSTR_VRR_VV000MM }, + { "vfs", 0xe2, INSTR_VRR_VVV00MM }, + { "vftci", 0x4a, INSTR_VRI_VVIMM }, ++ { "", 0, INSTR_INVALID } + }; + + static struct s390_insn opcode_eb[] = { +@@ -1961,7 +1962,7 @@ void show_code(struct pt_regs *regs) + { + char *mode = user_mode(regs) ? "User" : "Krnl"; + unsigned char code[64]; +- char buffer[64], *ptr; ++ char buffer[128], *ptr; + mm_segment_t old_fs; + unsigned long addr; + int start, end, opsize, hops, i; +@@ -2024,7 +2025,7 @@ void show_code(struct pt_regs *regs) + start += opsize; + printk(buffer); + ptr = buffer; +- ptr += sprintf(ptr, "\n "); ++ ptr += sprintf(ptr, "\n\t "); + hops++; + } + printk("\n"); +diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c +index 3c31609df959..ee7b8e7ca4f8 100644 +--- a/arch/s390/kernel/early.c ++++ b/arch/s390/kernel/early.c +@@ -325,8 +325,10 @@ static __init void detect_machine_facilities(void) + S390_lowcore.machine_flags |= MACHINE_FLAG_IDTE; + if (test_facility(40)) + S390_lowcore.machine_flags |= MACHINE_FLAG_LPP; +- if (test_facility(50) && test_facility(73)) ++ if (test_facility(50) && test_facility(73)) { + S390_lowcore.machine_flags |= MACHINE_FLAG_TE; ++ __ctl_set_bit(0, 55); ++ } + if (test_facility(51)) + S390_lowcore.machine_flags |= MACHINE_FLAG_TLB_LC; + if (test_facility(129)) { +diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c +index 114ee8b96f17..efa035a31b98 100644 +--- a/arch/s390/kernel/process.c ++++ b/arch/s390/kernel/process.c +@@ -137,6 +137,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp, + memset(&p->thread.per_user, 0, sizeof(p->thread.per_user)); + memset(&p->thread.per_event, 0, sizeof(p->thread.per_event)); + clear_tsk_thread_flag(p, TIF_SINGLE_STEP); ++ p->thread.per_flags = 0; + /* Initialize per thread user and system timer values */ + ti = task_thread_info(p); + ti->user_timer = 0; +diff --git a/arch/s390/kernel/runtime_instr.c b/arch/s390/kernel/runtime_instr.c +index fffa0e5462af..70cdb03d4acd 100644 +--- a/arch/s390/kernel/runtime_instr.c ++++ b/arch/s390/kernel/runtime_instr.c +@@ -47,11 +47,13 @@ void exit_thread_runtime_instr(void) + { + struct task_struct *task = current; + ++ preempt_disable(); + if (!task->thread.ri_cb) + return; + disable_runtime_instr(); + kfree(task->thread.ri_cb); + task->thread.ri_cb = NULL; ++ preempt_enable(); + } + + SYSCALL_DEFINE1(s390_runtime_instr, int, command) +@@ -62,9 +64,7 @@ SYSCALL_DEFINE1(s390_runtime_instr, int, command) + return -EOPNOTSUPP; + + if (command == S390_RUNTIME_INSTR_STOP) { +- preempt_disable(); + exit_thread_runtime_instr(); +- preempt_enable(); + return 0; + } + +diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c +index 899c40f826dd..4e1b254c3695 100644 +--- a/arch/x86/kvm/svm.c ++++ b/arch/x86/kvm/svm.c +@@ -3114,6 +3114,13 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr) + u32 ecx = msr->index; + u64 data = msr->data; + switch (ecx) { ++ case MSR_IA32_CR_PAT: ++ if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data)) ++ return 1; ++ vcpu->arch.pat = data; ++ svm->vmcb->save.g_pat = data; ++ mark_dirty(svm->vmcb, VMCB_NPT); ++ break; + case MSR_IA32_TSC: + kvm_write_tsc(vcpu, msr); + break; +diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c +index 9114588e3e61..67ba0d8f87c7 100644 +--- a/arch/x86/kvm/vmx.c ++++ b/arch/x86/kvm/vmx.c +@@ -10394,6 +10394,8 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, + vmcs_writel(GUEST_SYSENTER_EIP, vmcs12->host_ia32_sysenter_eip); + vmcs_writel(GUEST_IDTR_BASE, vmcs12->host_idtr_base); + vmcs_writel(GUEST_GDTR_BASE, vmcs12->host_gdtr_base); ++ vmcs_write32(GUEST_IDTR_LIMIT, 0xFFFF); ++ vmcs_write32(GUEST_GDTR_LIMIT, 0xFFFF); + + /* If not VM_EXIT_CLEAR_BNDCFGS, the L2 value propagates to L1. */ + if (vmcs12->vm_exit_controls & VM_EXIT_CLEAR_BNDCFGS) +diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt +index d388de72eaca..ec039f2a0c13 100644 +--- a/arch/x86/lib/x86-opcode-map.txt ++++ b/arch/x86/lib/x86-opcode-map.txt +@@ -833,7 +833,7 @@ EndTable + + GrpTable: Grp3_1 + 0: TEST Eb,Ib +-1: ++1: TEST Eb,Ib + 2: NOT Eb + 3: NEG Eb + 4: MUL AL,Eb +diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c +index 91a9e6af2ec4..75cced210b2a 100644 +--- a/drivers/ata/libata-eh.c ++++ b/drivers/ata/libata-eh.c +@@ -2245,8 +2245,8 @@ static void ata_eh_link_autopsy(struct ata_link *link) + if (dev->flags & ATA_DFLAG_DUBIOUS_XFER) + eflags |= ATA_EFLAG_DUBIOUS_XFER; + ehc->i.action |= ata_eh_speed_down(dev, eflags, all_err_mask); ++ trace_ata_eh_link_autopsy(dev, ehc->i.action, all_err_mask); + } +- trace_ata_eh_link_autopsy(dev, ehc->i.action, all_err_mask); + DPRINTK("EXIT\n"); + } + +diff --git a/drivers/base/power/opp/core.c b/drivers/base/power/opp/core.c +index f8580900c273..db6e7e57081c 100644 +--- a/drivers/base/power/opp/core.c ++++ b/drivers/base/power/opp/core.c +@@ -1205,6 +1205,7 @@ static int _of_add_opp_table_v2(struct device *dev, struct device_node *opp_np) + if (ret) { + dev_err(dev, "%s: Failed to add OPP, %d\n", __func__, + ret); ++ of_node_put(np); + goto free_table; + } + } +diff --git a/drivers/clk/ti/clk-dra7-atl.c b/drivers/clk/ti/clk-dra7-atl.c +index 2e14dfb588f4..7d060ffe8975 100644 +--- a/drivers/clk/ti/clk-dra7-atl.c ++++ b/drivers/clk/ti/clk-dra7-atl.c +@@ -265,7 +265,7 @@ static int of_dra7_atl_clk_probe(struct platform_device *pdev) + + /* Get configuration for the ATL instances */ + snprintf(prop, sizeof(prop), "atl%u", i); +- cfg_node = of_find_node_by_name(node, prop); ++ cfg_node = of_get_child_by_name(node, prop); + if (cfg_node) { + ret = of_property_read_u32(cfg_node, "bws", + &cdesc->bws); +@@ -278,6 +278,7 @@ static int of_dra7_atl_clk_probe(struct platform_device *pdev) + atl_write(cinfo, DRA7_ATL_AWSMUX_REG(i), + cdesc->aws); + } ++ of_node_put(cfg_node); + } + + cdesc->probed = true; +diff --git a/drivers/dma/zx296702_dma.c b/drivers/dma/zx296702_dma.c +index 245d759d5ffc..6059d81e701a 100644 +--- a/drivers/dma/zx296702_dma.c ++++ b/drivers/dma/zx296702_dma.c +@@ -813,6 +813,7 @@ static int zx_dma_probe(struct platform_device *op) + INIT_LIST_HEAD(&d->slave.channels); + dma_cap_set(DMA_SLAVE, d->slave.cap_mask); + dma_cap_set(DMA_MEMCPY, d->slave.cap_mask); ++ dma_cap_set(DMA_CYCLIC, d->slave.cap_mask); + dma_cap_set(DMA_PRIVATE, d->slave.cap_mask); + d->slave.dev = &op->dev; + d->slave.device_free_chan_resources = zx_dma_free_chan_resources; +diff --git a/drivers/gpu/drm/armada/Makefile b/drivers/gpu/drm/armada/Makefile +index ffd673615772..26412d2f8c98 100644 +--- a/drivers/gpu/drm/armada/Makefile ++++ b/drivers/gpu/drm/armada/Makefile +@@ -4,3 +4,5 @@ armada-y += armada_510.o + armada-$(CONFIG_DEBUG_FS) += armada_debugfs.o + + obj-$(CONFIG_DRM_ARMADA) := armada.o ++ ++CFLAGS_armada_trace.o := -I$(src) +diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c +index 04de6fd88f8c..521b5bddb99c 100644 +--- a/drivers/gpu/drm/drm_mm.c ++++ b/drivers/gpu/drm/drm_mm.c +@@ -262,14 +262,12 @@ static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node, + + BUG_ON(!hole_node->hole_follows || node->allocated); + +- if (adj_start < start) +- adj_start = start; +- if (adj_end > end) +- adj_end = end; +- + if (mm->color_adjust) + mm->color_adjust(hole_node, color, &adj_start, &adj_end); + ++ adj_start = max(adj_start, start); ++ adj_end = min(adj_end, end); ++ + if (flags & DRM_MM_CREATE_TOP) + adj_start = adj_end - size; + +@@ -475,17 +473,15 @@ static struct drm_mm_node *drm_mm_search_free_in_range_generic(const struct drm_ + flags & DRM_MM_SEARCH_BELOW) { + u64 hole_size = adj_end - adj_start; + +- if (adj_start < start) +- adj_start = start; +- if (adj_end > end) +- adj_end = end; +- + if (mm->color_adjust) { + mm->color_adjust(entry, color, &adj_start, &adj_end); + if (adj_end <= adj_start) + continue; + } + ++ adj_start = max(adj_start, start); ++ adj_end = min(adj_end, end); ++ + if (!check_free_hole(adj_start, adj_end, size, alignment)) + continue; + +diff --git a/drivers/iio/light/cm3232.c b/drivers/iio/light/cm3232.c +index fe89b6823217..263e97235ea0 100644 +--- a/drivers/iio/light/cm3232.c ++++ b/drivers/iio/light/cm3232.c +@@ -119,7 +119,7 @@ static int cm3232_reg_init(struct cm3232_chip *chip) + if (ret < 0) + dev_err(&chip->client->dev, "Error writing reg_cmd\n"); + +- return 0; ++ return ret; + } + + /** +diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c +index e397f1b0af09..9a99cee2665a 100644 +--- a/drivers/infiniband/ulp/srp/ib_srp.c ++++ b/drivers/infiniband/ulp/srp/ib_srp.c +@@ -670,12 +670,19 @@ static void srp_path_rec_completion(int status, + static int srp_lookup_path(struct srp_rdma_ch *ch) + { + struct srp_target_port *target = ch->target; +- int ret; ++ int ret = -ENODEV; + + ch->path.numb_path = 1; + + init_completion(&ch->done); + ++ /* ++ * Avoid that the SCSI host can be removed by srp_remove_target() ++ * before srp_path_rec_completion() is called. ++ */ ++ if (!scsi_host_get(target->scsi_host)) ++ goto out; ++ + ch->path_query_id = ib_sa_path_rec_get(&srp_sa_client, + target->srp_host->srp_dev->dev, + target->srp_host->port, +@@ -689,18 +696,24 @@ static int srp_lookup_path(struct srp_rdma_ch *ch) + GFP_KERNEL, + srp_path_rec_completion, + ch, &ch->path_query); +- if (ch->path_query_id < 0) +- return ch->path_query_id; ++ ret = ch->path_query_id; ++ if (ret < 0) ++ goto put; + + ret = wait_for_completion_interruptible(&ch->done); + if (ret < 0) +- return ret; ++ goto put; + +- if (ch->status < 0) ++ ret = ch->status; ++ if (ret < 0) + shost_printk(KERN_WARNING, target->scsi_host, + PFX "Path record query failed\n"); + +- return ch->status; ++put: ++ scsi_host_put(target->scsi_host); ++ ++out: ++ return ret; + } + + static int srp_send_req(struct srp_rdma_ch *ch, bool multich) +diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c +index eaabf3125846..c52131233ba7 100644 +--- a/drivers/infiniband/ulp/srpt/ib_srpt.c ++++ b/drivers/infiniband/ulp/srpt/ib_srpt.c +@@ -3425,7 +3425,7 @@ static int srpt_parse_i_port_id(u8 i_port_id[16], const char *name) + { + const char *p; + unsigned len, count, leading_zero_bytes; +- int ret, rc; ++ int ret; + + p = name; + if (strncasecmp(p, "0x", 2) == 0) +@@ -3437,10 +3437,9 @@ static int srpt_parse_i_port_id(u8 i_port_id[16], const char *name) + count = min(len / 2, 16U); + leading_zero_bytes = 16 - count; + memset(i_port_id, 0, leading_zero_bytes); +- rc = hex2bin(i_port_id + leading_zero_bytes, p, count); +- if (rc < 0) +- pr_debug("hex2bin failed for srpt_parse_i_port_id: %d\n", rc); +- ret = 0; ++ ret = hex2bin(i_port_id + leading_zero_bytes, p, count); ++ if (ret < 0) ++ pr_debug("hex2bin failed for srpt_parse_i_port_id: %d\n", ret); + out: + return ret; + } +diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c +index 8eeab72b93e2..ea47980949ef 100644 +--- a/drivers/md/bcache/alloc.c ++++ b/drivers/md/bcache/alloc.c +@@ -406,7 +406,8 @@ long bch_bucket_alloc(struct cache *ca, unsigned reserve, bool wait) + + finish_wait(&ca->set->bucket_wait, &w); + out: +- wake_up_process(ca->alloc_thread); ++ if (ca->alloc_thread) ++ wake_up_process(ca->alloc_thread); + + trace_bcache_alloc(ca, reserve); + +diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c +index cdceefd0e57d..2ec7f90e3455 100644 +--- a/drivers/md/dm-bufio.c ++++ b/drivers/md/dm-bufio.c +@@ -928,7 +928,8 @@ static void __get_memory_limit(struct dm_bufio_client *c, + buffers = c->minimum_buffers; + + *limit_buffers = buffers; +- *threshold_buffers = buffers * DM_BUFIO_WRITEBACK_PERCENT / 100; ++ *threshold_buffers = mult_frac(buffers, ++ DM_BUFIO_WRITEBACK_PERCENT, 100); + } + + /* +@@ -1829,19 +1830,15 @@ static int __init dm_bufio_init(void) + memset(&dm_bufio_caches, 0, sizeof dm_bufio_caches); + memset(&dm_bufio_cache_names, 0, sizeof dm_bufio_cache_names); + +- mem = (__u64)((totalram_pages - totalhigh_pages) * +- DM_BUFIO_MEMORY_PERCENT / 100) << PAGE_SHIFT; ++ mem = (__u64)mult_frac(totalram_pages - totalhigh_pages, ++ DM_BUFIO_MEMORY_PERCENT, 100) << PAGE_SHIFT; + + if (mem > ULONG_MAX) + mem = ULONG_MAX; + + #ifdef CONFIG_MMU +- /* +- * Get the size of vmalloc space the same way as VMALLOC_TOTAL +- * in fs/proc/internal.h +- */ +- if (mem > (VMALLOC_END - VMALLOC_START) * DM_BUFIO_VMALLOC_PERCENT / 100) +- mem = (VMALLOC_END - VMALLOC_START) * DM_BUFIO_VMALLOC_PERCENT / 100; ++ if (mem > mult_frac(VMALLOC_TOTAL, DM_BUFIO_VMALLOC_PERCENT, 100)) ++ mem = mult_frac(VMALLOC_TOTAL, DM_BUFIO_VMALLOC_PERCENT, 100); + #endif + + dm_bufio_default_cache_size = mem; +diff --git a/drivers/md/dm.c b/drivers/md/dm.c +index 320eb3c4bb6b..9ec6948e3b8b 100644 +--- a/drivers/md/dm.c ++++ b/drivers/md/dm.c +@@ -3507,11 +3507,15 @@ struct mapped_device *dm_get_from_kobject(struct kobject *kobj) + + md = container_of(kobj, struct mapped_device, kobj_holder.kobj); + +- if (test_bit(DMF_FREEING, &md->flags) || +- dm_deleting_md(md)) +- return NULL; +- ++ spin_lock(&_minor_lock); ++ if (test_bit(DMF_FREEING, &md->flags) || dm_deleting_md(md)) { ++ md = NULL; ++ goto out; ++ } + dm_get(md); ++out: ++ spin_unlock(&_minor_lock); ++ + return md; + } + +diff --git a/drivers/media/rc/ir-lirc-codec.c b/drivers/media/rc/ir-lirc-codec.c +index efc21b1da211..ca107033e429 100644 +--- a/drivers/media/rc/ir-lirc-codec.c ++++ b/drivers/media/rc/ir-lirc-codec.c +@@ -286,11 +286,14 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd, + if (!dev->max_timeout) + return -ENOSYS; + ++ /* Check for multiply overflow */ ++ if (val > U32_MAX / 1000) ++ return -EINVAL; ++ + tmp = val * 1000; + +- if (tmp < dev->min_timeout || +- tmp > dev->max_timeout) +- return -EINVAL; ++ if (tmp < dev->min_timeout || tmp > dev->max_timeout) ++ return -EINVAL; + + dev->timeout = tmp; + break; +diff --git a/drivers/media/usb/as102/as102_fw.c b/drivers/media/usb/as102/as102_fw.c +index 07d08c49f4d4..b2e16bb67572 100644 +--- a/drivers/media/usb/as102/as102_fw.c ++++ b/drivers/media/usb/as102/as102_fw.c +@@ -101,18 +101,23 @@ static int as102_firmware_upload(struct as10x_bus_adapter_t *bus_adap, + unsigned char *cmd, + const struct firmware *firmware) { + +- struct as10x_fw_pkt_t fw_pkt; ++ struct as10x_fw_pkt_t *fw_pkt; + int total_read_bytes = 0, errno = 0; + unsigned char addr_has_changed = 0; + ++ fw_pkt = kmalloc(sizeof(*fw_pkt), GFP_KERNEL); ++ if (!fw_pkt) ++ return -ENOMEM; ++ ++ + for (total_read_bytes = 0; total_read_bytes < firmware->size; ) { + int read_bytes = 0, data_len = 0; + + /* parse intel hex line */ + read_bytes = parse_hex_line( + (u8 *) (firmware->data + total_read_bytes), +- fw_pkt.raw.address, +- fw_pkt.raw.data, ++ fw_pkt->raw.address, ++ fw_pkt->raw.data, + &data_len, + &addr_has_changed); + +@@ -122,28 +127,28 @@ static int as102_firmware_upload(struct as10x_bus_adapter_t *bus_adap, + /* detect the end of file */ + total_read_bytes += read_bytes; + if (total_read_bytes == firmware->size) { +- fw_pkt.u.request[0] = 0x00; +- fw_pkt.u.request[1] = 0x03; ++ fw_pkt->u.request[0] = 0x00; ++ fw_pkt->u.request[1] = 0x03; + + /* send EOF command */ + errno = bus_adap->ops->upload_fw_pkt(bus_adap, + (uint8_t *) +- &fw_pkt, 2, 0); ++ fw_pkt, 2, 0); + if (errno < 0) + goto error; + } else { + if (!addr_has_changed) { + /* prepare command to send */ +- fw_pkt.u.request[0] = 0x00; +- fw_pkt.u.request[1] = 0x01; ++ fw_pkt->u.request[0] = 0x00; ++ fw_pkt->u.request[1] = 0x01; + +- data_len += sizeof(fw_pkt.u.request); +- data_len += sizeof(fw_pkt.raw.address); ++ data_len += sizeof(fw_pkt->u.request); ++ data_len += sizeof(fw_pkt->raw.address); + + /* send cmd to device */ + errno = bus_adap->ops->upload_fw_pkt(bus_adap, + (uint8_t *) +- &fw_pkt, ++ fw_pkt, + data_len, + 0); + if (errno < 0) +@@ -152,6 +157,7 @@ static int as102_firmware_upload(struct as10x_bus_adapter_t *bus_adap, + } + } + error: ++ kfree(fw_pkt); + return (errno == 0) ? total_read_bytes : errno; + } + +diff --git a/drivers/media/usb/cx231xx/cx231xx-cards.c b/drivers/media/usb/cx231xx/cx231xx-cards.c +index 2c5f76d588ac..04ae21278440 100644 +--- a/drivers/media/usb/cx231xx/cx231xx-cards.c ++++ b/drivers/media/usb/cx231xx/cx231xx-cards.c +@@ -1672,7 +1672,7 @@ static int cx231xx_usb_probe(struct usb_interface *interface, + nr = dev->devno; + + assoc_desc = udev->actconfig->intf_assoc[0]; +- if (assoc_desc->bFirstInterface != ifnum) { ++ if (!assoc_desc || assoc_desc->bFirstInterface != ifnum) { + dev_err(d, "Not found matching IAD interface\n"); + retval = -ENODEV; + goto err_if; +diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c +index 4a1d9fdd14bb..523758e71fe6 100644 +--- a/drivers/media/v4l2-core/v4l2-ctrls.c ++++ b/drivers/media/v4l2-core/v4l2-ctrls.c +@@ -1200,6 +1200,16 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, + } + EXPORT_SYMBOL(v4l2_ctrl_fill); + ++static u32 user_flags(const struct v4l2_ctrl *ctrl) ++{ ++ u32 flags = ctrl->flags; ++ ++ if (ctrl->is_ptr) ++ flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD; ++ ++ return flags; ++} ++ + static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 changes) + { + memset(ev->reserved, 0, sizeof(ev->reserved)); +@@ -1207,7 +1217,7 @@ static void fill_event(struct v4l2_event *ev, struct v4l2_ctrl *ctrl, u32 change + ev->id = ctrl->id; + ev->u.ctrl.changes = changes; + ev->u.ctrl.type = ctrl->type; +- ev->u.ctrl.flags = ctrl->flags; ++ ev->u.ctrl.flags = user_flags(ctrl); + if (ctrl->is_ptr) + ev->u.ctrl.value64 = 0; + else +@@ -2536,10 +2546,8 @@ int v4l2_query_ext_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_query_ext_ctr + else + qc->id = ctrl->id; + strlcpy(qc->name, ctrl->name, sizeof(qc->name)); +- qc->flags = ctrl->flags; ++ qc->flags = user_flags(ctrl); + qc->type = ctrl->type; +- if (ctrl->is_ptr) +- qc->flags |= V4L2_CTRL_FLAG_HAS_PAYLOAD; + qc->elem_size = ctrl->elem_size; + qc->elems = ctrl->elems; + qc->nr_of_dims = ctrl->nr_of_dims; +diff --git a/drivers/net/ethernet/3com/typhoon.c b/drivers/net/ethernet/3com/typhoon.c +index 8f8418d2ac4a..a0012c3cb4f6 100644 +--- a/drivers/net/ethernet/3com/typhoon.c ++++ b/drivers/net/ethernet/3com/typhoon.c +@@ -2366,9 +2366,9 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + * 4) Get the hardware address. + * 5) Put the card to sleep. + */ +- if (typhoon_reset(ioaddr, WaitSleep) < 0) { ++ err = typhoon_reset(ioaddr, WaitSleep); ++ if (err < 0) { + err_msg = "could not reset 3XP"; +- err = -EIO; + goto error_out_dma; + } + +@@ -2382,24 +2382,25 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + typhoon_init_interface(tp); + typhoon_init_rings(tp); + +- if(typhoon_boot_3XP(tp, TYPHOON_STATUS_WAITING_FOR_HOST) < 0) { ++ err = typhoon_boot_3XP(tp, TYPHOON_STATUS_WAITING_FOR_HOST); ++ if (err < 0) { + err_msg = "cannot boot 3XP sleep image"; +- err = -EIO; + goto error_out_reset; + } + + INIT_COMMAND_WITH_RESPONSE(&xp_cmd, TYPHOON_CMD_READ_MAC_ADDRESS); +- if(typhoon_issue_command(tp, 1, &xp_cmd, 1, xp_resp) < 0) { ++ err = typhoon_issue_command(tp, 1, &xp_cmd, 1, xp_resp); ++ if (err < 0) { + err_msg = "cannot read MAC address"; +- err = -EIO; + goto error_out_reset; + } + + *(__be16 *)&dev->dev_addr[0] = htons(le16_to_cpu(xp_resp[0].parm1)); + *(__be32 *)&dev->dev_addr[2] = htonl(le32_to_cpu(xp_resp[0].parm2)); + +- if(!is_valid_ether_addr(dev->dev_addr)) { ++ if (!is_valid_ether_addr(dev->dev_addr)) { + err_msg = "Could not obtain valid ethernet address, aborting"; ++ err = -EIO; + goto error_out_reset; + } + +@@ -2407,7 +2408,8 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + * later when we print out the version reported. + */ + INIT_COMMAND_WITH_RESPONSE(&xp_cmd, TYPHOON_CMD_READ_VERSIONS); +- if(typhoon_issue_command(tp, 1, &xp_cmd, 3, xp_resp) < 0) { ++ err = typhoon_issue_command(tp, 1, &xp_cmd, 3, xp_resp); ++ if (err < 0) { + err_msg = "Could not get Sleep Image version"; + goto error_out_reset; + } +@@ -2424,9 +2426,9 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + if(xp_resp[0].numDesc != 0) + tp->capabilities |= TYPHOON_WAKEUP_NEEDS_RESET; + +- if(typhoon_sleep(tp, PCI_D3hot, 0) < 0) { ++ err = typhoon_sleep(tp, PCI_D3hot, 0); ++ if (err < 0) { + err_msg = "cannot put adapter to sleep"; +- err = -EIO; + goto error_out_reset; + } + +@@ -2449,7 +2451,8 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + dev->features = dev->hw_features | + NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_RXCSUM; + +- if(register_netdev(dev) < 0) { ++ err = register_netdev(dev); ++ if (err < 0) { + err_msg = "unable to register netdev"; + goto error_out_reset; + } +diff --git a/drivers/net/ethernet/intel/e1000e/mac.c b/drivers/net/ethernet/intel/e1000e/mac.c +index e59d7c283cd4..645ace74429e 100644 +--- a/drivers/net/ethernet/intel/e1000e/mac.c ++++ b/drivers/net/ethernet/intel/e1000e/mac.c +@@ -410,6 +410,9 @@ void e1000e_clear_hw_cntrs_base(struct e1000_hw *hw) + * Checks to see of the link status of the hardware has changed. If a + * change in link status has been detected, then we read the PHY registers + * to get the current speed/duplex if link exists. ++ * ++ * Returns a negative error code (-E1000_ERR_*) or 0 (link down) or 1 (link ++ * up). + **/ + s32 e1000e_check_for_copper_link(struct e1000_hw *hw) + { +@@ -423,7 +426,7 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw) + * Change or Rx Sequence Error interrupt. + */ + if (!mac->get_link_status) +- return 0; ++ return 1; + + /* First we want to see if the MII Status Register reports + * link. If so, then we want to get the current speed/duplex +@@ -461,10 +464,12 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw) + * different link partner. + */ + ret_val = e1000e_config_fc_after_link_up(hw); +- if (ret_val) ++ if (ret_val) { + e_dbg("Error configuring flow control\n"); ++ return ret_val; ++ } + +- return ret_val; ++ return 1; + } + + /** +diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c +index 80ec587d510e..5205f1ebe381 100644 +--- a/drivers/net/ethernet/intel/e1000e/netdev.c ++++ b/drivers/net/ethernet/intel/e1000e/netdev.c +@@ -5017,7 +5017,7 @@ static bool e1000e_has_link(struct e1000_adapter *adapter) + case e1000_media_type_copper: + if (hw->mac.get_link_status) { + ret_val = hw->mac.ops.check_for_link(hw); +- link_active = !hw->mac.get_link_status; ++ link_active = ret_val > 0; + } else { + link_active = true; + } +@@ -5035,7 +5035,7 @@ static bool e1000e_has_link(struct e1000_adapter *adapter) + break; + } + +- if ((ret_val == E1000_ERR_PHY) && (hw->phy.type == e1000_phy_igp_3) && ++ if ((ret_val == -E1000_ERR_PHY) && (hw->phy.type == e1000_phy_igp_3) && + (er32(CTRL) & E1000_PHY_CTRL_GBE_DISABLE)) { + /* See e1000_kmrn_lock_loss_workaround_ich8lan() */ + e_info("Gigabit has been disabled, downgrading speed\n"); +diff --git a/drivers/net/ethernet/intel/e1000e/phy.c b/drivers/net/ethernet/intel/e1000e/phy.c +index de13aeacae97..8e674a0988b0 100644 +--- a/drivers/net/ethernet/intel/e1000e/phy.c ++++ b/drivers/net/ethernet/intel/e1000e/phy.c +@@ -1744,6 +1744,7 @@ s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, + s32 ret_val = 0; + u16 i, phy_status; + ++ *success = false; + for (i = 0; i < iterations; i++) { + /* Some PHYs require the MII_BMSR register to be read + * twice due to the link bit being sticky. No harm doing +@@ -1763,16 +1764,16 @@ s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, + ret_val = e1e_rphy(hw, MII_BMSR, &phy_status); + if (ret_val) + break; +- if (phy_status & BMSR_LSTATUS) ++ if (phy_status & BMSR_LSTATUS) { ++ *success = true; + break; ++ } + if (usec_interval >= 1000) + msleep(usec_interval / 1000); + else + udelay(usec_interval); + } + +- *success = (i < iterations); +- + return ret_val; + } + +diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_main.c b/drivers/net/ethernet/intel/fm10k/fm10k_main.c +index 09281558bfbc..c21fa56afd7c 100644 +--- a/drivers/net/ethernet/intel/fm10k/fm10k_main.c ++++ b/drivers/net/ethernet/intel/fm10k/fm10k_main.c +@@ -1226,7 +1226,7 @@ static bool fm10k_clean_tx_irq(struct fm10k_q_vector *q_vector, + break; + + /* prevent any other reads prior to eop_desc */ +- read_barrier_depends(); ++ smp_rmb(); + + /* if DD is not set pending work has not been completed */ + if (!(eop_desc->flags & FM10K_TXD_FLAG_DONE)) +diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c +index 4edbab6ca7ef..b5b228c9a030 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -3595,7 +3595,7 @@ static bool i40e_clean_fdir_tx_irq(struct i40e_ring *tx_ring, int budget) + break; + + /* prevent any other reads prior to eop_desc */ +- read_barrier_depends(); ++ smp_rmb(); + + /* if the descriptor isn't done, no work yet to do */ + if (!(eop_desc->cmd_type_offset_bsz & +diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c +index 26c55bba4bf3..6dcc3854844d 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c +@@ -663,7 +663,7 @@ static bool i40e_clean_tx_irq(struct i40e_ring *tx_ring, int budget) + break; + + /* prevent any other reads prior to eop_desc */ +- read_barrier_depends(); ++ smp_rmb(); + + /* we have caught up to head, no work left to do */ + if (tx_head == tx_desc) +diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c +index 39db70a597ed..1ed27fcd5031 100644 +--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c ++++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c +@@ -172,7 +172,7 @@ static bool i40e_clean_tx_irq(struct i40e_ring *tx_ring, int budget) + break; + + /* prevent any other reads prior to eop_desc */ +- read_barrier_depends(); ++ smp_rmb(); + + /* we have caught up to head, no work left to do */ + if (tx_head == tx_desc) +diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c +index ff6e57d788eb..c55552c3d2f9 100644 +--- a/drivers/net/ethernet/intel/igb/igb_main.c ++++ b/drivers/net/ethernet/intel/igb/igb_main.c +@@ -6433,7 +6433,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector) + break; + + /* prevent any other reads prior to eop_desc */ +- read_barrier_depends(); ++ smp_rmb(); + + /* if DD is not set pending work has not been completed */ + if (!(eop_desc->wb.status & cpu_to_le32(E1000_TXD_STAT_DD))) +diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c +index 297af801f051..519b72c41888 100644 +--- a/drivers/net/ethernet/intel/igbvf/netdev.c ++++ b/drivers/net/ethernet/intel/igbvf/netdev.c +@@ -809,7 +809,7 @@ static bool igbvf_clean_tx_irq(struct igbvf_ring *tx_ring) + break; + + /* prevent any other reads prior to eop_desc */ +- read_barrier_depends(); ++ smp_rmb(); + + /* if DD is not set pending work has not been completed */ + if (!(eop_desc->wb.status & cpu_to_le32(E1000_TXD_STAT_DD))) +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +index 83645d8503d4..a5b443171b8b 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +@@ -1114,7 +1114,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, + break; + + /* prevent any other reads prior to eop_desc */ +- read_barrier_depends(); ++ smp_rmb(); + + /* if DD is not set pending work has not been completed */ + if (!(eop_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD))) +diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +index 592ff237d692..50bbad37d640 100644 +--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c ++++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +@@ -312,7 +312,7 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_q_vector *q_vector, + break; + + /* prevent any other reads prior to eop_desc */ +- read_barrier_depends(); ++ smp_rmb(); + + /* if DD is not set pending work has not been completed */ + if (!(eop_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD))) +diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c +index 05de75360fa4..ee638cb8b48f 100644 +--- a/drivers/net/wireless/ath/ath10k/core.c ++++ b/drivers/net/wireless/ath/ath10k/core.c +@@ -548,8 +548,11 @@ static int ath10k_core_get_board_id_from_otp(struct ath10k *ar) + "boot get otp board id result 0x%08x board_id %d chip_id %d\n", + result, board_id, chip_id); + +- if ((result & ATH10K_BMI_BOARD_ID_STATUS_MASK) != 0) ++ if ((result & ATH10K_BMI_BOARD_ID_STATUS_MASK) != 0 || ++ (board_id == 0)) { ++ ath10k_warn(ar, "board id is not exist in otp, ignore it\n"); + return -EOPNOTSUPP; ++ } + + ar->id.bmi_ids_valid = true; + ar->id.bmi_board_id = board_id; +diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c +index 6decf4a95ce1..bed8d89fe3a0 100644 +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -1127,6 +1127,36 @@ static int ath10k_monitor_recalc(struct ath10k *ar) + return ath10k_monitor_stop(ar); + } + ++static bool ath10k_mac_can_set_cts_prot(struct ath10k_vif *arvif) ++{ ++ struct ath10k *ar = arvif->ar; ++ ++ lockdep_assert_held(&ar->conf_mutex); ++ ++ if (!arvif->is_started) { ++ ath10k_dbg(ar, ATH10K_DBG_MAC, "defer cts setup, vdev is not ready yet\n"); ++ return false; ++ } ++ ++ return true; ++} ++ ++static int ath10k_mac_set_cts_prot(struct ath10k_vif *arvif) ++{ ++ struct ath10k *ar = arvif->ar; ++ u32 vdev_param; ++ ++ lockdep_assert_held(&ar->conf_mutex); ++ ++ vdev_param = ar->wmi.vdev_param->protection_mode; ++ ++ ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_protection %d\n", ++ arvif->vdev_id, arvif->use_cts_prot); ++ ++ return ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, ++ arvif->use_cts_prot ? 1 : 0); ++} ++ + static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif) + { + struct ath10k *ar = arvif->ar; +@@ -4180,7 +4210,8 @@ static int ath10k_mac_txpower_recalc(struct ath10k *ar) + lockdep_assert_held(&ar->conf_mutex); + + list_for_each_entry(arvif, &ar->arvifs, list) { +- WARN_ON(arvif->txpower < 0); ++ if (arvif->txpower <= 0) ++ continue; + + if (txpower == -1) + txpower = arvif->txpower; +@@ -4188,8 +4219,8 @@ static int ath10k_mac_txpower_recalc(struct ath10k *ar) + txpower = min(txpower, arvif->txpower); + } + +- if (WARN_ON(txpower == -1)) +- return -EINVAL; ++ if (txpower == -1) ++ return 0; + + ret = ath10k_mac_txpower_setup(ar, txpower); + if (ret) { +@@ -4787,20 +4818,18 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw, + + if (changed & BSS_CHANGED_ERP_CTS_PROT) { + arvif->use_cts_prot = info->use_cts_prot; +- ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vdev %d cts_prot %d\n", +- arvif->vdev_id, info->use_cts_prot); + + ret = ath10k_recalc_rtscts_prot(arvif); + if (ret) + ath10k_warn(ar, "failed to recalculate rts/cts prot for vdev %d: %d\n", + arvif->vdev_id, ret); + +- vdev_param = ar->wmi.vdev_param->protection_mode; +- ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param, +- info->use_cts_prot ? 1 : 0); +- if (ret) +- ath10k_warn(ar, "failed to set protection mode %d on vdev %i: %d\n", +- info->use_cts_prot, arvif->vdev_id, ret); ++ if (ath10k_mac_can_set_cts_prot(arvif)) { ++ ret = ath10k_mac_set_cts_prot(arvif); ++ if (ret) ++ ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n", ++ arvif->vdev_id, ret); ++ } + } + + if (changed & BSS_CHANGED_ERP_SLOT) { +@@ -6712,6 +6741,13 @@ ath10k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw, + arvif->is_up = true; + } + ++ if (ath10k_mac_can_set_cts_prot(arvif)) { ++ ret = ath10k_mac_set_cts_prot(arvif); ++ if (ret) ++ ath10k_warn(ar, "failed to set cts protection for vdev %d: %d\n", ++ arvif->vdev_id, ret); ++ } ++ + mutex_unlock(&ar->conf_mutex); + return 0; + +diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c +index 6fbd17b69469..02eea3c3b5d3 100644 +--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c ++++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c +@@ -1105,8 +1105,10 @@ static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar, + struct ath10k_fw_stats_pdev *dst; + + src = data; +- if (data_len < sizeof(*src)) ++ if (data_len < sizeof(*src)) { ++ kfree(tb); + return -EPROTO; ++ } + + data += sizeof(*src); + data_len -= sizeof(*src); +@@ -1126,8 +1128,10 @@ static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar, + struct ath10k_fw_stats_vdev *dst; + + src = data; +- if (data_len < sizeof(*src)) ++ if (data_len < sizeof(*src)) { ++ kfree(tb); + return -EPROTO; ++ } + + data += sizeof(*src); + data_len -= sizeof(*src); +@@ -1145,8 +1149,10 @@ static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar, + struct ath10k_fw_stats_peer *dst; + + src = data; +- if (data_len < sizeof(*src)) ++ if (data_len < sizeof(*src)) { ++ kfree(tb); + return -EPROTO; ++ } + + data += sizeof(*src); + data_len -= sizeof(*src); +diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c +index 0708eedd9671..1c69e8140d9d 100644 +--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c ++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c +@@ -664,7 +664,7 @@ void rtl92ee_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished) + struct rtl_priv *rtlpriv = rtl_priv(hw); + struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); + struct sk_buff *skb = NULL; +- ++ bool rtstatus; + u32 totalpacketlen; + u8 u1rsvdpageloc[5] = { 0 }; + bool b_dlok = false; +@@ -727,7 +727,9 @@ void rtl92ee_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished) + memcpy((u8 *)skb_put(skb, totalpacketlen), + &reserved_page_packet, totalpacketlen); + +- b_dlok = true; ++ rtstatus = rtl_cmd_send_packet(hw, skb); ++ if (rtstatus) ++ b_dlok = true; + + if (b_dlok) { + RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD , +diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c +index bbb789f8990b..738d541a2255 100644 +--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c ++++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c +@@ -1377,6 +1377,7 @@ static void _rtl8821ae_get_wakeup_reason(struct ieee80211_hw *hw) + + ppsc->wakeup_reason = 0; + ++ do_gettimeofday(&ts); + rtlhal->last_suspend_sec = ts.tv_sec; + + switch (fw_reason) { +diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c +index 96526dcfdd37..ff7b9632ad61 100644 +--- a/drivers/nvdimm/label.c ++++ b/drivers/nvdimm/label.c +@@ -823,7 +823,7 @@ static int init_labels(struct nd_mapping *nd_mapping, int num_labels) + nsindex = to_namespace_index(ndd, 0); + memset(nsindex, 0, ndd->nsarea.config_size); + for (i = 0; i < 2; i++) { +- int rc = nd_label_write_index(ndd, i, i*2, ND_NSINDEX_INIT); ++ int rc = nd_label_write_index(ndd, i, 3 - i, ND_NSINDEX_INIT); + + if (rc) + return rc; +diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c +index aae7379af4e4..c2184104b789 100644 +--- a/drivers/nvdimm/namespace_devs.c ++++ b/drivers/nvdimm/namespace_devs.c +@@ -1305,7 +1305,7 @@ static umode_t namespace_visible(struct kobject *kobj, + if (a == &dev_attr_resource.attr) { + if (is_namespace_blk(dev)) + return 0; +- return a->mode; ++ return 0400; + } + + if (is_namespace_pmem(dev) || is_namespace_blk(dev)) { +diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c +index b83df942794f..193ac13de49b 100644 +--- a/drivers/pci/probe.c ++++ b/drivers/pci/probe.c +@@ -1414,8 +1414,16 @@ static void program_hpp_type0(struct pci_dev *dev, struct hpp_type0 *hpp) + + static void program_hpp_type1(struct pci_dev *dev, struct hpp_type1 *hpp) + { +- if (hpp) +- dev_warn(&dev->dev, "PCI-X settings not supported\n"); ++ int pos; ++ ++ if (!hpp) ++ return; ++ ++ pos = pci_find_capability(dev, PCI_CAP_ID_PCIX); ++ if (!pos) ++ return; ++ ++ dev_warn(&dev->dev, "PCI-X settings not supported\n"); + } + + static bool pcie_root_rcb_set(struct pci_dev *dev) +@@ -1441,6 +1449,9 @@ static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp) + if (!hpp) + return; + ++ if (!pci_is_pcie(dev)) ++ return; ++ + if (hpp->revision > 1) { + dev_warn(&dev->dev, "PCIe settings rev %d not supported\n", + hpp->revision); +diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig +index 8b9c2a38d1cc..b0a24dedd1ed 100644 +--- a/drivers/spi/Kconfig ++++ b/drivers/spi/Kconfig +@@ -315,6 +315,7 @@ config SPI_FSL_SPI + config SPI_FSL_DSPI + tristate "Freescale DSPI controller" + select REGMAP_MMIO ++ depends on HAS_DMA + depends on SOC_VF610 || SOC_LS1021A || ARCH_LAYERSCAPE || COMPILE_TEST + help + This enables support for the Freescale DSPI controller in master +diff --git a/drivers/staging/iio/cdc/ad7150.c b/drivers/staging/iio/cdc/ad7150.c +index e8d0ff2d5c9b..808d6ebf6c94 100644 +--- a/drivers/staging/iio/cdc/ad7150.c ++++ b/drivers/staging/iio/cdc/ad7150.c +@@ -272,7 +272,7 @@ static int ad7150_write_event_config(struct iio_dev *indio_dev, + error_ret: + mutex_unlock(&chip->state_lock); + +- return 0; ++ return ret; + } + + static int ad7150_read_event_value(struct iio_dev *indio_dev, +diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c +index fd493412b172..bb73401f5761 100644 +--- a/drivers/target/iscsi/iscsi_target.c ++++ b/drivers/target/iscsi/iscsi_target.c +@@ -1923,12 +1923,14 @@ attach: + + if (!(hdr->opcode & ISCSI_OP_IMMEDIATE)) { + int cmdsn_ret = iscsit_sequence_cmd(conn, cmd, buf, hdr->cmdsn); +- if (cmdsn_ret == CMDSN_HIGHER_THAN_EXP) ++ if (cmdsn_ret == CMDSN_HIGHER_THAN_EXP) { + out_of_order_cmdsn = 1; +- else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) ++ } else if (cmdsn_ret == CMDSN_LOWER_THAN_EXP) { ++ target_put_sess_cmd(&cmd->se_cmd); + return 0; +- else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) ++ } else if (cmdsn_ret == CMDSN_ERROR_CANNOT_RECOVER) { + return -1; ++ } + } + iscsit_ack_from_expstatsn(conn, be32_to_cpu(hdr->exp_statsn)); + +diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c +index a42054edd427..37abf881ca75 100644 +--- a/drivers/target/target_core_transport.c ++++ b/drivers/target/target_core_transport.c +@@ -1970,6 +1970,8 @@ static void target_restart_delayed_cmds(struct se_device *dev) + list_del(&cmd->se_delayed_node); + spin_unlock(&dev->delayed_cmd_lock); + ++ cmd->transport_state |= CMD_T_SENT; ++ + __target_execute_cmd(cmd, true); + + if (cmd->sam_task_attr == TCM_ORDERED_TAG) +@@ -2007,6 +2009,8 @@ static void transport_complete_task_attr(struct se_cmd *cmd) + pr_debug("Incremented dev_cur_ordered_id: %u for ORDERED\n", + dev->dev_cur_ordered_id); + } ++ cmd->se_cmd_flags &= ~SCF_TASK_ATTR_SET; ++ + restart: + target_restart_delayed_cmds(dev); + } +diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c +index e4110d6de0b5..da6cc25baaef 100644 +--- a/drivers/vhost/scsi.c ++++ b/drivers/vhost/scsi.c +@@ -703,6 +703,7 @@ vhost_scsi_iov_to_sgl(struct vhost_scsi_cmd *cmd, bool write, + struct scatterlist *sg, int sg_count) + { + size_t off = iter->iov_offset; ++ struct scatterlist *p = sg; + int i, ret; + + for (i = 0; i < iter->nr_segs; i++) { +@@ -711,8 +712,8 @@ vhost_scsi_iov_to_sgl(struct vhost_scsi_cmd *cmd, bool write, + + ret = vhost_scsi_map_to_sgl(cmd, base, len, sg, write); + if (ret < 0) { +- for (i = 0; i < sg_count; i++) { +- struct page *page = sg_page(&sg[i]); ++ while (p < sg) { ++ struct page *page = sg_page(p++); + if (page) + put_page(page); + } +diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c +index 0e0eb10f82a0..816a0e08ef10 100644 +--- a/drivers/xen/xenbus/xenbus_dev_frontend.c ++++ b/drivers/xen/xenbus/xenbus_dev_frontend.c +@@ -316,7 +316,7 @@ static int xenbus_write_transaction(unsigned msg_type, + rc = -ENOMEM; + goto out; + } +- } else if (msg_type == XS_TRANSACTION_END) { ++ } else if (u->u.msg.tx_id != 0) { + list_for_each_entry(trans, &u->transactions, list) + if (trans->handle.id == u->u.msg.tx_id) + break; +diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c +index 511078586fa1..73f1d1b3a51c 100644 +--- a/fs/9p/vfs_inode.c ++++ b/fs/9p/vfs_inode.c +@@ -483,6 +483,9 @@ static int v9fs_test_inode(struct inode *inode, void *data) + + if (v9inode->qid.type != st->qid.type) + return 0; ++ ++ if (v9inode->qid.path != st->qid.path) ++ return 0; + return 1; + } + +diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c +index cb899af1babc..0b88744c6446 100644 +--- a/fs/9p/vfs_inode_dotl.c ++++ b/fs/9p/vfs_inode_dotl.c +@@ -87,6 +87,9 @@ static int v9fs_test_inode_dotl(struct inode *inode, void *data) + + if (v9inode->qid.type != st->qid.type) + return 0; ++ ++ if (v9inode->qid.path != st->qid.path) ++ return 0; + return 1; + } + +diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c +index 35b755e79c2d..fe6e7050fe50 100644 +--- a/fs/autofs4/waitq.c ++++ b/fs/autofs4/waitq.c +@@ -87,7 +87,8 @@ static int autofs4_write(struct autofs_sb_info *sbi, + spin_unlock_irqrestore(¤t->sighand->siglock, flags); + } + +- return (bytes > 0); ++ /* if 'wr' returned 0 (impossible) we assume -EIO (safe) */ ++ return bytes == 0 ? 0 : wr < 0 ? wr : -EIO; + } + + static void autofs4_notify_daemon(struct autofs_sb_info *sbi, +@@ -101,6 +102,7 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi, + } pkt; + struct file *pipe = NULL; + size_t pktsz; ++ int ret; + + DPRINTK("wait id = 0x%08lx, name = %.*s, type=%d", + (unsigned long) wq->wait_queue_token, wq->name.len, wq->name.name, type); +@@ -173,7 +175,18 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi, + mutex_unlock(&sbi->wq_mutex); + + if (autofs4_write(sbi, pipe, &pkt, pktsz)) ++ switch (ret = autofs4_write(sbi, pipe, &pkt, pktsz)) { ++ case 0: ++ break; ++ case -ENOMEM: ++ case -ERESTARTSYS: ++ /* Just fail this one */ ++ autofs4_wait_release(sbi, wq->wait_queue_token, ret); ++ break; ++ default: + autofs4_catatonic_mode(sbi); ++ break; ++ } + fput(pipe); + } + +diff --git a/fs/btrfs/uuid-tree.c b/fs/btrfs/uuid-tree.c +index 778282944530..837a9a8d579e 100644 +--- a/fs/btrfs/uuid-tree.c ++++ b/fs/btrfs/uuid-tree.c +@@ -348,7 +348,5 @@ skip: + + out: + btrfs_free_path(path); +- if (ret) +- btrfs_warn(fs_info, "btrfs_uuid_tree_iterate failed %d", ret); +- return 0; ++ return ret; + } +diff --git a/fs/ecryptfs/messaging.c b/fs/ecryptfs/messaging.c +index 286f10b0363b..4f457d5c4933 100644 +--- a/fs/ecryptfs/messaging.c ++++ b/fs/ecryptfs/messaging.c +@@ -442,15 +442,16 @@ void ecryptfs_release_messaging(void) + } + if (ecryptfs_daemon_hash) { + struct ecryptfs_daemon *daemon; ++ struct hlist_node *n; + int i; + + mutex_lock(&ecryptfs_daemon_hash_mux); + for (i = 0; i < (1 << ecryptfs_hash_bits); i++) { + int rc; + +- hlist_for_each_entry(daemon, +- &ecryptfs_daemon_hash[i], +- euid_chain) { ++ hlist_for_each_entry_safe(daemon, n, ++ &ecryptfs_daemon_hash[i], ++ euid_chain) { + rc = ecryptfs_exorcise_daemon(daemon); + if (rc) + printk(KERN_ERR "%s: Error whilst " +diff --git a/fs/ext4/crypto_key.c b/fs/ext4/crypto_key.c +index 9a1bc638abce..9308fe4b66e6 100644 +--- a/fs/ext4/crypto_key.c ++++ b/fs/ext4/crypto_key.c +@@ -129,11 +129,9 @@ int ext4_get_encryption_info(struct inode *inode) + if (ei->i_crypt_info) + return 0; + +- if (!ext4_read_workqueue) { +- res = ext4_init_crypto(); +- if (res) +- return res; +- } ++ res = ext4_init_crypto(); ++ if (res) ++ return res; + + res = ext4_xattr_get(inode, EXT4_XATTR_INDEX_ENCRYPTION, + EXT4_XATTR_NAME_ENCRYPTION_CONTEXT, +diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c +index 61d5bfc7318c..31a3e480d484 100644 +--- a/fs/ext4/extents.c ++++ b/fs/ext4/extents.c +@@ -4818,7 +4818,8 @@ static long ext4_zero_range(struct file *file, loff_t offset, + } + + if (!(mode & FALLOC_FL_KEEP_SIZE) && +- offset + len > i_size_read(inode)) { ++ (offset + len > i_size_read(inode) || ++ offset + len > EXT4_I(inode)->i_disksize)) { + new_size = offset + len; + ret = inode_newsize_ok(inode, new_size); + if (ret) +@@ -4994,7 +4995,8 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) + } + + if (!(mode & FALLOC_FL_KEEP_SIZE) && +- offset + len > i_size_read(inode)) { ++ (offset + len > i_size_read(inode) || ++ offset + len > EXT4_I(inode)->i_disksize)) { + new_size = offset + len; + ret = inode_newsize_ok(inode, new_size); + if (ret) +diff --git a/fs/isofs/isofs.h b/fs/isofs/isofs.h +index 0ac4c1f73fbd..25177e6bd603 100644 +--- a/fs/isofs/isofs.h ++++ b/fs/isofs/isofs.h +@@ -103,7 +103,7 @@ static inline unsigned int isonum_733(char *p) + /* Ignore bigendian datum due to broken mastering programs */ + return get_unaligned_le32(p); + } +-extern int iso_date(char *, int); ++extern int iso_date(u8 *, int); + + struct inode; /* To make gcc happy */ + +diff --git a/fs/isofs/rock.h b/fs/isofs/rock.h +index ed09e2b08637..f835976ce033 100644 +--- a/fs/isofs/rock.h ++++ b/fs/isofs/rock.h +@@ -65,7 +65,7 @@ struct RR_PL_s { + }; + + struct stamp { +- char time[7]; ++ __u8 time[7]; /* actually 6 unsigned, 1 signed */ + } __attribute__ ((packed)); + + struct RR_TF_s { +diff --git a/fs/isofs/util.c b/fs/isofs/util.c +index 005a15cfd30a..37860fea364d 100644 +--- a/fs/isofs/util.c ++++ b/fs/isofs/util.c +@@ -15,7 +15,7 @@ + * to GMT. Thus we should always be correct. + */ + +-int iso_date(char * p, int flag) ++int iso_date(u8 *p, int flag) + { + int year, month, day, hour, minute, second, tz; + int crtime; +diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c +index 8e425f2c5ddd..6fef53f18dcf 100644 +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -242,15 +242,12 @@ const u32 nfs4_fsinfo_bitmap[3] = { FATTR4_WORD0_MAXFILESIZE + }; + + const u32 nfs4_fs_locations_bitmap[3] = { +- FATTR4_WORD0_TYPE +- | FATTR4_WORD0_CHANGE ++ FATTR4_WORD0_CHANGE + | FATTR4_WORD0_SIZE + | FATTR4_WORD0_FSID + | FATTR4_WORD0_FILEID + | FATTR4_WORD0_FS_LOCATIONS, +- FATTR4_WORD1_MODE +- | FATTR4_WORD1_NUMLINKS +- | FATTR4_WORD1_OWNER ++ FATTR4_WORD1_OWNER + | FATTR4_WORD1_OWNER_GROUP + | FATTR4_WORD1_RAWDEV + | FATTR4_WORD1_SPACE_USED +@@ -6351,9 +6348,7 @@ static int _nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir, + struct page *page) + { + struct nfs_server *server = NFS_SERVER(dir); +- u32 bitmask[3] = { +- [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS, +- }; ++ u32 bitmask[3]; + struct nfs4_fs_locations_arg args = { + .dir_fh = NFS_FH(dir), + .name = name, +@@ -6372,12 +6367,15 @@ static int _nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir, + + dprintk("%s: start\n", __func__); + ++ bitmask[0] = nfs4_fattr_bitmap[0] | FATTR4_WORD0_FS_LOCATIONS; ++ bitmask[1] = nfs4_fattr_bitmap[1]; ++ + /* Ask for the fileid of the absent filesystem if mounted_on_fileid + * is not supported */ + if (NFS_SERVER(dir)->attr_bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID) +- bitmask[1] |= FATTR4_WORD1_MOUNTED_ON_FILEID; ++ bitmask[0] &= ~FATTR4_WORD0_FILEID; + else +- bitmask[0] |= FATTR4_WORD0_FILEID; ++ bitmask[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID; + + nfs_fattr_init(&fs_locations->fattr); + fs_locations->server = server; +diff --git a/fs/nfs/super.c b/fs/nfs/super.c +index f1268280244e..3149f7e58d6f 100644 +--- a/fs/nfs/super.c ++++ b/fs/nfs/super.c +@@ -1322,7 +1322,7 @@ static int nfs_parse_mount_options(char *raw, + mnt->options |= NFS_OPTION_MIGRATION; + break; + case Opt_nomigration: +- mnt->options &= NFS_OPTION_MIGRATION; ++ mnt->options &= ~NFS_OPTION_MIGRATION; + break; + + /* +diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c +index ca9ebc3242d3..421935f3d909 100644 +--- a/fs/nfsd/nfs4state.c ++++ b/fs/nfsd/nfs4state.c +@@ -3829,7 +3829,8 @@ static struct nfs4_delegation *find_deleg_stateid(struct nfs4_client *cl, statei + { + struct nfs4_stid *ret; + +- ret = find_stateid_by_type(cl, s, NFS4_DELEG_STID); ++ ret = find_stateid_by_type(cl, s, ++ NFS4_DELEG_STID|NFS4_REVOKED_DELEG_STID); + if (!ret) + return NULL; + return delegstateid(ret); +@@ -3852,6 +3853,12 @@ nfs4_check_deleg(struct nfs4_client *cl, struct nfsd4_open *open, + deleg = find_deleg_stateid(cl, &open->op_delegate_stateid); + if (deleg == NULL) + goto out; ++ if (deleg->dl_stid.sc_type == NFS4_REVOKED_DELEG_STID) { ++ nfs4_put_stid(&deleg->dl_stid); ++ if (cl->cl_minorversion) ++ status = nfserr_deleg_revoked; ++ goto out; ++ } + flags = share_access_to_flags(open->op_share_access); + status = nfs4_check_delegmode(deleg, flags); + if (status) { +@@ -4696,6 +4703,16 @@ nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate, + struct nfs4_stid **s, struct nfsd_net *nn) + { + __be32 status; ++ bool return_revoked = false; ++ ++ /* ++ * only return revoked delegations if explicitly asked. ++ * otherwise we report revoked or bad_stateid status. ++ */ ++ if (typemask & NFS4_REVOKED_DELEG_STID) ++ return_revoked = true; ++ else if (typemask & NFS4_DELEG_STID) ++ typemask |= NFS4_REVOKED_DELEG_STID; + + if (ZERO_STATEID(stateid) || ONE_STATEID(stateid)) + return nfserr_bad_stateid; +@@ -4710,6 +4727,12 @@ nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate, + *s = find_stateid_by_type(cstate->clp, stateid, typemask); + if (!*s) + return nfserr_bad_stateid; ++ if (((*s)->sc_type == NFS4_REVOKED_DELEG_STID) && !return_revoked) { ++ nfs4_put_stid(*s); ++ if (cstate->minorversion) ++ return nfserr_deleg_revoked; ++ return nfserr_bad_stateid; ++ } + return nfs_ok; + } + +diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c +index 2f27c935bd57..34c22fe4eca0 100644 +--- a/fs/nilfs2/segment.c ++++ b/fs/nilfs2/segment.c +@@ -1945,8 +1945,6 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, + "failed to get inode block.\n"); + return err; + } +- mark_buffer_dirty(ibh); +- nilfs_mdt_mark_dirty(ifile); + spin_lock(&nilfs->ns_inode_lock); + if (likely(!ii->i_bh)) + ii->i_bh = ibh; +@@ -1955,6 +1953,10 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, + goto retry; + } + ++ // Always redirty the buffer to avoid race condition ++ mark_buffer_dirty(ii->i_bh); ++ nilfs_mdt_mark_dirty(ifile); ++ + clear_bit(NILFS_I_QUEUED, &ii->i_state); + set_bit(NILFS_I_BUSY, &ii->i_state); + list_move_tail(&ii->i_dirty, &sci->sc_dirty_files); +diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h +index 5664ca07c9c7..a01a076ea060 100644 +--- a/include/trace/events/sunrpc.h ++++ b/include/trace/events/sunrpc.h +@@ -455,20 +455,22 @@ TRACE_EVENT(svc_recv, + TP_ARGS(rqst, status), + + TP_STRUCT__entry( +- __field(struct sockaddr *, addr) + __field(__be32, xid) + __field(int, status) + __field(unsigned long, flags) ++ __dynamic_array(unsigned char, addr, rqst->rq_addrlen) + ), + + TP_fast_assign( +- __entry->addr = (struct sockaddr *)&rqst->rq_addr; + __entry->xid = status > 0 ? rqst->rq_xid : 0; + __entry->status = status; + __entry->flags = rqst->rq_flags; ++ memcpy(__get_dynamic_array(addr), ++ &rqst->rq_addr, rqst->rq_addrlen); + ), + +- TP_printk("addr=%pIScp xid=0x%x status=%d flags=%s", __entry->addr, ++ TP_printk("addr=%pIScp xid=0x%x status=%d flags=%s", ++ (struct sockaddr *)__get_dynamic_array(addr), + be32_to_cpu(__entry->xid), __entry->status, + show_rqstp_flags(__entry->flags)) + ); +@@ -480,22 +482,23 @@ DECLARE_EVENT_CLASS(svc_rqst_status, + TP_ARGS(rqst, status), + + TP_STRUCT__entry( +- __field(struct sockaddr *, addr) + __field(__be32, xid) +- __field(int, dropme) + __field(int, status) + __field(unsigned long, flags) ++ __dynamic_array(unsigned char, addr, rqst->rq_addrlen) + ), + + TP_fast_assign( +- __entry->addr = (struct sockaddr *)&rqst->rq_addr; + __entry->xid = rqst->rq_xid; + __entry->status = status; + __entry->flags = rqst->rq_flags; ++ memcpy(__get_dynamic_array(addr), ++ &rqst->rq_addr, rqst->rq_addrlen); + ), + + TP_printk("addr=%pIScp rq_xid=0x%x status=%d flags=%s", +- __entry->addr, be32_to_cpu(__entry->xid), ++ (struct sockaddr *)__get_dynamic_array(addr), ++ be32_to_cpu(__entry->xid), + __entry->status, show_rqstp_flags(__entry->flags)) + ); + +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index b5d372083624..15874a85ebcf 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -600,8 +600,7 @@ void resched_cpu(int cpu) + struct rq *rq = cpu_rq(cpu); + unsigned long flags; + +- if (!raw_spin_trylock_irqsave(&rq->lock, flags)) +- return; ++ raw_spin_lock_irqsave(&rq->lock, flags); + resched_curr(rq); + raw_spin_unlock_irqrestore(&rq->lock, flags); + } +@@ -5908,6 +5907,12 @@ static int init_rootdomain(struct root_domain *rd) + if (!zalloc_cpumask_var(&rd->rto_mask, GFP_KERNEL)) + goto free_dlo_mask; + ++#ifdef HAVE_RT_PUSH_IPI ++ rd->rto_cpu = -1; ++ raw_spin_lock_init(&rd->rto_lock); ++ init_irq_work(&rd->rto_push_work, rto_push_irq_work_func); ++#endif ++ + init_dl_bw(&rd->dl_bw); + if (cpudl_init(&rd->cpudl) != 0) + goto free_dlo_mask; +diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c +index 78ae5c1d9412..faa75afcb7fe 100644 +--- a/kernel/sched/rt.c ++++ b/kernel/sched/rt.c +@@ -64,10 +64,6 @@ static void start_rt_bandwidth(struct rt_bandwidth *rt_b) + raw_spin_unlock(&rt_b->rt_runtime_lock); + } + +-#if defined(CONFIG_SMP) && defined(HAVE_RT_PUSH_IPI) +-static void push_irq_work_func(struct irq_work *work); +-#endif +- + void init_rt_rq(struct rt_rq *rt_rq) + { + struct rt_prio_array *array; +@@ -87,13 +83,6 @@ void init_rt_rq(struct rt_rq *rt_rq) + rt_rq->rt_nr_migratory = 0; + rt_rq->overloaded = 0; + plist_head_init(&rt_rq->pushable_tasks); +- +-#ifdef HAVE_RT_PUSH_IPI +- rt_rq->push_flags = 0; +- rt_rq->push_cpu = nr_cpu_ids; +- raw_spin_lock_init(&rt_rq->push_lock); +- init_irq_work(&rt_rq->push_work, push_irq_work_func); +-#endif + #endif /* CONFIG_SMP */ + /* We start is dequeued state, because no RT tasks are queued */ + rt_rq->rt_queued = 0; +@@ -1802,160 +1791,166 @@ static void push_rt_tasks(struct rq *rq) + } + + #ifdef HAVE_RT_PUSH_IPI ++ + /* +- * The search for the next cpu always starts at rq->cpu and ends +- * when we reach rq->cpu again. It will never return rq->cpu. +- * This returns the next cpu to check, or nr_cpu_ids if the loop +- * is complete. ++ * When a high priority task schedules out from a CPU and a lower priority ++ * task is scheduled in, a check is made to see if there's any RT tasks ++ * on other CPUs that are waiting to run because a higher priority RT task ++ * is currently running on its CPU. In this case, the CPU with multiple RT ++ * tasks queued on it (overloaded) needs to be notified that a CPU has opened ++ * up that may be able to run one of its non-running queued RT tasks. ++ * ++ * All CPUs with overloaded RT tasks need to be notified as there is currently ++ * no way to know which of these CPUs have the highest priority task waiting ++ * to run. Instead of trying to take a spinlock on each of these CPUs, ++ * which has shown to cause large latency when done on machines with many ++ * CPUs, sending an IPI to the CPUs to have them push off the overloaded ++ * RT tasks waiting to run. ++ * ++ * Just sending an IPI to each of the CPUs is also an issue, as on large ++ * count CPU machines, this can cause an IPI storm on a CPU, especially ++ * if its the only CPU with multiple RT tasks queued, and a large number ++ * of CPUs scheduling a lower priority task at the same time. ++ * ++ * Each root domain has its own irq work function that can iterate over ++ * all CPUs with RT overloaded tasks. Since all CPUs with overloaded RT ++ * tassk must be checked if there's one or many CPUs that are lowering ++ * their priority, there's a single irq work iterator that will try to ++ * push off RT tasks that are waiting to run. ++ * ++ * When a CPU schedules a lower priority task, it will kick off the ++ * irq work iterator that will jump to each CPU with overloaded RT tasks. ++ * As it only takes the first CPU that schedules a lower priority task ++ * to start the process, the rto_start variable is incremented and if ++ * the atomic result is one, then that CPU will try to take the rto_lock. ++ * This prevents high contention on the lock as the process handles all ++ * CPUs scheduling lower priority tasks. ++ * ++ * All CPUs that are scheduling a lower priority task will increment the ++ * rt_loop_next variable. This will make sure that the irq work iterator ++ * checks all RT overloaded CPUs whenever a CPU schedules a new lower ++ * priority task, even if the iterator is in the middle of a scan. Incrementing ++ * the rt_loop_next will cause the iterator to perform another scan. + * +- * rq->rt.push_cpu holds the last cpu returned by this function, +- * or if this is the first instance, it must hold rq->cpu. + */ + static int rto_next_cpu(struct rq *rq) + { +- int prev_cpu = rq->rt.push_cpu; ++ struct root_domain *rd = rq->rd; ++ int next; + int cpu; + +- cpu = cpumask_next(prev_cpu, rq->rd->rto_mask); +- + /* +- * If the previous cpu is less than the rq's CPU, then it already +- * passed the end of the mask, and has started from the beginning. +- * We end if the next CPU is greater or equal to rq's CPU. ++ * When starting the IPI RT pushing, the rto_cpu is set to -1, ++ * rt_next_cpu() will simply return the first CPU found in ++ * the rto_mask. ++ * ++ * If rto_next_cpu() is called with rto_cpu is a valid cpu, it ++ * will return the next CPU found in the rto_mask. ++ * ++ * If there are no more CPUs left in the rto_mask, then a check is made ++ * against rto_loop and rto_loop_next. rto_loop is only updated with ++ * the rto_lock held, but any CPU may increment the rto_loop_next ++ * without any locking. + */ +- if (prev_cpu < rq->cpu) { +- if (cpu >= rq->cpu) +- return nr_cpu_ids; ++ for (;;) { + +- } else if (cpu >= nr_cpu_ids) { +- /* +- * We passed the end of the mask, start at the beginning. +- * If the result is greater or equal to the rq's CPU, then +- * the loop is finished. +- */ +- cpu = cpumask_first(rq->rd->rto_mask); +- if (cpu >= rq->cpu) +- return nr_cpu_ids; +- } +- rq->rt.push_cpu = cpu; ++ /* When rto_cpu is -1 this acts like cpumask_first() */ ++ cpu = cpumask_next(rd->rto_cpu, rd->rto_mask); + +- /* Return cpu to let the caller know if the loop is finished or not */ +- return cpu; +-} ++ rd->rto_cpu = cpu; + +-static int find_next_push_cpu(struct rq *rq) +-{ +- struct rq *next_rq; +- int cpu; ++ if (cpu < nr_cpu_ids) ++ return cpu; + +- while (1) { +- cpu = rto_next_cpu(rq); +- if (cpu >= nr_cpu_ids) +- break; +- next_rq = cpu_rq(cpu); ++ rd->rto_cpu = -1; + +- /* Make sure the next rq can push to this rq */ +- if (next_rq->rt.highest_prio.next < rq->rt.highest_prio.curr) ++ /* ++ * ACQUIRE ensures we see the @rto_mask changes ++ * made prior to the @next value observed. ++ * ++ * Matches WMB in rt_set_overload(). ++ */ ++ next = atomic_read_acquire(&rd->rto_loop_next); ++ ++ if (rd->rto_loop == next) + break; ++ ++ rd->rto_loop = next; + } + +- return cpu; ++ return -1; ++} ++ ++static inline bool rto_start_trylock(atomic_t *v) ++{ ++ return !atomic_cmpxchg_acquire(v, 0, 1); + } + +-#define RT_PUSH_IPI_EXECUTING 1 +-#define RT_PUSH_IPI_RESTART 2 ++static inline void rto_start_unlock(atomic_t *v) ++{ ++ atomic_set_release(v, 0); ++} + + static void tell_cpu_to_push(struct rq *rq) + { +- int cpu; ++ int cpu = -1; + +- if (rq->rt.push_flags & RT_PUSH_IPI_EXECUTING) { +- raw_spin_lock(&rq->rt.push_lock); +- /* Make sure it's still executing */ +- if (rq->rt.push_flags & RT_PUSH_IPI_EXECUTING) { +- /* +- * Tell the IPI to restart the loop as things have +- * changed since it started. +- */ +- rq->rt.push_flags |= RT_PUSH_IPI_RESTART; +- raw_spin_unlock(&rq->rt.push_lock); +- return; +- } +- raw_spin_unlock(&rq->rt.push_lock); +- } ++ /* Keep the loop going if the IPI is currently active */ ++ atomic_inc(&rq->rd->rto_loop_next); + +- /* When here, there's no IPI going around */ +- +- rq->rt.push_cpu = rq->cpu; +- cpu = find_next_push_cpu(rq); +- if (cpu >= nr_cpu_ids) ++ /* Only one CPU can initiate a loop at a time */ ++ if (!rto_start_trylock(&rq->rd->rto_loop_start)) + return; + +- rq->rt.push_flags = RT_PUSH_IPI_EXECUTING; ++ raw_spin_lock(&rq->rd->rto_lock); ++ ++ /* ++ * The rto_cpu is updated under the lock, if it has a valid cpu ++ * then the IPI is still running and will continue due to the ++ * update to loop_next, and nothing needs to be done here. ++ * Otherwise it is finishing up and an ipi needs to be sent. ++ */ ++ if (rq->rd->rto_cpu < 0) ++ cpu = rto_next_cpu(rq); ++ ++ raw_spin_unlock(&rq->rd->rto_lock); + +- irq_work_queue_on(&rq->rt.push_work, cpu); ++ rto_start_unlock(&rq->rd->rto_loop_start); ++ ++ if (cpu >= 0) ++ irq_work_queue_on(&rq->rd->rto_push_work, cpu); + } + + /* Called from hardirq context */ +-static void try_to_push_tasks(void *arg) ++void rto_push_irq_work_func(struct irq_work *work) + { +- struct rt_rq *rt_rq = arg; +- struct rq *rq, *src_rq; +- int this_cpu; ++ struct rq *rq; + int cpu; + +- this_cpu = rt_rq->push_cpu; ++ rq = this_rq(); + +- /* Paranoid check */ +- BUG_ON(this_cpu != smp_processor_id()); +- +- rq = cpu_rq(this_cpu); +- src_rq = rq_of_rt_rq(rt_rq); +- +-again: ++ /* ++ * We do not need to grab the lock to check for has_pushable_tasks. ++ * When it gets updated, a check is made if a push is possible. ++ */ + if (has_pushable_tasks(rq)) { + raw_spin_lock(&rq->lock); +- push_rt_task(rq); ++ push_rt_tasks(rq); + raw_spin_unlock(&rq->lock); + } + +- /* Pass the IPI to the next rt overloaded queue */ +- raw_spin_lock(&rt_rq->push_lock); +- /* +- * If the source queue changed since the IPI went out, +- * we need to restart the search from that CPU again. +- */ +- if (rt_rq->push_flags & RT_PUSH_IPI_RESTART) { +- rt_rq->push_flags &= ~RT_PUSH_IPI_RESTART; +- rt_rq->push_cpu = src_rq->cpu; +- } ++ raw_spin_lock(&rq->rd->rto_lock); + +- cpu = find_next_push_cpu(src_rq); ++ /* Pass the IPI to the next rt overloaded queue */ ++ cpu = rto_next_cpu(rq); + +- if (cpu >= nr_cpu_ids) +- rt_rq->push_flags &= ~RT_PUSH_IPI_EXECUTING; +- raw_spin_unlock(&rt_rq->push_lock); ++ raw_spin_unlock(&rq->rd->rto_lock); + +- if (cpu >= nr_cpu_ids) ++ if (cpu < 0) + return; + +- /* +- * It is possible that a restart caused this CPU to be +- * chosen again. Don't bother with an IPI, just see if we +- * have more to push. +- */ +- if (unlikely(cpu == rq->cpu)) +- goto again; +- + /* Try the next RT overloaded CPU */ +- irq_work_queue_on(&rt_rq->push_work, cpu); +-} +- +-static void push_irq_work_func(struct irq_work *work) +-{ +- struct rt_rq *rt_rq = container_of(work, struct rt_rq, push_work); +- +- try_to_push_tasks(rt_rq); ++ irq_work_queue_on(&rq->rd->rto_push_work, cpu); + } + #endif /* HAVE_RT_PUSH_IPI */ + +diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h +index 55d92a1ca070..448a8266ceea 100644 +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -429,7 +429,7 @@ static inline int rt_bandwidth_enabled(void) + } + + /* RT IPI pull logic requires IRQ_WORK */ +-#ifdef CONFIG_IRQ_WORK ++#if defined(CONFIG_IRQ_WORK) && defined(CONFIG_SMP) + # define HAVE_RT_PUSH_IPI + #endif + +@@ -450,12 +450,6 @@ struct rt_rq { + unsigned long rt_nr_total; + int overloaded; + struct plist_head pushable_tasks; +-#ifdef HAVE_RT_PUSH_IPI +- int push_flags; +- int push_cpu; +- struct irq_work push_work; +- raw_spinlock_t push_lock; +-#endif + #endif /* CONFIG_SMP */ + int rt_queued; + +@@ -537,6 +531,19 @@ struct root_domain { + struct dl_bw dl_bw; + struct cpudl cpudl; + ++#ifdef HAVE_RT_PUSH_IPI ++ /* ++ * For IPI pull requests, loop across the rto_mask. ++ */ ++ struct irq_work rto_push_work; ++ raw_spinlock_t rto_lock; ++ /* These are only updated and read within rto_lock */ ++ int rto_loop; ++ int rto_cpu; ++ /* These atomics are updated outside of a lock */ ++ atomic_t rto_loop_next; ++ atomic_t rto_loop_start; ++#endif + /* + * The "RT overload" flag: it gets set if a CPU has more than + * one runnable RT task. +@@ -547,6 +554,9 @@ struct root_domain { + + extern struct root_domain def_root_domain; + ++#ifdef HAVE_RT_PUSH_IPI ++extern void rto_push_irq_work_func(struct irq_work *work); ++#endif + #endif /* CONFIG_SMP */ + + /* +diff --git a/lib/mpi/mpi-pow.c b/lib/mpi/mpi-pow.c +index e24388a863a7..468fb7cd1221 100644 +--- a/lib/mpi/mpi-pow.c ++++ b/lib/mpi/mpi-pow.c +@@ -26,6 +26,7 @@ + * however I decided to publish this code under the plain GPL. + */ + ++#include + #include + #include "mpi-internal.h" + #include "longlong.h" +@@ -256,6 +257,7 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod) + } + e <<= 1; + c--; ++ cond_resched(); + } + + i--; +diff --git a/net/9p/client.c b/net/9p/client.c +index f5feac4ff4ec..3ff26eb1ea20 100644 +--- a/net/9p/client.c ++++ b/net/9p/client.c +@@ -749,8 +749,7 @@ p9_client_rpc(struct p9_client *c, int8_t type, const char *fmt, ...) + } + again: + /* Wait for the response */ +- err = wait_event_interruptible(*req->wq, +- req->status >= REQ_STATUS_RCVD); ++ err = wait_event_killable(*req->wq, req->status >= REQ_STATUS_RCVD); + + /* + * Make sure our req is coherent with regard to updates in other +diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c +index 6e70ddb158b4..2ddeecca5b12 100644 +--- a/net/9p/trans_virtio.c ++++ b/net/9p/trans_virtio.c +@@ -290,8 +290,8 @@ req_retry: + if (err == -ENOSPC) { + chan->ring_bufs_avail = 0; + spin_unlock_irqrestore(&chan->lock, flags); +- err = wait_event_interruptible(*chan->vc_wq, +- chan->ring_bufs_avail); ++ err = wait_event_killable(*chan->vc_wq, ++ chan->ring_bufs_avail); + if (err == -ERESTARTSYS) + return err; + +@@ -331,7 +331,7 @@ static int p9_get_mapped_pages(struct virtio_chan *chan, + * Other zc request to finish here + */ + if (atomic_read(&vp_pinned) >= chan->p9_max_pages) { +- err = wait_event_interruptible(vp_wq, ++ err = wait_event_killable(vp_wq, + (atomic_read(&vp_pinned) < chan->p9_max_pages)); + if (err == -ERESTARTSYS) + return err; +@@ -475,8 +475,8 @@ req_retry_pinned: + if (err == -ENOSPC) { + chan->ring_bufs_avail = 0; + spin_unlock_irqrestore(&chan->lock, flags); +- err = wait_event_interruptible(*chan->vc_wq, +- chan->ring_bufs_avail); ++ err = wait_event_killable(*chan->vc_wq, ++ chan->ring_bufs_avail); + if (err == -ERESTARTSYS) + goto err_out; + +@@ -493,8 +493,7 @@ req_retry_pinned: + virtqueue_kick(chan->vq); + spin_unlock_irqrestore(&chan->lock, flags); + p9_debug(P9_DEBUG_TRANS, "virtio request kicked\n"); +- err = wait_event_interruptible(*req->wq, +- req->status >= REQ_STATUS_RCVD); ++ err = wait_event_killable(*req->wq, req->status >= REQ_STATUS_RCVD); + /* + * Non kernel buffers are pinned, unpin them + */ +diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c +index f300d1cbfa91..097a1243c16c 100644 +--- a/net/ipv4/ip_sockglue.c ++++ b/net/ipv4/ip_sockglue.c +@@ -808,6 +808,7 @@ static int do_ip_setsockopt(struct sock *sk, int level, + { + struct ip_mreqn mreq; + struct net_device *dev = NULL; ++ int midx; + + if (sk->sk_type == SOCK_STREAM) + goto e_inval; +@@ -852,11 +853,15 @@ static int do_ip_setsockopt(struct sock *sk, int level, + err = -EADDRNOTAVAIL; + if (!dev) + break; ++ ++ midx = l3mdev_master_ifindex(dev); ++ + dev_put(dev); + + err = -EINVAL; + if (sk->sk_bound_dev_if && +- mreq.imr_ifindex != sk->sk_bound_dev_if) ++ mreq.imr_ifindex != sk->sk_bound_dev_if && ++ (!midx || midx != sk->sk_bound_dev_if)) + break; + + inet->mc_index = mreq.imr_ifindex; +diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c +index 4449ad1f8114..a4a30d2ca66f 100644 +--- a/net/ipv6/ipv6_sockglue.c ++++ b/net/ipv6/ipv6_sockglue.c +@@ -583,16 +583,24 @@ done: + + if (val) { + struct net_device *dev; ++ int midx; + +- if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != val) +- goto e_inval; ++ rcu_read_lock(); + +- dev = dev_get_by_index(net, val); ++ dev = dev_get_by_index_rcu(net, val); + if (!dev) { ++ rcu_read_unlock(); + retv = -ENODEV; + break; + } +- dev_put(dev); ++ midx = l3mdev_master_ifindex_rcu(dev); ++ ++ rcu_read_unlock(); ++ ++ if (sk->sk_bound_dev_if && ++ sk->sk_bound_dev_if != val && ++ (!midx || midx != sk->sk_bound_dev_if)) ++ goto e_inval; + } + np->mcast_oif = val; + retv = 0; +diff --git a/net/ipv6/route.c b/net/ipv6/route.c +index 48917437550e..7336a7311038 100644 +--- a/net/ipv6/route.c ++++ b/net/ipv6/route.c +@@ -3378,7 +3378,11 @@ static int ip6_route_dev_notify(struct notifier_block *this, + net->ipv6.ip6_blk_hole_entry->dst.dev = dev; + net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev); + #endif +- } else if (event == NETDEV_UNREGISTER) { ++ } else if (event == NETDEV_UNREGISTER && ++ dev->reg_state != NETREG_UNREGISTERED) { ++ /* NETDEV_UNREGISTER could be fired for multiple times by ++ * netdev_wait_allrefs(). Make sure we only call this once. ++ */ + in6_dev_put(net->ipv6.ip6_null_entry->rt6i_idev); + #ifdef CONFIG_IPV6_MULTIPLE_TABLES + in6_dev_put(net->ipv6.ip6_prohibit_entry->rt6i_idev); +diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h +index 6837a46ca4a2..7b271f3ded6b 100644 +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -682,7 +682,6 @@ struct ieee80211_if_mesh { + const struct ieee80211_mesh_sync_ops *sync_ops; + s64 sync_offset_clockdrift_max; + spinlock_t sync_offset_lock; +- bool adjusting_tbtt; + /* mesh power save */ + enum nl80211_mesh_power_mode nonpeer_pm; + int ps_peers_light_sleep; +diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c +index 9063e8e736ad..9e1ded80a992 100644 +--- a/net/mac80211/mesh.c ++++ b/net/mac80211/mesh.c +@@ -295,8 +295,6 @@ int mesh_add_meshconf_ie(struct ieee80211_sub_if_data *sdata, + /* Mesh PS mode. See IEEE802.11-2012 8.4.2.100.8 */ + *pos |= ifmsh->ps_peers_deep_sleep ? + IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL : 0x00; +- *pos++ |= ifmsh->adjusting_tbtt ? +- IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING : 0x00; + *pos++ = 0x00; + + return 0; +@@ -866,7 +864,6 @@ int ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata) + ifmsh->mesh_cc_id = 0; /* Disabled */ + /* register sync ops from extensible synchronization framework */ + ifmsh->sync_ops = ieee80211_mesh_sync_ops_get(ifmsh->mesh_sp_id); +- ifmsh->adjusting_tbtt = false; + ifmsh->sync_offset_clockdrift_max = 0; + set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags); + ieee80211_mesh_root_setup(ifmsh); +diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c +index bd3d55eb21d4..9f02e54ad2a5 100644 +--- a/net/mac80211/mesh_plink.c ++++ b/net/mac80211/mesh_plink.c +@@ -495,12 +495,14 @@ mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *addr, + + /* Userspace handles station allocation */ + if (sdata->u.mesh.user_mpm || +- sdata->u.mesh.security & IEEE80211_MESH_SEC_AUTHED) +- cfg80211_notify_new_peer_candidate(sdata->dev, addr, +- elems->ie_start, +- elems->total_len, +- GFP_KERNEL); +- else ++ sdata->u.mesh.security & IEEE80211_MESH_SEC_AUTHED) { ++ if (mesh_peer_accepts_plinks(elems) && ++ mesh_plink_availables(sdata)) ++ cfg80211_notify_new_peer_candidate(sdata->dev, addr, ++ elems->ie_start, ++ elems->total_len, ++ GFP_KERNEL); ++ } else + sta = __mesh_sta_info_alloc(sdata, addr); + + return sta; +diff --git a/net/mac80211/mesh_sync.c b/net/mac80211/mesh_sync.c +index 64bc22ad9496..16ed43fe4841 100644 +--- a/net/mac80211/mesh_sync.c ++++ b/net/mac80211/mesh_sync.c +@@ -119,7 +119,6 @@ static void mesh_sync_offset_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, + */ + + if (elems->mesh_config && mesh_peer_tbtt_adjusting(elems)) { +- clear_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN); + msync_dbg(sdata, "STA %pM : is adjusting TBTT\n", + sta->sta.addr); + goto no_sync; +@@ -168,11 +167,9 @@ static void mesh_sync_offset_adjust_tbtt(struct ieee80211_sub_if_data *sdata, + struct beacon_data *beacon) + { + struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; +- u8 cap; + + WARN_ON(ifmsh->mesh_sp_id != IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET); + WARN_ON(!rcu_read_lock_held()); +- cap = beacon->meshconf->meshconf_cap; + + spin_lock_bh(&ifmsh->sync_offset_lock); + +@@ -186,21 +183,13 @@ static void mesh_sync_offset_adjust_tbtt(struct ieee80211_sub_if_data *sdata, + "TBTT : kicking off TBTT adjustment with clockdrift_max=%lld\n", + ifmsh->sync_offset_clockdrift_max); + set_bit(MESH_WORK_DRIFT_ADJUST, &ifmsh->wrkq_flags); +- +- ifmsh->adjusting_tbtt = true; + } else { + msync_dbg(sdata, + "TBTT : max clockdrift=%lld; too small to adjust\n", + (long long)ifmsh->sync_offset_clockdrift_max); + ifmsh->sync_offset_clockdrift_max = 0; +- +- ifmsh->adjusting_tbtt = false; + } + spin_unlock_bh(&ifmsh->sync_offset_lock); +- +- beacon->meshconf->meshconf_cap = ifmsh->adjusting_tbtt ? +- IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING | cap : +- ~IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING & cap; + } + + static const struct sync_method sync_methods[] = { +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index 2cb429d34c03..120e9ae04db3 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -1996,7 +1996,7 @@ static void nf_tables_rule_destroy(const struct nft_ctx *ctx, + * is called on error from nf_tables_newrule(). + */ + expr = nft_expr_first(rule); +- while (expr->ops && expr != nft_expr_last(rule)) { ++ while (expr != nft_expr_last(rule) && expr->ops) { + nf_tables_expr_destroy(ctx, expr); + expr = nft_expr_next(expr); + } +diff --git a/net/netfilter/nft_queue.c b/net/netfilter/nft_queue.c +index 61d216eb7917..5d189c11d208 100644 +--- a/net/netfilter/nft_queue.c ++++ b/net/netfilter/nft_queue.c +@@ -37,7 +37,7 @@ static void nft_queue_eval(const struct nft_expr *expr, + + if (priv->queues_total > 1) { + if (priv->flags & NFT_QUEUE_FLAG_CPU_FANOUT) { +- int cpu = smp_processor_id(); ++ int cpu = raw_smp_processor_id(); + + queue = priv->queuenum + cpu % priv->queues_total; + } else { +diff --git a/net/nfc/core.c b/net/nfc/core.c +index c5a2c7e733b3..1471e4b0aa2c 100644 +--- a/net/nfc/core.c ++++ b/net/nfc/core.c +@@ -1093,7 +1093,7 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops, + err_free_dev: + kfree(dev); + +- return ERR_PTR(rc); ++ return NULL; + } + EXPORT_SYMBOL(nfc_allocate_device); + +diff --git a/net/rds/send.c b/net/rds/send.c +index 6815f03324d7..1a3c6acdd3f8 100644 +--- a/net/rds/send.c ++++ b/net/rds/send.c +@@ -959,6 +959,11 @@ static int rds_cmsg_send(struct rds_sock *rs, struct rds_message *rm, + ret = rds_cmsg_rdma_map(rs, rm, cmsg); + if (!ret) + *allocated_mr = 1; ++ else if (ret == -ENODEV) ++ /* Accommodate the get_mr() case which can fail ++ * if connection isn't established yet. ++ */ ++ ret = -EAGAIN; + break; + case RDS_CMSG_ATOMIC_CSWP: + case RDS_CMSG_ATOMIC_FADD: +@@ -1072,8 +1077,12 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len) + + /* Parse any control messages the user may have included. */ + ret = rds_cmsg_send(rs, rm, msg, &allocated_mr); +- if (ret) ++ if (ret) { ++ /* Trigger connection so that its ready for the next retry */ ++ if (ret == -EAGAIN) ++ rds_conn_connect_if_down(conn); + goto out; ++ } + + if (rm->rdma.op_active && !conn->c_trans->xmit_rdma) { + printk_ratelimited(KERN_NOTICE "rdma_op %p conn xmit_rdma %p\n", +diff --git a/net/sctp/socket.c b/net/sctp/socket.c +index 272edd7748a0..7f0f689b8d2b 100644 +--- a/net/sctp/socket.c ++++ b/net/sctp/socket.c +@@ -4453,10 +4453,6 @@ int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp) + struct socket *sock; + int err = 0; + +- /* Do not peel off from one netns to another one. */ +- if (!net_eq(current->nsproxy->net_ns, sock_net(sk))) +- return -EINVAL; +- + /* Do not peel off from one netns to another one. */ + if (!net_eq(current->nsproxy->net_ns, sock_net(sk))) + return -EINVAL; +diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c +index 9b5bd6d142dc..60324f7c72bd 100644 +--- a/net/vmw_vsock/af_vsock.c ++++ b/net/vmw_vsock/af_vsock.c +@@ -1209,10 +1209,14 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, + + if (signal_pending(current)) { + err = sock_intr_errno(timeout); +- goto out_wait_error; ++ sk->sk_state = SS_UNCONNECTED; ++ sock->state = SS_UNCONNECTED; ++ goto out_wait; + } else if (timeout == 0) { + err = -ETIMEDOUT; +- goto out_wait_error; ++ sk->sk_state = SS_UNCONNECTED; ++ sock->state = SS_UNCONNECTED; ++ goto out_wait; + } + + prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); +@@ -1220,20 +1224,17 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, + + if (sk->sk_err) { + err = -sk->sk_err; +- goto out_wait_error; +- } else ++ sk->sk_state = SS_UNCONNECTED; ++ sock->state = SS_UNCONNECTED; ++ } else { + err = 0; ++ } + + out_wait: + finish_wait(sk_sleep(sk), &wait); + out: + release_sock(sk); + return err; +- +-out_wait_error: +- sk->sk_state = SS_UNCONNECTED; +- sock->state = SS_UNCONNECTED; +- goto out_wait; + } + + static int vsock_accept(struct socket *sock, struct socket *newsock, int flags) +@@ -1270,18 +1271,20 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags) + listener->sk_err == 0) { + release_sock(listener); + timeout = schedule_timeout(timeout); ++ finish_wait(sk_sleep(listener), &wait); + lock_sock(listener); + + if (signal_pending(current)) { + err = sock_intr_errno(timeout); +- goto out_wait; ++ goto out; + } else if (timeout == 0) { + err = -EAGAIN; +- goto out_wait; ++ goto out; + } + + prepare_to_wait(sk_sleep(listener), &wait, TASK_INTERRUPTIBLE); + } ++ finish_wait(sk_sleep(listener), &wait); + + if (listener->sk_err) + err = -listener->sk_err; +@@ -1301,19 +1304,15 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags) + */ + if (err) { + vconnected->rejected = true; +- release_sock(connected); +- sock_put(connected); +- goto out_wait; ++ } else { ++ newsock->state = SS_CONNECTED; ++ sock_graft(connected, newsock); + } + +- newsock->state = SS_CONNECTED; +- sock_graft(connected, newsock); + release_sock(connected); + sock_put(connected); + } + +-out_wait: +- finish_wait(sk_sleep(listener), &wait); + out: + release_sock(listener); + return err; +@@ -1513,8 +1512,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg, + long timeout; + int err; + struct vsock_transport_send_notify_data send_data; +- +- DEFINE_WAIT(wait); ++ DEFINE_WAIT_FUNC(wait, woken_wake_function); + + sk = sock->sk; + vsk = vsock_sk(sk); +@@ -1557,11 +1555,10 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg, + if (err < 0) + goto out; + +- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); +- + while (total_written < len) { + ssize_t written; + ++ add_wait_queue(sk_sleep(sk), &wait); + while (vsock_stream_has_space(vsk) == 0 && + sk->sk_err == 0 && + !(sk->sk_shutdown & SEND_SHUTDOWN) && +@@ -1570,27 +1567,30 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg, + /* Don't wait for non-blocking sockets. */ + if (timeout == 0) { + err = -EAGAIN; +- goto out_wait; ++ remove_wait_queue(sk_sleep(sk), &wait); ++ goto out_err; + } + + err = transport->notify_send_pre_block(vsk, &send_data); +- if (err < 0) +- goto out_wait; ++ if (err < 0) { ++ remove_wait_queue(sk_sleep(sk), &wait); ++ goto out_err; ++ } + + release_sock(sk); +- timeout = schedule_timeout(timeout); ++ timeout = wait_woken(&wait, TASK_INTERRUPTIBLE, timeout); + lock_sock(sk); + if (signal_pending(current)) { + err = sock_intr_errno(timeout); +- goto out_wait; ++ remove_wait_queue(sk_sleep(sk), &wait); ++ goto out_err; + } else if (timeout == 0) { + err = -EAGAIN; +- goto out_wait; ++ remove_wait_queue(sk_sleep(sk), &wait); ++ goto out_err; + } +- +- prepare_to_wait(sk_sleep(sk), &wait, +- TASK_INTERRUPTIBLE); + } ++ remove_wait_queue(sk_sleep(sk), &wait); + + /* These checks occur both as part of and after the loop + * conditional since we need to check before and after +@@ -1598,16 +1598,16 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg, + */ + if (sk->sk_err) { + err = -sk->sk_err; +- goto out_wait; ++ goto out_err; + } else if ((sk->sk_shutdown & SEND_SHUTDOWN) || + (vsk->peer_shutdown & RCV_SHUTDOWN)) { + err = -EPIPE; +- goto out_wait; ++ goto out_err; + } + + err = transport->notify_send_pre_enqueue(vsk, &send_data); + if (err < 0) +- goto out_wait; ++ goto out_err; + + /* Note that enqueue will only write as many bytes as are free + * in the produce queue, so we don't need to ensure len is +@@ -1620,7 +1620,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg, + len - total_written); + if (written < 0) { + err = -ENOMEM; +- goto out_wait; ++ goto out_err; + } + + total_written += written; +@@ -1628,14 +1628,13 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg, + err = transport->notify_send_post_enqueue( + vsk, written, &send_data); + if (err < 0) +- goto out_wait; ++ goto out_err; + + } + +-out_wait: ++out_err: + if (total_written > 0) + err = total_written; +- finish_wait(sk_sleep(sk), &wait); + out: + release_sock(sk); + return err; +@@ -1716,21 +1715,61 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, + if (err < 0) + goto out; + +- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); + + while (1) { +- s64 ready = vsock_stream_has_data(vsk); ++ s64 ready; + +- if (ready < 0) { +- /* Invalid queue pair content. XXX This should be +- * changed to a connection reset in a later change. +- */ ++ prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); ++ ready = vsock_stream_has_data(vsk); + +- err = -ENOMEM; +- goto out_wait; +- } else if (ready > 0) { ++ if (ready == 0) { ++ if (sk->sk_err != 0 || ++ (sk->sk_shutdown & RCV_SHUTDOWN) || ++ (vsk->peer_shutdown & SEND_SHUTDOWN)) { ++ finish_wait(sk_sleep(sk), &wait); ++ break; ++ } ++ /* Don't wait for non-blocking sockets. */ ++ if (timeout == 0) { ++ err = -EAGAIN; ++ finish_wait(sk_sleep(sk), &wait); ++ break; ++ } ++ ++ err = transport->notify_recv_pre_block( ++ vsk, target, &recv_data); ++ if (err < 0) { ++ finish_wait(sk_sleep(sk), &wait); ++ break; ++ } ++ release_sock(sk); ++ timeout = schedule_timeout(timeout); ++ lock_sock(sk); ++ ++ if (signal_pending(current)) { ++ err = sock_intr_errno(timeout); ++ finish_wait(sk_sleep(sk), &wait); ++ break; ++ } else if (timeout == 0) { ++ err = -EAGAIN; ++ finish_wait(sk_sleep(sk), &wait); ++ break; ++ } ++ } else { + ssize_t read; + ++ finish_wait(sk_sleep(sk), &wait); ++ ++ if (ready < 0) { ++ /* Invalid queue pair content. XXX This should ++ * be changed to a connection reset in a later ++ * change. ++ */ ++ ++ err = -ENOMEM; ++ goto out; ++ } ++ + err = transport->notify_recv_pre_dequeue( + vsk, target, &recv_data); + if (err < 0) +@@ -1750,42 +1789,12 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, + vsk, target, read, + !(flags & MSG_PEEK), &recv_data); + if (err < 0) +- goto out_wait; ++ goto out; + + if (read >= target || flags & MSG_PEEK) + break; + + target -= read; +- } else { +- if (sk->sk_err != 0 || (sk->sk_shutdown & RCV_SHUTDOWN) +- || (vsk->peer_shutdown & SEND_SHUTDOWN)) { +- break; +- } +- /* Don't wait for non-blocking sockets. */ +- if (timeout == 0) { +- err = -EAGAIN; +- break; +- } +- +- err = transport->notify_recv_pre_block( +- vsk, target, &recv_data); +- if (err < 0) +- break; +- +- release_sock(sk); +- timeout = schedule_timeout(timeout); +- lock_sock(sk); +- +- if (signal_pending(current)) { +- err = sock_intr_errno(timeout); +- break; +- } else if (timeout == 0) { +- err = -EAGAIN; +- break; +- } +- +- prepare_to_wait(sk_sleep(sk), &wait, +- TASK_INTERRUPTIBLE); + } + } + +@@ -1797,8 +1806,6 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, + if (copied > 0) + err = copied; + +-out_wait: +- finish_wait(sk_sleep(sk), &wait); + out: + release_sock(sk); + return err; +diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c +index 0aca39762ed0..cd20f91326fe 100644 +--- a/sound/core/pcm_lib.c ++++ b/sound/core/pcm_lib.c +@@ -264,8 +264,10 @@ static void update_audio_tstamp(struct snd_pcm_substream *substream, + runtime->rate); + *audio_tstamp = ns_to_timespec(audio_nsecs); + } +- runtime->status->audio_tstamp = *audio_tstamp; +- runtime->status->tstamp = *curr_tstamp; ++ if (!timespec_equal(&runtime->status->audio_tstamp, audio_tstamp)) { ++ runtime->status->audio_tstamp = *audio_tstamp; ++ runtime->status->tstamp = *curr_tstamp; ++ } + + /* + * re-take a driver timestamp to let apps detect if the reference tstamp +diff --git a/sound/core/timer_compat.c b/sound/core/timer_compat.c +index 0b4b028e8e98..de9155eed727 100644 +--- a/sound/core/timer_compat.c ++++ b/sound/core/timer_compat.c +@@ -40,11 +40,11 @@ static int snd_timer_user_info_compat(struct file *file, + struct snd_timer *t; + + tu = file->private_data; +- if (snd_BUG_ON(!tu->timeri)) +- return -ENXIO; ++ if (!tu->timeri) ++ return -EBADFD; + t = tu->timeri->timer; +- if (snd_BUG_ON(!t)) +- return -ENXIO; ++ if (!t) ++ return -EBADFD; + memset(&info, 0, sizeof(info)); + info.card = t->card ? t->card->number : -1; + if (t->hw.flags & SNDRV_TIMER_HW_SLAVE) +@@ -73,8 +73,8 @@ static int snd_timer_user_status_compat(struct file *file, + struct snd_timer_status32 status; + + tu = file->private_data; +- if (snd_BUG_ON(!tu->timeri)) +- return -ENXIO; ++ if (!tu->timeri) ++ return -EBADFD; + memset(&status, 0, sizeof(status)); + status.tstamp.tv_sec = tu->tstamp.tv_sec; + status.tstamp.tv_nsec = tu->tstamp.tv_nsec; +diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c +index e6de496bffbe..e2e08fc73b50 100644 +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -2316,6 +2316,9 @@ static const struct pci_device_id azx_ids[] = { + /* AMD Hudson */ + { PCI_DEVICE(0x1022, 0x780d), + .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB }, ++ /* AMD Raven */ ++ { PCI_DEVICE(0x1022, 0x15e3), ++ .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB }, + /* ATI HDMI */ + { PCI_DEVICE(0x1002, 0x0002), + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index af0962307b7f..e5730a7d0480 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -4404,7 +4404,7 @@ static void alc_no_shutup(struct hda_codec *codec) + static void alc_fixup_no_shutup(struct hda_codec *codec, + const struct hda_fixup *fix, int action) + { +- if (action == HDA_FIXUP_ACT_PRE_PROBE) { ++ if (action == HDA_FIXUP_ACT_PROBE) { + struct alc_spec *spec = codec->spec; + spec->shutup = alc_no_shutup; + } +@@ -6254,7 +6254,7 @@ static int patch_alc269(struct hda_codec *codec) + case 0x10ec0703: + spec->codec_variant = ALC269_TYPE_ALC700; + spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */ +- alc_update_coef_idx(codec, 0x4a, 0, 1 << 15); /* Combo jack auto trigger control */ ++ alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */ + break; + + } +diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c +index 0bb415a28723..f1f990b325ad 100644 +--- a/sound/soc/codecs/wm_adsp.c ++++ b/sound/soc/codecs/wm_adsp.c +@@ -1060,7 +1060,7 @@ static int wm_adsp_load(struct wm_adsp *dsp) + const struct wmfw_region *region; + const struct wm_adsp_region *mem; + const char *region_name; +- char *file, *text; ++ char *file, *text = NULL; + struct wm_adsp_buf *buf; + unsigned int reg; + int regions = 0; +@@ -1221,10 +1221,21 @@ static int wm_adsp_load(struct wm_adsp *dsp) + regions, le32_to_cpu(region->len), offset, + region_name); + ++ if ((pos + le32_to_cpu(region->len) + sizeof(*region)) > ++ firmware->size) { ++ adsp_err(dsp, ++ "%s.%d: %s region len %d bytes exceeds file length %zu\n", ++ file, regions, region_name, ++ le32_to_cpu(region->len), firmware->size); ++ ret = -EINVAL; ++ goto out_fw; ++ } ++ + if (text) { + memcpy(text, region->data, le32_to_cpu(region->len)); + adsp_info(dsp, "%s: %s\n", file, text); + kfree(text); ++ text = NULL; + } + + if (reg) { +@@ -1269,6 +1280,7 @@ out_fw: + regmap_async_complete(regmap); + wm_adsp_buf_free(&buf_list); + release_firmware(firmware); ++ kfree(text); + out: + kfree(file); + +@@ -1730,6 +1742,17 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp) + } + + if (reg) { ++ if ((pos + le32_to_cpu(blk->len) + sizeof(*blk)) > ++ firmware->size) { ++ adsp_err(dsp, ++ "%s.%d: %s region len %d bytes exceeds file length %zu\n", ++ file, blocks, region_name, ++ le32_to_cpu(blk->len), ++ firmware->size); ++ ret = -EINVAL; ++ goto out_fw; ++ } ++ + buf = wm_adsp_buf_alloc(blk->data, + le32_to_cpu(blk->len), + &buf_list); +diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c +index 362446c36c9e..e00dfbec22c5 100644 +--- a/sound/soc/sh/rcar/core.c ++++ b/sound/soc/sh/rcar/core.c +@@ -1049,10 +1049,8 @@ static int __rsnd_kctrl_new(struct rsnd_mod *mod, + return -ENOMEM; + + ret = snd_ctl_add(card, kctrl); +- if (ret < 0) { +- snd_ctl_free_one(kctrl); ++ if (ret < 0) + return ret; +- } + + cfg->update = update; + cfg->card = card; +diff --git a/sound/usb/clock.c b/sound/usb/clock.c +index 7ccbcaf6a147..66294eb64501 100644 +--- a/sound/usb/clock.c ++++ b/sound/usb/clock.c +@@ -43,7 +43,7 @@ static struct uac_clock_source_descriptor * + while ((cs = snd_usb_find_csint_desc(ctrl_iface->extra, + ctrl_iface->extralen, + cs, UAC2_CLOCK_SOURCE))) { +- if (cs->bClockID == clock_id) ++ if (cs->bLength >= sizeof(*cs) && cs->bClockID == clock_id) + return cs; + } + +@@ -59,8 +59,11 @@ static struct uac_clock_selector_descriptor * + while ((cs = snd_usb_find_csint_desc(ctrl_iface->extra, + ctrl_iface->extralen, + cs, UAC2_CLOCK_SELECTOR))) { +- if (cs->bClockID == clock_id) ++ if (cs->bLength >= sizeof(*cs) && cs->bClockID == clock_id) { ++ if (cs->bLength < 5 + cs->bNrInPins) ++ return NULL; + return cs; ++ } + } + + return NULL; +@@ -75,7 +78,7 @@ static struct uac_clock_multiplier_descriptor * + while ((cs = snd_usb_find_csint_desc(ctrl_iface->extra, + ctrl_iface->extralen, + cs, UAC2_CLOCK_MULTIPLIER))) { +- if (cs->bClockID == clock_id) ++ if (cs->bLength >= sizeof(*cs) && cs->bClockID == clock_id) + return cs; + } + +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index a23efc8671d6..1050008d7719 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -1397,6 +1397,12 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, + __u8 *bmaControls; + + if (state->mixer->protocol == UAC_VERSION_1) { ++ if (hdr->bLength < 7) { ++ usb_audio_err(state->chip, ++ "unit %u: invalid UAC_FEATURE_UNIT descriptor\n", ++ unitid); ++ return -EINVAL; ++ } + csize = hdr->bControlSize; + if (!csize) { + usb_audio_dbg(state->chip, +@@ -1414,6 +1420,12 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, + } + } else { + struct uac2_feature_unit_descriptor *ftr = _ftr; ++ if (hdr->bLength < 6) { ++ usb_audio_err(state->chip, ++ "unit %u: invalid UAC_FEATURE_UNIT descriptor\n", ++ unitid); ++ return -EINVAL; ++ } + csize = 4; + channels = (hdr->bLength - 6) / 4 - 1; + bmaControls = ftr->bmaControls; +@@ -2014,7 +2026,8 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, + const struct usbmix_name_map *map; + char **namelist; + +- if (!desc->bNrInPins || desc->bLength < 5 + desc->bNrInPins) { ++ if (desc->bLength < 5 || !desc->bNrInPins || ++ desc->bLength < 5 + desc->bNrInPins) { + usb_audio_err(state->chip, + "invalid SELECTOR UNIT descriptor %d\n", unitid); + return -EINVAL;