3519 lines
113 KiB
Diff
3519 lines
113 KiB
Diff
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt
|
|
index 7c229f59016f..2fb35658d151 100644
|
|
--- a/Documentation/networking/ip-sysctl.txt
|
|
+++ b/Documentation/networking/ip-sysctl.txt
|
|
@@ -116,7 +116,7 @@ ipfrag_high_thresh - LONG INTEGER
|
|
Maximum memory used to reassemble IP fragments.
|
|
|
|
ipfrag_low_thresh - LONG INTEGER
|
|
- (Obsolete since linux-4.17)
|
|
+ (Obsolete since linux-4.4.174, backported from linux-4.17)
|
|
Maximum memory used to reassemble IP fragments before the kernel
|
|
begins to remove incomplete fragment queues to free up resources.
|
|
The kernel still accepts new fragments for defragmentation.
|
|
diff --git a/Makefile b/Makefile
|
|
index 1fa281069379..5f0bdef2af99 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 4
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 174
|
|
+SUBLEVEL = 175
|
|
EXTRAVERSION =
|
|
NAME = Blurry Fish Butt
|
|
|
|
diff --git a/arch/alpha/include/asm/irq.h b/arch/alpha/include/asm/irq.h
|
|
index 06377400dc09..469642801a68 100644
|
|
--- a/arch/alpha/include/asm/irq.h
|
|
+++ b/arch/alpha/include/asm/irq.h
|
|
@@ -55,15 +55,15 @@
|
|
|
|
#elif defined(CONFIG_ALPHA_DP264) || \
|
|
defined(CONFIG_ALPHA_LYNX) || \
|
|
- defined(CONFIG_ALPHA_SHARK) || \
|
|
- defined(CONFIG_ALPHA_EIGER)
|
|
+ defined(CONFIG_ALPHA_SHARK)
|
|
# define NR_IRQS 64
|
|
|
|
#elif defined(CONFIG_ALPHA_TITAN)
|
|
#define NR_IRQS 80
|
|
|
|
#elif defined(CONFIG_ALPHA_RAWHIDE) || \
|
|
- defined(CONFIG_ALPHA_TAKARA)
|
|
+ defined(CONFIG_ALPHA_TAKARA) || \
|
|
+ defined(CONFIG_ALPHA_EIGER)
|
|
# define NR_IRQS 128
|
|
|
|
#elif defined(CONFIG_ALPHA_WILDFIRE)
|
|
diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c
|
|
index 4a905bd667e2..0f68f0de9b5e 100644
|
|
--- a/arch/alpha/mm/fault.c
|
|
+++ b/arch/alpha/mm/fault.c
|
|
@@ -77,7 +77,7 @@ __load_new_mm_context(struct mm_struct *next_mm)
|
|
/* Macro for exception fixup code to access integer registers. */
|
|
#define dpf_reg(r) \
|
|
(((unsigned long *)regs)[(r) <= 8 ? (r) : (r) <= 15 ? (r)-16 : \
|
|
- (r) <= 18 ? (r)+8 : (r)-10])
|
|
+ (r) <= 18 ? (r)+10 : (r)-10])
|
|
|
|
asmlinkage void
|
|
do_page_fault(unsigned long address, unsigned long mmcsr,
|
|
diff --git a/arch/arm/boot/dts/da850-evm.dts b/arch/arm/boot/dts/da850-evm.dts
|
|
index 6881757b03e8..67369f284b91 100644
|
|
--- a/arch/arm/boot/dts/da850-evm.dts
|
|
+++ b/arch/arm/boot/dts/da850-evm.dts
|
|
@@ -147,7 +147,7 @@
|
|
|
|
sound {
|
|
compatible = "simple-audio-card";
|
|
- simple-audio-card,name = "DA850/OMAP-L138 EVM";
|
|
+ simple-audio-card,name = "DA850-OMAPL138 EVM";
|
|
simple-audio-card,widgets =
|
|
"Line", "Line In",
|
|
"Line", "Line Out";
|
|
diff --git a/arch/arm/boot/dts/kirkwood-dnskw.dtsi b/arch/arm/boot/dts/kirkwood-dnskw.dtsi
|
|
index 113dcf056dcf..1b2dacfa6132 100644
|
|
--- a/arch/arm/boot/dts/kirkwood-dnskw.dtsi
|
|
+++ b/arch/arm/boot/dts/kirkwood-dnskw.dtsi
|
|
@@ -35,8 +35,8 @@
|
|
compatible = "gpio-fan";
|
|
pinctrl-0 = <&pmx_fan_high_speed &pmx_fan_low_speed>;
|
|
pinctrl-names = "default";
|
|
- gpios = <&gpio1 14 GPIO_ACTIVE_LOW
|
|
- &gpio1 13 GPIO_ACTIVE_LOW>;
|
|
+ gpios = <&gpio1 14 GPIO_ACTIVE_HIGH
|
|
+ &gpio1 13 GPIO_ACTIVE_HIGH>;
|
|
gpio-fan,speed-map = <0 0
|
|
3000 1
|
|
6000 2>;
|
|
diff --git a/arch/arm/boot/dts/mmp2.dtsi b/arch/arm/boot/dts/mmp2.dtsi
|
|
index 766bbb8495b6..47e5b63339d1 100644
|
|
--- a/arch/arm/boot/dts/mmp2.dtsi
|
|
+++ b/arch/arm/boot/dts/mmp2.dtsi
|
|
@@ -220,12 +220,15 @@
|
|
status = "disabled";
|
|
};
|
|
|
|
- twsi2: i2c@d4025000 {
|
|
+ twsi2: i2c@d4031000 {
|
|
compatible = "mrvl,mmp-twsi";
|
|
- reg = <0xd4025000 0x1000>;
|
|
- interrupts = <58>;
|
|
+ reg = <0xd4031000 0x1000>;
|
|
+ interrupt-parent = <&intcmux17>;
|
|
+ interrupts = <0>;
|
|
clocks = <&soc_clocks MMP2_CLK_TWSI1>;
|
|
resets = <&soc_clocks MMP2_CLK_TWSI1>;
|
|
+ #address-cells = <1>;
|
|
+ #size-cells = <0>;
|
|
status = "disabled";
|
|
};
|
|
|
|
diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts
|
|
index f0bdc41f8eff..235d1493f8aa 100644
|
|
--- a/arch/arm/boot/dts/omap4-sdp.dts
|
|
+++ b/arch/arm/boot/dts/omap4-sdp.dts
|
|
@@ -33,6 +33,7 @@
|
|
gpio = <&gpio2 16 GPIO_ACTIVE_HIGH>; /* gpio line 48 */
|
|
enable-active-high;
|
|
regulator-boot-on;
|
|
+ startup-delay-us = <25000>;
|
|
};
|
|
|
|
vbat: fixedregulator-vbat {
|
|
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
|
|
index b26361355dae..e42be5800f37 100644
|
|
--- a/arch/arm/kernel/smp.c
|
|
+++ b/arch/arm/kernel/smp.c
|
|
@@ -687,6 +687,21 @@ void smp_send_stop(void)
|
|
pr_warn("SMP: failed to stop secondary CPUs\n");
|
|
}
|
|
|
|
+/* In case panic() and panic() called at the same time on CPU1 and CPU2,
|
|
+ * and CPU 1 calls panic_smp_self_stop() before crash_smp_send_stop()
|
|
+ * CPU1 can't receive the ipi irqs from CPU2, CPU1 will be always online,
|
|
+ * kdump fails. So split out the panic_smp_self_stop() and add
|
|
+ * set_cpu_online(smp_processor_id(), false).
|
|
+ */
|
|
+void panic_smp_self_stop(void)
|
|
+{
|
|
+ pr_debug("CPU %u will stop doing anything useful since another CPU has paniced\n",
|
|
+ smp_processor_id());
|
|
+ set_cpu_online(smp_processor_id(), false);
|
|
+ while (1)
|
|
+ cpu_relax();
|
|
+}
|
|
+
|
|
/*
|
|
* not supported here
|
|
*/
|
|
diff --git a/arch/arm/kvm/mmio.c b/arch/arm/kvm/mmio.c
|
|
index 387ee2a11e36..885cd0e0015b 100644
|
|
--- a/arch/arm/kvm/mmio.c
|
|
+++ b/arch/arm/kvm/mmio.c
|
|
@@ -118,6 +118,12 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|
vcpu_set_reg(vcpu, vcpu->arch.mmio_decode.rt, data);
|
|
}
|
|
|
|
+ /*
|
|
+ * The MMIO instruction is emulated and should not be re-executed
|
|
+ * in the guest.
|
|
+ */
|
|
+ kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -151,11 +157,6 @@ static int decode_hsr(struct kvm_vcpu *vcpu, bool *is_write, int *len)
|
|
vcpu->arch.mmio_decode.sign_extend = sign_extend;
|
|
vcpu->arch.mmio_decode.rt = rt;
|
|
|
|
- /*
|
|
- * The MMIO instruction is emulated and should not be re-executed
|
|
- * in the guest.
|
|
- */
|
|
- kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/arch/arm/mach-integrator/impd1.c b/arch/arm/mach-integrator/impd1.c
|
|
index 38b0da300dd5..423a88ff908c 100644
|
|
--- a/arch/arm/mach-integrator/impd1.c
|
|
+++ b/arch/arm/mach-integrator/impd1.c
|
|
@@ -394,7 +394,11 @@ static int __init_refok impd1_probe(struct lm_device *dev)
|
|
sizeof(*lookup) + 3 * sizeof(struct gpiod_lookup),
|
|
GFP_KERNEL);
|
|
chipname = devm_kstrdup(&dev->dev, devname, GFP_KERNEL);
|
|
- mmciname = kasprintf(GFP_KERNEL, "lm%x:00700", dev->id);
|
|
+ mmciname = devm_kasprintf(&dev->dev, GFP_KERNEL,
|
|
+ "lm%x:00700", dev->id);
|
|
+ if (!lookup || !chipname || !mmciname)
|
|
+ return -ENOMEM;
|
|
+
|
|
lookup->dev_id = mmciname;
|
|
/*
|
|
* Offsets on GPIO block 1:
|
|
diff --git a/arch/arm/mach-iop32x/n2100.c b/arch/arm/mach-iop32x/n2100.c
|
|
index c1cd80ecc219..a904244264ce 100644
|
|
--- a/arch/arm/mach-iop32x/n2100.c
|
|
+++ b/arch/arm/mach-iop32x/n2100.c
|
|
@@ -75,8 +75,7 @@ void __init n2100_map_io(void)
|
|
/*
|
|
* N2100 PCI.
|
|
*/
|
|
-static int __init
|
|
-n2100_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
|
+static int n2100_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
|
{
|
|
int irq;
|
|
|
|
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
|
|
index 147c90e70b2e..36706d32d656 100644
|
|
--- a/arch/arm/mach-omap2/omap_hwmod.c
|
|
+++ b/arch/arm/mach-omap2/omap_hwmod.c
|
|
@@ -2526,7 +2526,7 @@ static int __init _init(struct omap_hwmod *oh, void *data)
|
|
* a stub; implementing this properly requires iclk autoidle usecounting in
|
|
* the clock code. No return value.
|
|
*/
|
|
-static void __init _setup_iclk_autoidle(struct omap_hwmod *oh)
|
|
+static void _setup_iclk_autoidle(struct omap_hwmod *oh)
|
|
{
|
|
struct omap_hwmod_ocp_if *os;
|
|
struct list_head *p;
|
|
@@ -2561,7 +2561,7 @@ static void __init _setup_iclk_autoidle(struct omap_hwmod *oh)
|
|
* reset. Returns 0 upon success or a negative error code upon
|
|
* failure.
|
|
*/
|
|
-static int __init _setup_reset(struct omap_hwmod *oh)
|
|
+static int _setup_reset(struct omap_hwmod *oh)
|
|
{
|
|
int r;
|
|
|
|
@@ -2622,7 +2622,7 @@ static int __init _setup_reset(struct omap_hwmod *oh)
|
|
*
|
|
* No return value.
|
|
*/
|
|
-static void __init _setup_postsetup(struct omap_hwmod *oh)
|
|
+static void _setup_postsetup(struct omap_hwmod *oh)
|
|
{
|
|
u8 postsetup_state;
|
|
|
|
diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c
|
|
index a7dae60810e8..307fc18edede 100644
|
|
--- a/arch/arm/mach-pxa/cm-x300.c
|
|
+++ b/arch/arm/mach-pxa/cm-x300.c
|
|
@@ -547,7 +547,7 @@ static struct pxa3xx_u2d_platform_data cm_x300_u2d_platform_data = {
|
|
.exit = cm_x300_u2d_exit,
|
|
};
|
|
|
|
-static void cm_x300_init_u2d(void)
|
|
+static void __init cm_x300_init_u2d(void)
|
|
{
|
|
pxa3xx_set_u2d_info(&cm_x300_u2d_platform_data);
|
|
}
|
|
diff --git a/arch/arm/mach-pxa/littleton.c b/arch/arm/mach-pxa/littleton.c
|
|
index 5d665588c7eb..05aa7071efd6 100644
|
|
--- a/arch/arm/mach-pxa/littleton.c
|
|
+++ b/arch/arm/mach-pxa/littleton.c
|
|
@@ -183,7 +183,7 @@ static struct pxafb_mach_info littleton_lcd_info = {
|
|
.lcd_conn = LCD_COLOR_TFT_16BPP,
|
|
};
|
|
|
|
-static void littleton_init_lcd(void)
|
|
+static void __init littleton_init_lcd(void)
|
|
{
|
|
pxa_set_fb_info(NULL, &littleton_lcd_info);
|
|
}
|
|
diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
|
|
index d757cfb5f8a6..4da2458d7f32 100644
|
|
--- a/arch/arm/mach-pxa/zeus.c
|
|
+++ b/arch/arm/mach-pxa/zeus.c
|
|
@@ -558,7 +558,7 @@ static struct pxaohci_platform_data zeus_ohci_platform_data = {
|
|
.flags = ENABLE_PORT_ALL | POWER_SENSE_LOW,
|
|
};
|
|
|
|
-static void zeus_register_ohci(void)
|
|
+static void __init zeus_register_ohci(void)
|
|
{
|
|
/* Port 2 is shared between host and client interface. */
|
|
UP2OCR = UP2OCR_HXOE | UP2OCR_HXS | UP2OCR_DMPDE | UP2OCR_DPPDE;
|
|
diff --git a/arch/arm64/kernel/entry-ftrace.S b/arch/arm64/kernel/entry-ftrace.S
|
|
index 0f03a8fe2314..d18d15810d19 100644
|
|
--- a/arch/arm64/kernel/entry-ftrace.S
|
|
+++ b/arch/arm64/kernel/entry-ftrace.S
|
|
@@ -78,7 +78,6 @@
|
|
.macro mcount_get_lr reg
|
|
ldr \reg, [x29]
|
|
ldr \reg, [\reg, #8]
|
|
- mcount_adjust_addr \reg, \reg
|
|
.endm
|
|
|
|
.macro mcount_get_lr_addr reg
|
|
diff --git a/arch/mips/include/uapi/asm/inst.h b/arch/mips/include/uapi/asm/inst.h
|
|
index 1b6f2f219298..9db764b51ffe 100644
|
|
--- a/arch/mips/include/uapi/asm/inst.h
|
|
+++ b/arch/mips/include/uapi/asm/inst.h
|
|
@@ -290,8 +290,8 @@ enum mm_32a_minor_op {
|
|
mm_ext_op = 0x02c,
|
|
mm_pool32axf_op = 0x03c,
|
|
mm_srl32_op = 0x040,
|
|
+ mm_srlv32_op = 0x050,
|
|
mm_sra_op = 0x080,
|
|
- mm_srlv32_op = 0x090,
|
|
mm_rotr_op = 0x0c0,
|
|
mm_lwxs_op = 0x118,
|
|
mm_addu32_op = 0x150,
|
|
diff --git a/arch/mips/kernel/mips-cm.c b/arch/mips/kernel/mips-cm.c
|
|
index 1448c1f43d4e..76f18c56141c 100644
|
|
--- a/arch/mips/kernel/mips-cm.c
|
|
+++ b/arch/mips/kernel/mips-cm.c
|
|
@@ -424,5 +424,5 @@ void mips_cm_error_report(void)
|
|
}
|
|
|
|
/* reprime cause register */
|
|
- write_gcr_error_cause(0);
|
|
+ write_gcr_error_cause(cm_error);
|
|
}
|
|
diff --git a/arch/mips/pci/pci-octeon.c b/arch/mips/pci/pci-octeon.c
|
|
index c258cd406fbb..b36bbda31058 100644
|
|
--- a/arch/mips/pci/pci-octeon.c
|
|
+++ b/arch/mips/pci/pci-octeon.c
|
|
@@ -571,6 +571,11 @@ static int __init octeon_pci_setup(void)
|
|
if (octeon_has_feature(OCTEON_FEATURE_PCIE))
|
|
return 0;
|
|
|
|
+ if (!octeon_is_pci_host()) {
|
|
+ pr_notice("Not in host mode, PCI Controller not initialized\n");
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
/* Point pcibios_map_irq() to the PCI version of it */
|
|
octeon_pcibios_map_irq = octeon_pci_pcibios_map_irq;
|
|
|
|
@@ -582,11 +587,6 @@ static int __init octeon_pci_setup(void)
|
|
else
|
|
octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_BIG;
|
|
|
|
- if (!octeon_is_pci_host()) {
|
|
- pr_notice("Not in host mode, PCI Controller not initialized\n");
|
|
- return 0;
|
|
- }
|
|
-
|
|
/* PCI I/O and PCI MEM values */
|
|
set_io_port_base(OCTEON_PCI_IOSPACE_BASE);
|
|
ioport_resource.start = 0;
|
|
diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
|
|
index 6c7d78546eee..886005b1e87d 100644
|
|
--- a/arch/mips/vdso/Makefile
|
|
+++ b/arch/mips/vdso/Makefile
|
|
@@ -107,7 +107,7 @@ $(obj)/%-o32.o: $(src)/%.c FORCE
|
|
$(call cmd,force_checksrc)
|
|
$(call if_changed_rule,cc_o_c)
|
|
|
|
-$(obj)/vdso-o32.lds: KBUILD_CPPFLAGS := -mabi=32
|
|
+$(obj)/vdso-o32.lds: KBUILD_CPPFLAGS := $(ccflags-vdso) -mabi=32
|
|
$(obj)/vdso-o32.lds: $(src)/vdso.lds.S FORCE
|
|
$(call if_changed_dep,cpp_lds_S)
|
|
|
|
@@ -143,7 +143,7 @@ $(obj)/%-n32.o: $(src)/%.c FORCE
|
|
$(call cmd,force_checksrc)
|
|
$(call if_changed_rule,cc_o_c)
|
|
|
|
-$(obj)/vdso-n32.lds: KBUILD_CPPFLAGS := -mabi=n32
|
|
+$(obj)/vdso-n32.lds: KBUILD_CPPFLAGS := $(ccflags-vdso) -mabi=n32
|
|
$(obj)/vdso-n32.lds: $(src)/vdso.lds.S FORCE
|
|
$(call if_changed_dep,cpp_lds_S)
|
|
|
|
diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h
|
|
index a5ffe0207c16..05f1389228d2 100644
|
|
--- a/arch/powerpc/include/asm/uaccess.h
|
|
+++ b/arch/powerpc/include/asm/uaccess.h
|
|
@@ -59,7 +59,7 @@
|
|
#endif
|
|
|
|
#define access_ok(type, addr, size) \
|
|
- (__chk_user_ptr(addr), \
|
|
+ (__chk_user_ptr(addr), (void)(type), \
|
|
__access_ok((__force unsigned long)(addr), (size), get_fs()))
|
|
|
|
/*
|
|
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
|
|
index 96536c969c9c..a8efed3b4691 100644
|
|
--- a/arch/powerpc/platforms/pseries/dlpar.c
|
|
+++ b/arch/powerpc/platforms/pseries/dlpar.c
|
|
@@ -280,6 +280,8 @@ int dlpar_detach_node(struct device_node *dn)
|
|
if (rc)
|
|
return rc;
|
|
|
|
+ of_node_put(dn);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/arch/um/include/asm/pgtable.h b/arch/um/include/asm/pgtable.h
|
|
index 18eb9924dda3..aeb430212947 100644
|
|
--- a/arch/um/include/asm/pgtable.h
|
|
+++ b/arch/um/include/asm/pgtable.h
|
|
@@ -197,12 +197,17 @@ static inline pte_t pte_mkold(pte_t pte)
|
|
|
|
static inline pte_t pte_wrprotect(pte_t pte)
|
|
{
|
|
- pte_clear_bits(pte, _PAGE_RW);
|
|
+ if (likely(pte_get_bits(pte, _PAGE_RW)))
|
|
+ pte_clear_bits(pte, _PAGE_RW);
|
|
+ else
|
|
+ return pte;
|
|
return(pte_mknewprot(pte));
|
|
}
|
|
|
|
static inline pte_t pte_mkread(pte_t pte)
|
|
{
|
|
+ if (unlikely(pte_get_bits(pte, _PAGE_USER)))
|
|
+ return pte;
|
|
pte_set_bits(pte, _PAGE_USER);
|
|
return(pte_mknewprot(pte));
|
|
}
|
|
@@ -221,6 +226,8 @@ static inline pte_t pte_mkyoung(pte_t pte)
|
|
|
|
static inline pte_t pte_mkwrite(pte_t pte)
|
|
{
|
|
+ if (unlikely(pte_get_bits(pte, _PAGE_RW)))
|
|
+ return pte;
|
|
pte_set_bits(pte, _PAGE_RW);
|
|
return(pte_mknewprot(pte));
|
|
}
|
|
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c
|
|
index ae6aad1d24f7..b348c4641312 100644
|
|
--- a/arch/x86/ia32/ia32_aout.c
|
|
+++ b/arch/x86/ia32/ia32_aout.c
|
|
@@ -50,7 +50,7 @@ static unsigned long get_dr(int n)
|
|
/*
|
|
* fill in the user structure for a core dump..
|
|
*/
|
|
-static void dump_thread32(struct pt_regs *regs, struct user32 *dump)
|
|
+static void fill_dump(struct pt_regs *regs, struct user32 *dump)
|
|
{
|
|
u32 fs, gs;
|
|
memset(dump, 0, sizeof(*dump));
|
|
@@ -156,10 +156,12 @@ static int aout_core_dump(struct coredump_params *cprm)
|
|
fs = get_fs();
|
|
set_fs(KERNEL_DS);
|
|
has_dumped = 1;
|
|
+
|
|
+ fill_dump(cprm->regs, &dump);
|
|
+
|
|
strncpy(dump.u_comm, current->comm, sizeof(current->comm));
|
|
dump.u_ar0 = offsetof(struct user32, regs);
|
|
dump.signal = cprm->siginfo->si_signo;
|
|
- dump_thread32(cprm->regs, &dump);
|
|
|
|
/*
|
|
* If the size of the dump file exceeds the rlimit, then see
|
|
diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
|
|
index 16825dda18dc..66a5e60f60c4 100644
|
|
--- a/arch/x86/include/asm/fpu/internal.h
|
|
+++ b/arch/x86/include/asm/fpu/internal.h
|
|
@@ -94,6 +94,9 @@ extern void fpstate_sanitize_xstate(struct fpu *fpu);
|
|
#define user_insn(insn, output, input...) \
|
|
({ \
|
|
int err; \
|
|
+ \
|
|
+ might_fault(); \
|
|
+ \
|
|
asm volatile(ASM_STAC "\n" \
|
|
"1:" #insn "\n\t" \
|
|
"2: " ASM_CLAC "\n" \
|
|
diff --git a/arch/x86/include/asm/uv/bios.h b/arch/x86/include/asm/uv/bios.h
|
|
index 71605c7d5c5c..8b7594f2d48f 100644
|
|
--- a/arch/x86/include/asm/uv/bios.h
|
|
+++ b/arch/x86/include/asm/uv/bios.h
|
|
@@ -48,7 +48,8 @@ enum {
|
|
BIOS_STATUS_SUCCESS = 0,
|
|
BIOS_STATUS_UNIMPLEMENTED = -ENOSYS,
|
|
BIOS_STATUS_EINVAL = -EINVAL,
|
|
- BIOS_STATUS_UNAVAIL = -EBUSY
|
|
+ BIOS_STATUS_UNAVAIL = -EBUSY,
|
|
+ BIOS_STATUS_ABORT = -EINTR,
|
|
};
|
|
|
|
/*
|
|
@@ -111,4 +112,9 @@ extern long system_serial_number;
|
|
|
|
extern struct kobject *sgi_uv_kobj; /* /sys/firmware/sgi_uv */
|
|
|
|
+/*
|
|
+ * EFI runtime lock; cf. firmware/efi/runtime-wrappers.c for details
|
|
+ */
|
|
+extern struct semaphore __efi_uv_runtime_lock;
|
|
+
|
|
#endif /* _ASM_X86_UV_BIOS_H */
|
|
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
|
|
index 7b8c8c838191..77f7580e22c6 100644
|
|
--- a/arch/x86/kernel/cpu/mcheck/mce.c
|
|
+++ b/arch/x86/kernel/cpu/mcheck/mce.c
|
|
@@ -670,6 +670,7 @@ static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp,
|
|
}
|
|
|
|
if (mce_severity(m, mca_cfg.tolerant, &tmp, true) >= MCE_PANIC_SEVERITY) {
|
|
+ m->bank = i;
|
|
*msg = tmp;
|
|
ret = 1;
|
|
}
|
|
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore_snbep.c b/arch/x86/kernel/cpu/perf_event_intel_uncore_snbep.c
|
|
index f0f4fcba252e..947579425861 100644
|
|
--- a/arch/x86/kernel/cpu/perf_event_intel_uncore_snbep.c
|
|
+++ b/arch/x86/kernel/cpu/perf_event_intel_uncore_snbep.c
|
|
@@ -1081,6 +1081,8 @@ static struct pci_driver snbep_uncore_pci_driver = {
|
|
.id_table = snbep_uncore_pci_ids,
|
|
};
|
|
|
|
+#define NODE_ID_MASK 0x7
|
|
+
|
|
/*
|
|
* build pci bus to socket mapping
|
|
*/
|
|
@@ -1102,7 +1104,7 @@ static int snbep_pci2phy_map_init(int devid)
|
|
err = pci_read_config_dword(ubox_dev, 0x40, &config);
|
|
if (err)
|
|
break;
|
|
- nodeid = config;
|
|
+ nodeid = config & NODE_ID_MASK;
|
|
/* get the Node ID mapping */
|
|
err = pci_read_config_dword(ubox_dev, 0x54, &config);
|
|
if (err)
|
|
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
|
|
index ecdf724da371..7ce1a19d9d8b 100644
|
|
--- a/arch/x86/kvm/svm.c
|
|
+++ b/arch/x86/kvm/svm.c
|
|
@@ -4156,6 +4156,13 @@ static bool svm_cpu_has_accelerated_tpr(void)
|
|
|
|
static bool svm_has_emulated_msr(int index)
|
|
{
|
|
+ switch (index) {
|
|
+ case MSR_IA32_MCG_EXT_CTL:
|
|
+ return false;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+
|
|
return true;
|
|
}
|
|
|
|
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
|
|
index 3bdb2e747b89..aee2886a387c 100644
|
|
--- a/arch/x86/kvm/vmx.c
|
|
+++ b/arch/x86/kvm/vmx.c
|
|
@@ -6965,6 +6965,7 @@ static void free_nested(struct vcpu_vmx *vmx)
|
|
if (!vmx->nested.vmxon)
|
|
return;
|
|
|
|
+ hrtimer_cancel(&vmx->nested.preemption_timer);
|
|
vmx->nested.vmxon = false;
|
|
free_vpid(vmx->nested.vpid02);
|
|
nested_release_vmcs12(vmx);
|
|
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
|
index 758e2b39567d..6bd0538d8ebf 100644
|
|
--- a/arch/x86/kvm/x86.c
|
|
+++ b/arch/x86/kvm/x86.c
|
|
@@ -4247,6 +4247,13 @@ int kvm_read_guest_virt(struct kvm_vcpu *vcpu,
|
|
{
|
|
u32 access = (kvm_x86_ops->get_cpl(vcpu) == 3) ? PFERR_USER_MASK : 0;
|
|
|
|
+ /*
|
|
+ * FIXME: this should call handle_emulation_failure if X86EMUL_IO_NEEDED
|
|
+ * is returned, but our callers are not ready for that and they blindly
|
|
+ * call kvm_inject_page_fault. Ensure that they at least do not leak
|
|
+ * uninitialized kernel stack memory into cr2 and error code.
|
|
+ */
|
|
+ memset(exception, 0, sizeof(*exception));
|
|
return kvm_read_guest_virt_helper(addr, val, bytes, vcpu, access,
|
|
exception);
|
|
}
|
|
diff --git a/arch/x86/pci/broadcom_bus.c b/arch/x86/pci/broadcom_bus.c
|
|
index 526536c81ddc..ca1e8e6dccc8 100644
|
|
--- a/arch/x86/pci/broadcom_bus.c
|
|
+++ b/arch/x86/pci/broadcom_bus.c
|
|
@@ -50,8 +50,8 @@ static void __init cnb20le_res(u8 bus, u8 slot, u8 func)
|
|
word1 = read_pci_config_16(bus, slot, func, 0xc0);
|
|
word2 = read_pci_config_16(bus, slot, func, 0xc2);
|
|
if (word1 != word2) {
|
|
- res.start = (word1 << 16) | 0x0000;
|
|
- res.end = (word2 << 16) | 0xffff;
|
|
+ res.start = ((resource_size_t) word1 << 16) | 0x0000;
|
|
+ res.end = ((resource_size_t) word2 << 16) | 0xffff;
|
|
res.flags = IORESOURCE_MEM;
|
|
update_res(info, res.start, res.end, res.flags, 0);
|
|
}
|
|
diff --git a/arch/x86/platform/uv/bios_uv.c b/arch/x86/platform/uv/bios_uv.c
|
|
index 1584cbed0dce..a45a1c5aabea 100644
|
|
--- a/arch/x86/platform/uv/bios_uv.c
|
|
+++ b/arch/x86/platform/uv/bios_uv.c
|
|
@@ -28,7 +28,8 @@
|
|
|
|
static struct uv_systab uv_systab;
|
|
|
|
-s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
|
|
+static s64 __uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3,
|
|
+ u64 a4, u64 a5)
|
|
{
|
|
struct uv_systab *tab = &uv_systab;
|
|
s64 ret;
|
|
@@ -43,6 +44,19 @@ s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
|
|
a1, a2, a3, a4, a5);
|
|
return ret;
|
|
}
|
|
+
|
|
+s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
|
|
+{
|
|
+ s64 ret;
|
|
+
|
|
+ if (down_interruptible(&__efi_uv_runtime_lock))
|
|
+ return BIOS_STATUS_ABORT;
|
|
+
|
|
+ ret = __uv_bios_call(which, a1, a2, a3, a4, a5);
|
|
+ up(&__efi_uv_runtime_lock);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
EXPORT_SYMBOL_GPL(uv_bios_call);
|
|
|
|
s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3,
|
|
@@ -51,10 +65,15 @@ s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3,
|
|
unsigned long bios_flags;
|
|
s64 ret;
|
|
|
|
+ if (down_interruptible(&__efi_uv_runtime_lock))
|
|
+ return BIOS_STATUS_ABORT;
|
|
+
|
|
local_irq_save(bios_flags);
|
|
- ret = uv_bios_call(which, a1, a2, a3, a4, a5);
|
|
+ ret = __uv_bios_call(which, a1, a2, a3, a4, a5);
|
|
local_irq_restore(bios_flags);
|
|
|
|
+ up(&__efi_uv_runtime_lock);
|
|
+
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c
|
|
index 8804127b108c..21b80f5ee092 100644
|
|
--- a/drivers/ata/sata_rcar.c
|
|
+++ b/drivers/ata/sata_rcar.c
|
|
@@ -875,7 +875,9 @@ static int sata_rcar_probe(struct platform_device *pdev)
|
|
int ret = 0;
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
- if (irq <= 0)
|
|
+ if (irq < 0)
|
|
+ return irq;
|
|
+ if (!irq)
|
|
return -EINVAL;
|
|
|
|
priv = devm_kzalloc(&pdev->dev, sizeof(struct sata_rcar_priv),
|
|
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
|
|
index e80cbefbc2b5..27e1abcf5710 100644
|
|
--- a/drivers/block/drbd/drbd_nl.c
|
|
+++ b/drivers/block/drbd/drbd_nl.c
|
|
@@ -632,14 +632,15 @@ drbd_set_role(struct drbd_device *const device, enum drbd_role new_role, int for
|
|
if (rv == SS_TWO_PRIMARIES) {
|
|
/* Maybe the peer is detected as dead very soon...
|
|
retry at most once more in this case. */
|
|
- int timeo;
|
|
- rcu_read_lock();
|
|
- nc = rcu_dereference(connection->net_conf);
|
|
- timeo = nc ? (nc->ping_timeo + 1) * HZ / 10 : 1;
|
|
- rcu_read_unlock();
|
|
- schedule_timeout_interruptible(timeo);
|
|
- if (try < max_tries)
|
|
+ if (try < max_tries) {
|
|
+ int timeo;
|
|
try = max_tries - 1;
|
|
+ rcu_read_lock();
|
|
+ nc = rcu_dereference(connection->net_conf);
|
|
+ timeo = nc ? (nc->ping_timeo + 1) * HZ / 10 : 1;
|
|
+ rcu_read_unlock();
|
|
+ schedule_timeout_interruptible(timeo);
|
|
+ }
|
|
continue;
|
|
}
|
|
if (rv < SS_SUCCESS) {
|
|
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
|
|
index b4b5680ac6ad..b1ee358edd3b 100644
|
|
--- a/drivers/block/drbd/drbd_receiver.c
|
|
+++ b/drivers/block/drbd/drbd_receiver.c
|
|
@@ -3126,7 +3126,7 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_peer_device *peer_device,
|
|
enum drbd_conns rv = C_MASK;
|
|
enum drbd_disk_state mydisk;
|
|
struct net_conf *nc;
|
|
- int hg, rule_nr, rr_conflict, tentative;
|
|
+ int hg, rule_nr, rr_conflict, tentative, always_asbp;
|
|
|
|
mydisk = device->state.disk;
|
|
if (mydisk == D_NEGOTIATING)
|
|
@@ -3168,8 +3168,12 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_peer_device *peer_device,
|
|
|
|
rcu_read_lock();
|
|
nc = rcu_dereference(peer_device->connection->net_conf);
|
|
+ always_asbp = nc->always_asbp;
|
|
+ rr_conflict = nc->rr_conflict;
|
|
+ tentative = nc->tentative;
|
|
+ rcu_read_unlock();
|
|
|
|
- if (hg == 100 || (hg == -100 && nc->always_asbp)) {
|
|
+ if (hg == 100 || (hg == -100 && always_asbp)) {
|
|
int pcount = (device->state.role == R_PRIMARY)
|
|
+ (peer_role == R_PRIMARY);
|
|
int forced = (hg == -100);
|
|
@@ -3208,9 +3212,6 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_peer_device *peer_device,
|
|
"Sync from %s node\n",
|
|
(hg < 0) ? "peer" : "this");
|
|
}
|
|
- rr_conflict = nc->rr_conflict;
|
|
- tentative = nc->tentative;
|
|
- rcu_read_unlock();
|
|
|
|
if (hg == -100) {
|
|
/* FIXME this log message is not correct if we end up here
|
|
@@ -3889,7 +3890,7 @@ static int receive_uuids(struct drbd_connection *connection, struct packet_info
|
|
kfree(device->p_uuid);
|
|
device->p_uuid = p_uuid;
|
|
|
|
- if (device->state.conn < C_CONNECTED &&
|
|
+ if ((device->state.conn < C_CONNECTED || device->state.pdsk == D_DISKLESS) &&
|
|
device->state.disk < D_INCONSISTENT &&
|
|
device->state.role == R_PRIMARY &&
|
|
(device->ed_uuid & ~((u64)1)) != (p_uuid[UI_CURRENT] & ~((u64)1))) {
|
|
diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c
|
|
index 4b911ed96ea3..31219fb9e7f4 100644
|
|
--- a/drivers/block/sunvdc.c
|
|
+++ b/drivers/block/sunvdc.c
|
|
@@ -40,6 +40,8 @@ MODULE_VERSION(DRV_MODULE_VERSION);
|
|
#define WAITING_FOR_GEN_CMD 0x04
|
|
#define WAITING_FOR_ANY -1
|
|
|
|
+#define VDC_MAX_RETRIES 10
|
|
+
|
|
static struct workqueue_struct *sunvdc_wq;
|
|
|
|
struct vdc_req_entry {
|
|
@@ -419,6 +421,7 @@ static int __vdc_tx_trigger(struct vdc_port *port)
|
|
.end_idx = dr->prod,
|
|
};
|
|
int err, delay;
|
|
+ int retries = 0;
|
|
|
|
hdr.seq = dr->snd_nxt;
|
|
delay = 1;
|
|
@@ -431,6 +434,8 @@ static int __vdc_tx_trigger(struct vdc_port *port)
|
|
udelay(delay);
|
|
if ((delay <<= 1) > 128)
|
|
delay = 128;
|
|
+ if (retries++ > VDC_MAX_RETRIES)
|
|
+ break;
|
|
} while (err == -EAGAIN);
|
|
|
|
if (err == -ENOTCONN)
|
|
diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c
|
|
index c264f2d284a7..2e0a9e2531cb 100644
|
|
--- a/drivers/block/swim3.c
|
|
+++ b/drivers/block/swim3.c
|
|
@@ -1027,7 +1027,11 @@ static void floppy_release(struct gendisk *disk, fmode_t mode)
|
|
struct swim3 __iomem *sw = fs->swim3;
|
|
|
|
mutex_lock(&swim3_mutex);
|
|
- if (fs->ref_count > 0 && --fs->ref_count == 0) {
|
|
+ if (fs->ref_count > 0)
|
|
+ --fs->ref_count;
|
|
+ else if (fs->ref_count == -1)
|
|
+ fs->ref_count = 0;
|
|
+ if (fs->ref_count == 0) {
|
|
swim3_action(fs, MOTOR_OFF);
|
|
out_8(&sw->control_bic, 0xff);
|
|
swim3_select(fs, RELAX);
|
|
diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c
|
|
index e2808fefbb78..1852d19d0d7b 100644
|
|
--- a/drivers/cdrom/gdrom.c
|
|
+++ b/drivers/cdrom/gdrom.c
|
|
@@ -882,6 +882,7 @@ static void __exit exit_gdrom(void)
|
|
platform_device_unregister(pd);
|
|
platform_driver_unregister(&gdrom_driver);
|
|
kfree(gd.toc);
|
|
+ kfree(gd.cd_info);
|
|
}
|
|
|
|
module_init(init_gdrom);
|
|
diff --git a/drivers/clk/imx/clk-imx6sl.c b/drivers/clk/imx/clk-imx6sl.c
|
|
index 1be6230a07af..8b6306dc5fc6 100644
|
|
--- a/drivers/clk/imx/clk-imx6sl.c
|
|
+++ b/drivers/clk/imx/clk-imx6sl.c
|
|
@@ -17,6 +17,8 @@
|
|
|
|
#include "clk.h"
|
|
|
|
+#define CCDR 0x4
|
|
+#define BM_CCM_CCDR_MMDC_CH0_MASK (1 << 17)
|
|
#define CCSR 0xc
|
|
#define BM_CCSR_PLL1_SW_CLK_SEL (1 << 2)
|
|
#define CACRR 0x10
|
|
@@ -414,6 +416,10 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
|
|
clks[IMX6SL_CLK_USDHC3] = imx_clk_gate2("usdhc3", "usdhc3_podf", base + 0x80, 6);
|
|
clks[IMX6SL_CLK_USDHC4] = imx_clk_gate2("usdhc4", "usdhc4_podf", base + 0x80, 8);
|
|
|
|
+ /* Ensure the MMDC CH0 handshake is bypassed */
|
|
+ writel_relaxed(readl_relaxed(base + CCDR) |
|
|
+ BM_CCM_CCDR_MMDC_CH0_MASK, base + CCDR);
|
|
+
|
|
imx_check_clocks(clks, ARRAY_SIZE(clks));
|
|
|
|
clk_data.clks = clks;
|
|
diff --git a/drivers/cpuidle/cpuidle-big_little.c b/drivers/cpuidle/cpuidle-big_little.c
|
|
index db2ede565f1a..b44476a1b7ad 100644
|
|
--- a/drivers/cpuidle/cpuidle-big_little.c
|
|
+++ b/drivers/cpuidle/cpuidle-big_little.c
|
|
@@ -167,6 +167,7 @@ static int __init bl_idle_init(void)
|
|
{
|
|
int ret;
|
|
struct device_node *root = of_find_node_by_path("/");
|
|
+ const struct of_device_id *match_id;
|
|
|
|
if (!root)
|
|
return -ENODEV;
|
|
@@ -174,7 +175,11 @@ static int __init bl_idle_init(void)
|
|
/*
|
|
* Initialize the driver just for a compliant set of machines
|
|
*/
|
|
- if (!of_match_node(compatible_machine_match, root))
|
|
+ match_id = of_match_node(compatible_machine_match, root);
|
|
+
|
|
+ of_node_put(root);
|
|
+
|
|
+ if (!match_id)
|
|
return -ENODEV;
|
|
|
|
if (!mcpm_is_available())
|
|
diff --git a/drivers/crypto/ux500/cryp/cryp_core.c b/drivers/crypto/ux500/cryp/cryp_core.c
|
|
index 790f7cadc1ed..efebc484e371 100644
|
|
--- a/drivers/crypto/ux500/cryp/cryp_core.c
|
|
+++ b/drivers/crypto/ux500/cryp/cryp_core.c
|
|
@@ -555,7 +555,7 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx,
|
|
desc = dmaengine_prep_slave_sg(channel,
|
|
ctx->device->dma.sg_src,
|
|
ctx->device->dma.sg_src_len,
|
|
- direction, DMA_CTRL_ACK);
|
|
+ DMA_MEM_TO_DEV, DMA_CTRL_ACK);
|
|
break;
|
|
|
|
case DMA_FROM_DEVICE:
|
|
@@ -579,7 +579,7 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx,
|
|
desc = dmaengine_prep_slave_sg(channel,
|
|
ctx->device->dma.sg_dst,
|
|
ctx->device->dma.sg_dst_len,
|
|
- direction,
|
|
+ DMA_DEV_TO_MEM,
|
|
DMA_CTRL_ACK |
|
|
DMA_PREP_INTERRUPT);
|
|
|
|
diff --git a/drivers/crypto/ux500/hash/hash_core.c b/drivers/crypto/ux500/hash/hash_core.c
|
|
index cd4398498495..bca6b701c067 100644
|
|
--- a/drivers/crypto/ux500/hash/hash_core.c
|
|
+++ b/drivers/crypto/ux500/hash/hash_core.c
|
|
@@ -181,7 +181,7 @@ static int hash_set_dma_transfer(struct hash_ctx *ctx, struct scatterlist *sg,
|
|
__func__);
|
|
desc = dmaengine_prep_slave_sg(channel,
|
|
ctx->device->dma.sg, ctx->device->dma.sg_len,
|
|
- direction, DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
|
|
+ DMA_MEM_TO_DEV, DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
|
|
if (!desc) {
|
|
dev_err(ctx->device->dev,
|
|
"%s: dmaengine_prep_slave_sg() failed!\n", __func__);
|
|
diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
|
|
index 48d85f8b95fe..dfa337ae06fc 100644
|
|
--- a/drivers/dma/imx-dma.c
|
|
+++ b/drivers/dma/imx-dma.c
|
|
@@ -619,7 +619,7 @@ static void imxdma_tasklet(unsigned long data)
|
|
{
|
|
struct imxdma_channel *imxdmac = (void *)data;
|
|
struct imxdma_engine *imxdma = imxdmac->imxdma;
|
|
- struct imxdma_desc *desc;
|
|
+ struct imxdma_desc *desc, *next_desc;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&imxdma->lock, flags);
|
|
@@ -649,10 +649,10 @@ static void imxdma_tasklet(unsigned long data)
|
|
list_move_tail(imxdmac->ld_active.next, &imxdmac->ld_free);
|
|
|
|
if (!list_empty(&imxdmac->ld_queue)) {
|
|
- desc = list_first_entry(&imxdmac->ld_queue, struct imxdma_desc,
|
|
- node);
|
|
+ next_desc = list_first_entry(&imxdmac->ld_queue,
|
|
+ struct imxdma_desc, node);
|
|
list_move_tail(imxdmac->ld_queue.next, &imxdmac->ld_active);
|
|
- if (imxdma_xfer_desc(desc) < 0)
|
|
+ if (imxdma_xfer_desc(next_desc) < 0)
|
|
dev_warn(imxdma->dev, "%s: channel: %d couldn't xfer desc\n",
|
|
__func__, imxdmac->channel);
|
|
}
|
|
diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
|
|
index 228bbf910461..906d0224f50d 100644
|
|
--- a/drivers/firmware/efi/runtime-wrappers.c
|
|
+++ b/drivers/firmware/efi/runtime-wrappers.c
|
|
@@ -87,6 +87,13 @@ static DEFINE_SPINLOCK(efi_runtime_lock);
|
|
* context through efi_pstore_write().
|
|
*/
|
|
|
|
+/*
|
|
+ * Expose the EFI runtime lock to the UV platform
|
|
+ */
|
|
+#ifdef CONFIG_X86_UV
|
|
+extern struct semaphore __efi_uv_runtime_lock __alias(efi_runtime_lock);
|
|
+#endif
|
|
+
|
|
/*
|
|
* As per commit ef68c8f87ed1 ("x86: Serialize EFI time accesses on rtc_lock"),
|
|
* the EFI specification requires that callers of the time related runtime
|
|
diff --git a/drivers/gpu/drm/drm_bufs.c b/drivers/gpu/drm/drm_bufs.c
|
|
index f1a204d253cc..ac22b8d86249 100644
|
|
--- a/drivers/gpu/drm/drm_bufs.c
|
|
+++ b/drivers/gpu/drm/drm_bufs.c
|
|
@@ -36,6 +36,8 @@
|
|
#include <drm/drmP.h>
|
|
#include "drm_legacy.h"
|
|
|
|
+#include <linux/nospec.h>
|
|
+
|
|
static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
|
|
struct drm_local_map *map)
|
|
{
|
|
@@ -1332,6 +1334,7 @@ int drm_legacy_freebufs(struct drm_device *dev, void *data,
|
|
idx, dma->buf_count - 1);
|
|
return -EINVAL;
|
|
}
|
|
+ idx = array_index_nospec(idx, dma->buf_count);
|
|
buf = dma->buflist[idx];
|
|
if (buf->file_priv != file_priv) {
|
|
DRM_ERROR("Process %d freeing buffer not owned\n",
|
|
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
|
|
index 71a10f08522e..a5b052203c2c 100644
|
|
--- a/drivers/gpu/drm/drm_modes.c
|
|
+++ b/drivers/gpu/drm/drm_modes.c
|
|
@@ -722,7 +722,7 @@ int drm_mode_hsync(const struct drm_display_mode *mode)
|
|
if (mode->hsync)
|
|
return mode->hsync;
|
|
|
|
- if (mode->htotal < 0)
|
|
+ if (mode->htotal <= 0)
|
|
return 0;
|
|
|
|
calc_val = (mode->clock * 1000) / mode->htotal; /* hsync in Hz */
|
|
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
|
|
index be3971b22a02..ed92b9ac01b2 100644
|
|
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
|
|
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
|
|
@@ -594,13 +594,16 @@ out_fixup:
|
|
static int vmw_dma_masks(struct vmw_private *dev_priv)
|
|
{
|
|
struct drm_device *dev = dev_priv->dev;
|
|
+ int ret = 0;
|
|
|
|
- if (intel_iommu_enabled &&
|
|
+ ret = dma_set_mask_and_coherent(dev->dev, DMA_BIT_MASK(64));
|
|
+ if (dev_priv->map_mode != vmw_dma_phys &&
|
|
(sizeof(unsigned long) == 4 || vmw_restrict_dma_mask)) {
|
|
DRM_INFO("Restricting DMA addresses to 44 bits.\n");
|
|
- return dma_set_mask(dev->dev, DMA_BIT_MASK(44));
|
|
+ return dma_set_mask_and_coherent(dev->dev, DMA_BIT_MASK(44));
|
|
}
|
|
- return 0;
|
|
+
|
|
+ return ret;
|
|
}
|
|
#else
|
|
static int vmw_dma_masks(struct vmw_private *dev_priv)
|
|
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
|
|
index fda8e85dd5a2..ad0dd566aded 100644
|
|
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
|
|
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
|
|
@@ -3663,7 +3663,7 @@ int vmw_execbuf_fence_commands(struct drm_file *file_priv,
|
|
*p_fence = NULL;
|
|
}
|
|
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
|
|
/**
|
|
diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c
|
|
index 6c60f4b63d21..d7179dd3c9ef 100644
|
|
--- a/drivers/hid/hid-debug.c
|
|
+++ b/drivers/hid/hid-debug.c
|
|
@@ -30,6 +30,7 @@
|
|
|
|
#include <linux/debugfs.h>
|
|
#include <linux/seq_file.h>
|
|
+#include <linux/kfifo.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/export.h>
|
|
#include <linux/slab.h>
|
|
@@ -455,7 +456,7 @@ static char *resolv_usage_page(unsigned page, struct seq_file *f) {
|
|
char *buf = NULL;
|
|
|
|
if (!f) {
|
|
- buf = kzalloc(sizeof(char) * HID_DEBUG_BUFSIZE, GFP_ATOMIC);
|
|
+ buf = kzalloc(HID_DEBUG_BUFSIZE, GFP_ATOMIC);
|
|
if (!buf)
|
|
return ERR_PTR(-ENOMEM);
|
|
}
|
|
@@ -659,17 +660,12 @@ EXPORT_SYMBOL_GPL(hid_dump_device);
|
|
/* enqueue string to 'events' ring buffer */
|
|
void hid_debug_event(struct hid_device *hdev, char *buf)
|
|
{
|
|
- int i;
|
|
struct hid_debug_list *list;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&hdev->debug_list_lock, flags);
|
|
- list_for_each_entry(list, &hdev->debug_list, node) {
|
|
- for (i = 0; i < strlen(buf); i++)
|
|
- list->hid_debug_buf[(list->tail + i) % HID_DEBUG_BUFSIZE] =
|
|
- buf[i];
|
|
- list->tail = (list->tail + i) % HID_DEBUG_BUFSIZE;
|
|
- }
|
|
+ list_for_each_entry(list, &hdev->debug_list, node)
|
|
+ kfifo_in(&list->hid_debug_fifo, buf, strlen(buf));
|
|
spin_unlock_irqrestore(&hdev->debug_list_lock, flags);
|
|
|
|
wake_up_interruptible(&hdev->debug_wait);
|
|
@@ -720,8 +716,7 @@ void hid_dump_input(struct hid_device *hdev, struct hid_usage *usage, __s32 valu
|
|
hid_debug_event(hdev, buf);
|
|
|
|
kfree(buf);
|
|
- wake_up_interruptible(&hdev->debug_wait);
|
|
-
|
|
+ wake_up_interruptible(&hdev->debug_wait);
|
|
}
|
|
EXPORT_SYMBOL_GPL(hid_dump_input);
|
|
|
|
@@ -1086,8 +1081,8 @@ static int hid_debug_events_open(struct inode *inode, struct file *file)
|
|
goto out;
|
|
}
|
|
|
|
- if (!(list->hid_debug_buf = kzalloc(sizeof(char) * HID_DEBUG_BUFSIZE, GFP_KERNEL))) {
|
|
- err = -ENOMEM;
|
|
+ err = kfifo_alloc(&list->hid_debug_fifo, HID_DEBUG_FIFOSIZE, GFP_KERNEL);
|
|
+ if (err) {
|
|
kfree(list);
|
|
goto out;
|
|
}
|
|
@@ -1107,77 +1102,57 @@ static ssize_t hid_debug_events_read(struct file *file, char __user *buffer,
|
|
size_t count, loff_t *ppos)
|
|
{
|
|
struct hid_debug_list *list = file->private_data;
|
|
- int ret = 0, len;
|
|
+ int ret = 0, copied;
|
|
DECLARE_WAITQUEUE(wait, current);
|
|
|
|
mutex_lock(&list->read_mutex);
|
|
- while (ret == 0) {
|
|
- if (list->head == list->tail) {
|
|
- add_wait_queue(&list->hdev->debug_wait, &wait);
|
|
- set_current_state(TASK_INTERRUPTIBLE);
|
|
-
|
|
- while (list->head == list->tail) {
|
|
- if (file->f_flags & O_NONBLOCK) {
|
|
- ret = -EAGAIN;
|
|
- break;
|
|
- }
|
|
- if (signal_pending(current)) {
|
|
- ret = -ERESTARTSYS;
|
|
- break;
|
|
- }
|
|
+ if (kfifo_is_empty(&list->hid_debug_fifo)) {
|
|
+ add_wait_queue(&list->hdev->debug_wait, &wait);
|
|
+ set_current_state(TASK_INTERRUPTIBLE);
|
|
+
|
|
+ while (kfifo_is_empty(&list->hid_debug_fifo)) {
|
|
+ if (file->f_flags & O_NONBLOCK) {
|
|
+ ret = -EAGAIN;
|
|
+ break;
|
|
+ }
|
|
|
|
- if (!list->hdev || !list->hdev->debug) {
|
|
- ret = -EIO;
|
|
- set_current_state(TASK_RUNNING);
|
|
- goto out;
|
|
- }
|
|
+ if (signal_pending(current)) {
|
|
+ ret = -ERESTARTSYS;
|
|
+ break;
|
|
+ }
|
|
|
|
- /* allow O_NONBLOCK from other threads */
|
|
- mutex_unlock(&list->read_mutex);
|
|
- schedule();
|
|
- mutex_lock(&list->read_mutex);
|
|
- set_current_state(TASK_INTERRUPTIBLE);
|
|
+ /* if list->hdev is NULL we cannot remove_wait_queue().
|
|
+ * if list->hdev->debug is 0 then hid_debug_unregister()
|
|
+ * was already called and list->hdev is being destroyed.
|
|
+ * if we add remove_wait_queue() here we can hit a race.
|
|
+ */
|
|
+ if (!list->hdev || !list->hdev->debug) {
|
|
+ ret = -EIO;
|
|
+ set_current_state(TASK_RUNNING);
|
|
+ goto out;
|
|
}
|
|
|
|
- set_current_state(TASK_RUNNING);
|
|
- remove_wait_queue(&list->hdev->debug_wait, &wait);
|
|
+ /* allow O_NONBLOCK from other threads */
|
|
+ mutex_unlock(&list->read_mutex);
|
|
+ schedule();
|
|
+ mutex_lock(&list->read_mutex);
|
|
+ set_current_state(TASK_INTERRUPTIBLE);
|
|
}
|
|
|
|
- if (ret)
|
|
- goto out;
|
|
+ __set_current_state(TASK_RUNNING);
|
|
+ remove_wait_queue(&list->hdev->debug_wait, &wait);
|
|
|
|
- /* pass the ringbuffer contents to userspace */
|
|
-copy_rest:
|
|
- if (list->tail == list->head)
|
|
+ if (ret)
|
|
goto out;
|
|
- if (list->tail > list->head) {
|
|
- len = list->tail - list->head;
|
|
- if (len > count)
|
|
- len = count;
|
|
-
|
|
- if (copy_to_user(buffer + ret, &list->hid_debug_buf[list->head], len)) {
|
|
- ret = -EFAULT;
|
|
- goto out;
|
|
- }
|
|
- ret += len;
|
|
- list->head += len;
|
|
- } else {
|
|
- len = HID_DEBUG_BUFSIZE - list->head;
|
|
- if (len > count)
|
|
- len = count;
|
|
-
|
|
- if (copy_to_user(buffer, &list->hid_debug_buf[list->head], len)) {
|
|
- ret = -EFAULT;
|
|
- goto out;
|
|
- }
|
|
- list->head = 0;
|
|
- ret += len;
|
|
- count -= len;
|
|
- if (count > 0)
|
|
- goto copy_rest;
|
|
- }
|
|
-
|
|
}
|
|
+
|
|
+ /* pass the fifo content to userspace, locking is not needed with only
|
|
+ * one concurrent reader and one concurrent writer
|
|
+ */
|
|
+ ret = kfifo_to_user(&list->hid_debug_fifo, buffer, count, &copied);
|
|
+ if (ret)
|
|
+ goto out;
|
|
+ ret = copied;
|
|
out:
|
|
mutex_unlock(&list->read_mutex);
|
|
return ret;
|
|
@@ -1188,7 +1163,7 @@ static unsigned int hid_debug_events_poll(struct file *file, poll_table *wait)
|
|
struct hid_debug_list *list = file->private_data;
|
|
|
|
poll_wait(file, &list->hdev->debug_wait, wait);
|
|
- if (list->head != list->tail)
|
|
+ if (!kfifo_is_empty(&list->hid_debug_fifo))
|
|
return POLLIN | POLLRDNORM;
|
|
if (!list->hdev->debug)
|
|
return POLLERR | POLLHUP;
|
|
@@ -1203,7 +1178,7 @@ static int hid_debug_events_release(struct inode *inode, struct file *file)
|
|
spin_lock_irqsave(&list->hdev->debug_list_lock, flags);
|
|
list_del(&list->node);
|
|
spin_unlock_irqrestore(&list->hdev->debug_list_lock, flags);
|
|
- kfree(list->hid_debug_buf);
|
|
+ kfifo_free(&list->hid_debug_fifo);
|
|
kfree(list);
|
|
|
|
return 0;
|
|
@@ -1254,4 +1229,3 @@ void hid_debug_exit(void)
|
|
{
|
|
debugfs_remove_recursive(hid_debug_root);
|
|
}
|
|
-
|
|
diff --git a/drivers/hid/hid-lenovo.c b/drivers/hid/hid-lenovo.c
|
|
index 8979f1fd5208..24a4a23bdc90 100644
|
|
--- a/drivers/hid/hid-lenovo.c
|
|
+++ b/drivers/hid/hid-lenovo.c
|
|
@@ -703,7 +703,9 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
|
|
data_pointer->led_mute.brightness_get = lenovo_led_brightness_get_tpkbd;
|
|
data_pointer->led_mute.brightness_set = lenovo_led_brightness_set_tpkbd;
|
|
data_pointer->led_mute.dev = dev;
|
|
- led_classdev_register(dev, &data_pointer->led_mute);
|
|
+ ret = led_classdev_register(dev, &data_pointer->led_mute);
|
|
+ if (ret < 0)
|
|
+ goto err;
|
|
|
|
data_pointer->led_micmute.name = name_micmute;
|
|
data_pointer->led_micmute.brightness_get =
|
|
@@ -711,7 +713,11 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
|
|
data_pointer->led_micmute.brightness_set =
|
|
lenovo_led_brightness_set_tpkbd;
|
|
data_pointer->led_micmute.dev = dev;
|
|
- led_classdev_register(dev, &data_pointer->led_micmute);
|
|
+ ret = led_classdev_register(dev, &data_pointer->led_micmute);
|
|
+ if (ret < 0) {
|
|
+ led_classdev_unregister(&data_pointer->led_mute);
|
|
+ goto err;
|
|
+ }
|
|
|
|
lenovo_features_set_tpkbd(hdev);
|
|
|
|
diff --git a/drivers/hwmon/lm80.c b/drivers/hwmon/lm80.c
|
|
index 4bcd9b882948..cb6606a0470d 100644
|
|
--- a/drivers/hwmon/lm80.c
|
|
+++ b/drivers/hwmon/lm80.c
|
|
@@ -360,9 +360,11 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
|
|
struct i2c_client *client = data->client;
|
|
unsigned long min, val;
|
|
u8 reg;
|
|
- int err = kstrtoul(buf, 10, &val);
|
|
- if (err < 0)
|
|
- return err;
|
|
+ int rv;
|
|
+
|
|
+ rv = kstrtoul(buf, 10, &val);
|
|
+ if (rv < 0)
|
|
+ return rv;
|
|
|
|
/* Save fan_min */
|
|
mutex_lock(&data->update_lock);
|
|
@@ -390,8 +392,11 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
|
|
return -EINVAL;
|
|
}
|
|
|
|
- reg = (lm80_read_value(client, LM80_REG_FANDIV) &
|
|
- ~(3 << (2 * (nr + 1)))) | (data->fan_div[nr] << (2 * (nr + 1)));
|
|
+ rv = lm80_read_value(client, LM80_REG_FANDIV);
|
|
+ if (rv < 0)
|
|
+ return rv;
|
|
+ reg = (rv & ~(3 << (2 * (nr + 1))))
|
|
+ | (data->fan_div[nr] << (2 * (nr + 1)));
|
|
lm80_write_value(client, LM80_REG_FANDIV, reg);
|
|
|
|
/* Restore fan_min */
|
|
@@ -623,6 +628,7 @@ static int lm80_probe(struct i2c_client *client,
|
|
struct device *dev = &client->dev;
|
|
struct device *hwmon_dev;
|
|
struct lm80_data *data;
|
|
+ int rv;
|
|
|
|
data = devm_kzalloc(dev, sizeof(struct lm80_data), GFP_KERNEL);
|
|
if (!data)
|
|
@@ -635,8 +641,14 @@ static int lm80_probe(struct i2c_client *client,
|
|
lm80_init_client(client);
|
|
|
|
/* A few vars need to be filled upon startup */
|
|
- data->fan[f_min][0] = lm80_read_value(client, LM80_REG_FAN_MIN(1));
|
|
- data->fan[f_min][1] = lm80_read_value(client, LM80_REG_FAN_MIN(2));
|
|
+ rv = lm80_read_value(client, LM80_REG_FAN_MIN(1));
|
|
+ if (rv < 0)
|
|
+ return rv;
|
|
+ data->fan[f_min][0] = rv;
|
|
+ rv = lm80_read_value(client, LM80_REG_FAN_MIN(2));
|
|
+ if (rv < 0)
|
|
+ return rv;
|
|
+ data->fan[f_min][1] = rv;
|
|
|
|
hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
|
|
data, lm80_groups);
|
|
diff --git a/drivers/i2c/busses/i2c-axxia.c b/drivers/i2c/busses/i2c-axxia.c
|
|
index 9c9fd2e87a4b..1c68b05c8649 100644
|
|
--- a/drivers/i2c/busses/i2c-axxia.c
|
|
+++ b/drivers/i2c/busses/i2c-axxia.c
|
|
@@ -296,22 +296,7 @@ static irqreturn_t axxia_i2c_isr(int irq, void *_dev)
|
|
i2c_int_disable(idev, MST_STATUS_TFL);
|
|
}
|
|
|
|
- if (status & MST_STATUS_SCC) {
|
|
- /* Stop completed */
|
|
- i2c_int_disable(idev, ~MST_STATUS_TSS);
|
|
- complete(&idev->msg_complete);
|
|
- } else if (status & MST_STATUS_SNS) {
|
|
- /* Transfer done */
|
|
- i2c_int_disable(idev, ~MST_STATUS_TSS);
|
|
- if (i2c_m_rd(idev->msg) && idev->msg_xfrd < idev->msg->len)
|
|
- axxia_i2c_empty_rx_fifo(idev);
|
|
- complete(&idev->msg_complete);
|
|
- } else if (status & MST_STATUS_TSS) {
|
|
- /* Transfer timeout */
|
|
- idev->msg_err = -ETIMEDOUT;
|
|
- i2c_int_disable(idev, ~MST_STATUS_TSS);
|
|
- complete(&idev->msg_complete);
|
|
- } else if (unlikely(status & MST_STATUS_ERR)) {
|
|
+ if (unlikely(status & MST_STATUS_ERR)) {
|
|
/* Transfer error */
|
|
i2c_int_disable(idev, ~0);
|
|
if (status & MST_STATUS_AL)
|
|
@@ -328,6 +313,21 @@ static irqreturn_t axxia_i2c_isr(int irq, void *_dev)
|
|
readl(idev->base + MST_TX_BYTES_XFRD),
|
|
readl(idev->base + MST_TX_XFER));
|
|
complete(&idev->msg_complete);
|
|
+ } else if (status & MST_STATUS_SCC) {
|
|
+ /* Stop completed */
|
|
+ i2c_int_disable(idev, ~MST_STATUS_TSS);
|
|
+ complete(&idev->msg_complete);
|
|
+ } else if (status & MST_STATUS_SNS) {
|
|
+ /* Transfer done */
|
|
+ i2c_int_disable(idev, ~MST_STATUS_TSS);
|
|
+ if (i2c_m_rd(idev->msg) && idev->msg_xfrd < idev->msg->len)
|
|
+ axxia_i2c_empty_rx_fifo(idev);
|
|
+ complete(&idev->msg_complete);
|
|
+ } else if (status & MST_STATUS_TSS) {
|
|
+ /* Transfer timeout */
|
|
+ idev->msg_err = -ETIMEDOUT;
|
|
+ i2c_int_disable(idev, ~MST_STATUS_TSS);
|
|
+ complete(&idev->msg_complete);
|
|
}
|
|
|
|
out:
|
|
diff --git a/drivers/input/misc/bma150.c b/drivers/input/misc/bma150.c
|
|
index 1d0e61d7c131..b6c1d1d482c1 100644
|
|
--- a/drivers/input/misc/bma150.c
|
|
+++ b/drivers/input/misc/bma150.c
|
|
@@ -482,13 +482,14 @@ static int bma150_register_input_device(struct bma150_data *bma150)
|
|
idev->close = bma150_irq_close;
|
|
input_set_drvdata(idev, bma150);
|
|
|
|
+ bma150->input = idev;
|
|
+
|
|
error = input_register_device(idev);
|
|
if (error) {
|
|
input_free_device(idev);
|
|
return error;
|
|
}
|
|
|
|
- bma150->input = idev;
|
|
return 0;
|
|
}
|
|
|
|
@@ -511,15 +512,15 @@ static int bma150_register_polled_device(struct bma150_data *bma150)
|
|
|
|
bma150_init_input_device(bma150, ipoll_dev->input);
|
|
|
|
+ bma150->input_polled = ipoll_dev;
|
|
+ bma150->input = ipoll_dev->input;
|
|
+
|
|
error = input_register_polled_device(ipoll_dev);
|
|
if (error) {
|
|
input_free_polled_device(ipoll_dev);
|
|
return error;
|
|
}
|
|
|
|
- bma150->input_polled = ipoll_dev;
|
|
- bma150->input = ipoll_dev->input;
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c
|
|
index 30adc5745cba..25ce9047b682 100644
|
|
--- a/drivers/input/mouse/elan_i2c_core.c
|
|
+++ b/drivers/input/mouse/elan_i2c_core.c
|
|
@@ -1240,7 +1240,6 @@ MODULE_DEVICE_TABLE(i2c, elan_id);
|
|
static const struct acpi_device_id elan_acpi_id[] = {
|
|
{ "ELAN0000", 0 },
|
|
{ "ELAN0100", 0 },
|
|
- { "ELAN0501", 0 },
|
|
{ "ELAN0600", 0 },
|
|
{ "ELAN0602", 0 },
|
|
{ "ELAN0605", 0 },
|
|
@@ -1251,6 +1250,7 @@ static const struct acpi_device_id elan_acpi_id[] = {
|
|
{ "ELAN060C", 0 },
|
|
{ "ELAN0611", 0 },
|
|
{ "ELAN0612", 0 },
|
|
+ { "ELAN0617", 0 },
|
|
{ "ELAN0618", 0 },
|
|
{ "ELAN061C", 0 },
|
|
{ "ELAN061D", 0 },
|
|
diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c
|
|
index 84aead19622c..4c1e527f14a5 100644
|
|
--- a/drivers/input/mouse/elantech.c
|
|
+++ b/drivers/input/mouse/elantech.c
|
|
@@ -1121,6 +1121,8 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse,
|
|
* Asus UX31 0x361f00 20, 15, 0e clickpad
|
|
* Asus UX32VD 0x361f02 00, 15, 0e clickpad
|
|
* Avatar AVIU-145A2 0x361f00 ? clickpad
|
|
+ * Fujitsu CELSIUS H760 0x570f02 40, 14, 0c 3 hw buttons (**)
|
|
+ * Fujitsu CELSIUS H780 0x5d0f02 41, 16, 0d 3 hw buttons (**)
|
|
* Fujitsu LIFEBOOK E544 0x470f00 d0, 12, 09 2 hw buttons
|
|
* Fujitsu LIFEBOOK E546 0x470f00 50, 12, 09 2 hw buttons
|
|
* Fujitsu LIFEBOOK E547 0x470f00 50, 12, 09 2 hw buttons
|
|
@@ -1173,6 +1175,13 @@ static const struct dmi_system_id elantech_dmi_has_middle_button[] = {
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H760"),
|
|
},
|
|
},
|
|
+ {
|
|
+ /* Fujitsu H780 also has a middle button */
|
|
+ .matches = {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "CELSIUS H780"),
|
|
+ },
|
|
+ },
|
|
#endif
|
|
{ }
|
|
};
|
|
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
|
|
index fc6eb752ab35..eb9937225d64 100644
|
|
--- a/drivers/iommu/arm-smmu-v3.c
|
|
+++ b/drivers/iommu/arm-smmu-v3.c
|
|
@@ -683,7 +683,13 @@ static void queue_inc_cons(struct arm_smmu_queue *q)
|
|
u32 cons = (Q_WRP(q, q->cons) | Q_IDX(q, q->cons)) + 1;
|
|
|
|
q->cons = Q_OVF(q, q->cons) | Q_WRP(q, cons) | Q_IDX(q, cons);
|
|
- writel(q->cons, q->cons_reg);
|
|
+
|
|
+ /*
|
|
+ * Ensure that all CPU accesses (reads and writes) to the queue
|
|
+ * are complete before we update the cons pointer.
|
|
+ */
|
|
+ mb();
|
|
+ writel_relaxed(q->cons, q->cons_reg);
|
|
}
|
|
|
|
static int queue_sync_prod(struct arm_smmu_queue *q)
|
|
diff --git a/drivers/isdn/hisax/hfc_pci.c b/drivers/isdn/hisax/hfc_pci.c
|
|
index 90449e1e91e5..1b1453d62fed 100644
|
|
--- a/drivers/isdn/hisax/hfc_pci.c
|
|
+++ b/drivers/isdn/hisax/hfc_pci.c
|
|
@@ -1169,11 +1169,13 @@ HFCPCI_l1hw(struct PStack *st, int pr, void *arg)
|
|
if (cs->debug & L1_DEB_LAPD)
|
|
debugl1(cs, "-> PH_REQUEST_PULL");
|
|
#endif
|
|
+ spin_lock_irqsave(&cs->lock, flags);
|
|
if (!cs->tx_skb) {
|
|
test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
|
|
st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
|
|
} else
|
|
test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
|
|
+ spin_unlock_irqrestore(&cs->lock, flags);
|
|
break;
|
|
case (HW_RESET | REQUEST):
|
|
spin_lock_irqsave(&cs->lock, flags);
|
|
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
|
|
index bc4e6825ff62..07eaa9f90712 100644
|
|
--- a/drivers/md/dm-thin.c
|
|
+++ b/drivers/md/dm-thin.c
|
|
@@ -256,6 +256,7 @@ struct pool {
|
|
|
|
spinlock_t lock;
|
|
struct bio_list deferred_flush_bios;
|
|
+ struct bio_list deferred_flush_completions;
|
|
struct list_head prepared_mappings;
|
|
struct list_head prepared_discards;
|
|
struct list_head active_thins;
|
|
@@ -920,6 +921,39 @@ static void process_prepared_mapping_fail(struct dm_thin_new_mapping *m)
|
|
mempool_free(m, m->tc->pool->mapping_pool);
|
|
}
|
|
|
|
+static void complete_overwrite_bio(struct thin_c *tc, struct bio *bio)
|
|
+{
|
|
+ struct pool *pool = tc->pool;
|
|
+ unsigned long flags;
|
|
+
|
|
+ /*
|
|
+ * If the bio has the REQ_FUA flag set we must commit the metadata
|
|
+ * before signaling its completion.
|
|
+ */
|
|
+ if (!bio_triggers_commit(tc, bio)) {
|
|
+ bio_endio(bio);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Complete bio with an error if earlier I/O caused changes to the
|
|
+ * metadata that can't be committed, e.g, due to I/O errors on the
|
|
+ * metadata device.
|
|
+ */
|
|
+ if (dm_thin_aborted_changes(tc->td)) {
|
|
+ bio_io_error(bio);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Batch together any bios that trigger commits and then issue a
|
|
+ * single commit for them in process_deferred_bios().
|
|
+ */
|
|
+ spin_lock_irqsave(&pool->lock, flags);
|
|
+ bio_list_add(&pool->deferred_flush_completions, bio);
|
|
+ spin_unlock_irqrestore(&pool->lock, flags);
|
|
+}
|
|
+
|
|
static void process_prepared_mapping(struct dm_thin_new_mapping *m)
|
|
{
|
|
struct thin_c *tc = m->tc;
|
|
@@ -952,7 +986,7 @@ static void process_prepared_mapping(struct dm_thin_new_mapping *m)
|
|
*/
|
|
if (bio) {
|
|
inc_remap_and_issue_cell(tc, m->cell, m->data_block);
|
|
- bio_endio(bio);
|
|
+ complete_overwrite_bio(tc, bio);
|
|
} else {
|
|
inc_all_io_entry(tc->pool, m->cell->holder);
|
|
remap_and_issue(tc, m->cell->holder, m->data_block);
|
|
@@ -2228,7 +2262,7 @@ static void process_deferred_bios(struct pool *pool)
|
|
{
|
|
unsigned long flags;
|
|
struct bio *bio;
|
|
- struct bio_list bios;
|
|
+ struct bio_list bios, bio_completions;
|
|
struct thin_c *tc;
|
|
|
|
tc = get_first_thin(pool);
|
|
@@ -2239,26 +2273,36 @@ static void process_deferred_bios(struct pool *pool)
|
|
}
|
|
|
|
/*
|
|
- * If there are any deferred flush bios, we must commit
|
|
- * the metadata before issuing them.
|
|
+ * If there are any deferred flush bios, we must commit the metadata
|
|
+ * before issuing them or signaling their completion.
|
|
*/
|
|
bio_list_init(&bios);
|
|
+ bio_list_init(&bio_completions);
|
|
+
|
|
spin_lock_irqsave(&pool->lock, flags);
|
|
bio_list_merge(&bios, &pool->deferred_flush_bios);
|
|
bio_list_init(&pool->deferred_flush_bios);
|
|
+
|
|
+ bio_list_merge(&bio_completions, &pool->deferred_flush_completions);
|
|
+ bio_list_init(&pool->deferred_flush_completions);
|
|
spin_unlock_irqrestore(&pool->lock, flags);
|
|
|
|
- if (bio_list_empty(&bios) &&
|
|
+ if (bio_list_empty(&bios) && bio_list_empty(&bio_completions) &&
|
|
!(dm_pool_changed_this_transaction(pool->pmd) && need_commit_due_to_time(pool)))
|
|
return;
|
|
|
|
if (commit(pool)) {
|
|
+ bio_list_merge(&bios, &bio_completions);
|
|
+
|
|
while ((bio = bio_list_pop(&bios)))
|
|
bio_io_error(bio);
|
|
return;
|
|
}
|
|
pool->last_commit_jiffies = jiffies;
|
|
|
|
+ while ((bio = bio_list_pop(&bio_completions)))
|
|
+ bio_endio(bio);
|
|
+
|
|
while ((bio = bio_list_pop(&bios)))
|
|
generic_make_request(bio);
|
|
}
|
|
@@ -2885,6 +2929,7 @@ static struct pool *pool_create(struct mapped_device *pool_md,
|
|
INIT_DELAYED_WORK(&pool->no_space_timeout, do_no_space_timeout);
|
|
spin_lock_init(&pool->lock);
|
|
bio_list_init(&pool->deferred_flush_bios);
|
|
+ bio_list_init(&pool->deferred_flush_completions);
|
|
INIT_LIST_HEAD(&pool->prepared_mappings);
|
|
INIT_LIST_HEAD(&pool->prepared_discards);
|
|
INIT_LIST_HEAD(&pool->active_thins);
|
|
diff --git a/drivers/media/platform/davinci/vpbe.c b/drivers/media/platform/davinci/vpbe.c
|
|
index 9a6c2cc38acb..abce9c4a1a8e 100644
|
|
--- a/drivers/media/platform/davinci/vpbe.c
|
|
+++ b/drivers/media/platform/davinci/vpbe.c
|
|
@@ -753,7 +753,7 @@ static int vpbe_initialize(struct device *dev, struct vpbe_device *vpbe_dev)
|
|
if (ret) {
|
|
v4l2_err(&vpbe_dev->v4l2_dev, "Failed to set default output %s",
|
|
def_output);
|
|
- return ret;
|
|
+ goto fail_kfree_amp;
|
|
}
|
|
|
|
printk(KERN_NOTICE "Setting default mode to %s\n", def_mode);
|
|
@@ -761,12 +761,15 @@ static int vpbe_initialize(struct device *dev, struct vpbe_device *vpbe_dev)
|
|
if (ret) {
|
|
v4l2_err(&vpbe_dev->v4l2_dev, "Failed to set default mode %s",
|
|
def_mode);
|
|
- return ret;
|
|
+ goto fail_kfree_amp;
|
|
}
|
|
vpbe_dev->initialized = 1;
|
|
/* TBD handling of bootargs for default output and mode */
|
|
return 0;
|
|
|
|
+fail_kfree_amp:
|
|
+ mutex_lock(&vpbe_dev->lock);
|
|
+ kfree(vpbe_dev->amp);
|
|
fail_kfree_encoders:
|
|
kfree(vpbe_dev->encoders);
|
|
fail_dev_unregister:
|
|
diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c
|
|
index a0547dbf9806..4d673a626db4 100644
|
|
--- a/drivers/memstick/core/memstick.c
|
|
+++ b/drivers/memstick/core/memstick.c
|
|
@@ -18,6 +18,7 @@
|
|
#include <linux/delay.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/module.h>
|
|
+#include <linux/pm_runtime.h>
|
|
|
|
#define DRIVER_NAME "memstick"
|
|
|
|
@@ -436,6 +437,7 @@ static void memstick_check(struct work_struct *work)
|
|
struct memstick_dev *card;
|
|
|
|
dev_dbg(&host->dev, "memstick_check started\n");
|
|
+ pm_runtime_get_noresume(host->dev.parent);
|
|
mutex_lock(&host->lock);
|
|
if (!host->card) {
|
|
if (memstick_power_on(host))
|
|
@@ -479,6 +481,7 @@ out_power_off:
|
|
host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_OFF);
|
|
|
|
mutex_unlock(&host->lock);
|
|
+ pm_runtime_put(host->dev.parent);
|
|
dev_dbg(&host->dev, "memstick_check finished\n");
|
|
}
|
|
|
|
diff --git a/drivers/misc/vexpress-syscfg.c b/drivers/misc/vexpress-syscfg.c
|
|
index c344483fa7d6..9f257c53e6d4 100644
|
|
--- a/drivers/misc/vexpress-syscfg.c
|
|
+++ b/drivers/misc/vexpress-syscfg.c
|
|
@@ -61,7 +61,7 @@ static int vexpress_syscfg_exec(struct vexpress_syscfg_func *func,
|
|
int tries;
|
|
long timeout;
|
|
|
|
- if (WARN_ON(index > func->num_templates))
|
|
+ if (WARN_ON(index >= func->num_templates))
|
|
return -EINVAL;
|
|
|
|
command = readl(syscfg->base + SYS_CFGCTRL);
|
|
diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
|
|
index 43fa16b5f510..672c02e32a39 100644
|
|
--- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
|
|
+++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c
|
|
@@ -168,9 +168,10 @@ int gpmi_init(struct gpmi_nand_data *this)
|
|
|
|
/*
|
|
* Reset BCH here, too. We got failures otherwise :(
|
|
- * See later BCH reset for explanation of MX23 handling
|
|
+ * See later BCH reset for explanation of MX23 and MX28 handling
|
|
*/
|
|
- ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MX23(this));
|
|
+ ret = gpmi_reset_block(r->bch_regs,
|
|
+ GPMI_IS_MX23(this) || GPMI_IS_MX28(this));
|
|
if (ret)
|
|
goto err_out;
|
|
|
|
@@ -274,13 +275,11 @@ int bch_set_geometry(struct gpmi_nand_data *this)
|
|
|
|
/*
|
|
* Due to erratum #2847 of the MX23, the BCH cannot be soft reset on this
|
|
- * chip, otherwise it will lock up. So we skip resetting BCH on the MX23.
|
|
- * On the other hand, the MX28 needs the reset, because one case has been
|
|
- * seen where the BCH produced ECC errors constantly after 10000
|
|
- * consecutive reboots. The latter case has not been seen on the MX23
|
|
- * yet, still we don't know if it could happen there as well.
|
|
+ * chip, otherwise it will lock up. So we skip resetting BCH on the MX23
|
|
+ * and MX28.
|
|
*/
|
|
- ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MX23(this));
|
|
+ ret = gpmi_reset_block(r->bch_regs,
|
|
+ GPMI_IS_MX23(this) || GPMI_IS_MX28(this));
|
|
if (ret)
|
|
goto err_out;
|
|
|
|
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
|
|
index 7a6dd5e5e498..143b9a384af8 100644
|
|
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
|
|
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
|
|
@@ -400,7 +400,6 @@ static void bcm_sysport_get_wol(struct net_device *dev,
|
|
struct ethtool_wolinfo *wol)
|
|
{
|
|
struct bcm_sysport_priv *priv = netdev_priv(dev);
|
|
- u32 reg;
|
|
|
|
wol->supported = WAKE_MAGIC | WAKE_MAGICSECURE;
|
|
wol->wolopts = priv->wolopts;
|
|
@@ -408,11 +407,7 @@ static void bcm_sysport_get_wol(struct net_device *dev,
|
|
if (!(priv->wolopts & WAKE_MAGICSECURE))
|
|
return;
|
|
|
|
- /* Return the programmed SecureOn password */
|
|
- reg = umac_readl(priv, UMAC_PSW_MS);
|
|
- put_unaligned_be16(reg, &wol->sopass[0]);
|
|
- reg = umac_readl(priv, UMAC_PSW_LS);
|
|
- put_unaligned_be32(reg, &wol->sopass[2]);
|
|
+ memcpy(wol->sopass, priv->sopass, sizeof(priv->sopass));
|
|
}
|
|
|
|
static int bcm_sysport_set_wol(struct net_device *dev,
|
|
@@ -428,13 +423,8 @@ static int bcm_sysport_set_wol(struct net_device *dev,
|
|
if (wol->wolopts & ~supported)
|
|
return -EINVAL;
|
|
|
|
- /* Program the SecureOn password */
|
|
- if (wol->wolopts & WAKE_MAGICSECURE) {
|
|
- umac_writel(priv, get_unaligned_be16(&wol->sopass[0]),
|
|
- UMAC_PSW_MS);
|
|
- umac_writel(priv, get_unaligned_be32(&wol->sopass[2]),
|
|
- UMAC_PSW_LS);
|
|
- }
|
|
+ if (wol->wolopts & WAKE_MAGICSECURE)
|
|
+ memcpy(priv->sopass, wol->sopass, sizeof(priv->sopass));
|
|
|
|
/* Flag the device and relevant IRQ as wakeup capable */
|
|
if (wol->wolopts) {
|
|
@@ -1889,12 +1879,17 @@ static int bcm_sysport_suspend_to_wol(struct bcm_sysport_priv *priv)
|
|
unsigned int timeout = 1000;
|
|
u32 reg;
|
|
|
|
- /* Password has already been programmed */
|
|
reg = umac_readl(priv, UMAC_MPD_CTRL);
|
|
reg |= MPD_EN;
|
|
reg &= ~PSW_EN;
|
|
- if (priv->wolopts & WAKE_MAGICSECURE)
|
|
+ if (priv->wolopts & WAKE_MAGICSECURE) {
|
|
+ /* Program the SecureOn password */
|
|
+ umac_writel(priv, get_unaligned_be16(&priv->sopass[0]),
|
|
+ UMAC_PSW_MS);
|
|
+ umac_writel(priv, get_unaligned_be32(&priv->sopass[2]),
|
|
+ UMAC_PSW_LS);
|
|
reg |= PSW_EN;
|
|
+ }
|
|
umac_writel(priv, reg, UMAC_MPD_CTRL);
|
|
|
|
/* Make sure RBUF entered WoL mode as result */
|
|
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h
|
|
index 8ace6ecb5f79..e668b1ce5828 100644
|
|
--- a/drivers/net/ethernet/broadcom/bcmsysport.h
|
|
+++ b/drivers/net/ethernet/broadcom/bcmsysport.h
|
|
@@ -11,6 +11,7 @@
|
|
#ifndef __BCM_SYSPORT_H
|
|
#define __BCM_SYSPORT_H
|
|
|
|
+#include <linux/ethtool.h>
|
|
#include <linux/if_vlan.h>
|
|
|
|
/* Receive/transmit descriptor format */
|
|
@@ -682,6 +683,7 @@ struct bcm_sysport_priv {
|
|
unsigned int crc_fwd:1;
|
|
u16 rev;
|
|
u32 wolopts;
|
|
+ u8 sopass[SOPASS_MAX];
|
|
unsigned int wol_irq_disabled:1;
|
|
|
|
/* MIB related fields */
|
|
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c
|
|
index 0433fdebda25..9ef4caa4b84d 100644
|
|
--- a/drivers/net/ethernet/cisco/enic/enic_main.c
|
|
+++ b/drivers/net/ethernet/cisco/enic/enic_main.c
|
|
@@ -1180,7 +1180,7 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
|
|
* CHECSUM_UNNECESSARY.
|
|
*/
|
|
if ((netdev->features & NETIF_F_RXCSUM) && tcp_udp_csum_ok &&
|
|
- ipv4_csum_ok)
|
|
+ (ipv4_csum_ok || ipv6))
|
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
|
|
|
if (vlan_stripped)
|
|
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
|
|
index 02b23f6277fb..c1796aa2dde5 100644
|
|
--- a/drivers/net/ethernet/intel/igb/igb_main.c
|
|
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
|
|
@@ -7339,9 +7339,11 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake,
|
|
rtnl_unlock();
|
|
|
|
#ifdef CONFIG_PM
|
|
- retval = pci_save_state(pdev);
|
|
- if (retval)
|
|
- return retval;
|
|
+ if (!runtime) {
|
|
+ retval = pci_save_state(pdev);
|
|
+ if (retval)
|
|
+ return retval;
|
|
+ }
|
|
#endif
|
|
|
|
status = rd32(E1000_STATUS);
|
|
diff --git a/drivers/net/ethernet/marvell/skge.c b/drivers/net/ethernet/marvell/skge.c
|
|
index 7173836fe361..c9f4b5412844 100644
|
|
--- a/drivers/net/ethernet/marvell/skge.c
|
|
+++ b/drivers/net/ethernet/marvell/skge.c
|
|
@@ -152,8 +152,10 @@ static void skge_get_regs(struct net_device *dev, struct ethtool_regs *regs,
|
|
memset(p, 0, regs->len);
|
|
memcpy_fromio(p, io, B3_RAM_ADDR);
|
|
|
|
- memcpy_fromio(p + B3_RI_WTO_R1, io + B3_RI_WTO_R1,
|
|
- regs->len - B3_RI_WTO_R1);
|
|
+ if (regs->len > B3_RI_WTO_R1) {
|
|
+ memcpy_fromio(p + B3_RI_WTO_R1, io + B3_RI_WTO_R1,
|
|
+ regs->len - B3_RI_WTO_R1);
|
|
+ }
|
|
}
|
|
|
|
/* Wake on Lan only supported on Yukon chips with rev 1 or above */
|
|
diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c
|
|
index ccebf89aa1e4..85f3a2c0d4dd 100644
|
|
--- a/drivers/net/ethernet/sun/niu.c
|
|
+++ b/drivers/net/ethernet/sun/niu.c
|
|
@@ -8121,6 +8121,8 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
|
|
start += 3;
|
|
|
|
prop_len = niu_pci_eeprom_read(np, start + 4);
|
|
+ if (prop_len < 0)
|
|
+ return prop_len;
|
|
err = niu_pci_vpd_get_propname(np, start + 5, namebuf, 64);
|
|
if (err < 0)
|
|
return err;
|
|
@@ -8165,8 +8167,12 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
|
|
netif_printk(np, probe, KERN_DEBUG, np->dev,
|
|
"VPD_SCAN: Reading in property [%s] len[%d]\n",
|
|
namebuf, prop_len);
|
|
- for (i = 0; i < prop_len; i++)
|
|
- *prop_buf++ = niu_pci_eeprom_read(np, off + i);
|
|
+ for (i = 0; i < prop_len; i++) {
|
|
+ err = niu_pci_eeprom_read(np, off + i);
|
|
+ if (err >= 0)
|
|
+ *prop_buf = err;
|
|
+ ++prop_buf;
|
|
+ }
|
|
}
|
|
|
|
start += len;
|
|
diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c
|
|
index dc934347ae28..e6f564d50663 100644
|
|
--- a/drivers/net/phy/dp83640.c
|
|
+++ b/drivers/net/phy/dp83640.c
|
|
@@ -890,14 +890,14 @@ static void decode_txts(struct dp83640_private *dp83640,
|
|
struct phy_txts *phy_txts)
|
|
{
|
|
struct skb_shared_hwtstamps shhwtstamps;
|
|
+ struct dp83640_skb_info *skb_info;
|
|
struct sk_buff *skb;
|
|
- u64 ns;
|
|
u8 overflow;
|
|
+ u64 ns;
|
|
|
|
/* We must already have the skb that triggered this. */
|
|
-
|
|
+again:
|
|
skb = skb_dequeue(&dp83640->tx_queue);
|
|
-
|
|
if (!skb) {
|
|
pr_debug("have timestamp but tx_queue empty\n");
|
|
return;
|
|
@@ -912,6 +912,11 @@ static void decode_txts(struct dp83640_private *dp83640,
|
|
}
|
|
return;
|
|
}
|
|
+ skb_info = (struct dp83640_skb_info *)skb->cb;
|
|
+ if (time_after(jiffies, skb_info->tmo)) {
|
|
+ kfree_skb(skb);
|
|
+ goto again;
|
|
+ }
|
|
|
|
ns = phy2txts(phy_txts);
|
|
memset(&shhwtstamps, 0, sizeof(shhwtstamps));
|
|
@@ -1461,6 +1466,7 @@ static bool dp83640_rxtstamp(struct phy_device *phydev,
|
|
static void dp83640_txtstamp(struct phy_device *phydev,
|
|
struct sk_buff *skb, int type)
|
|
{
|
|
+ struct dp83640_skb_info *skb_info = (struct dp83640_skb_info *)skb->cb;
|
|
struct dp83640_private *dp83640 = phydev->priv;
|
|
|
|
switch (dp83640->hwts_tx_en) {
|
|
@@ -1473,6 +1479,7 @@ static void dp83640_txtstamp(struct phy_device *phydev,
|
|
/* fall through */
|
|
case HWTSTAMP_TX_ON:
|
|
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
|
+ skb_info->tmo = jiffies + SKB_TIMESTAMP_TIMEOUT;
|
|
skb_queue_tail(&dp83640->tx_queue, skb);
|
|
break;
|
|
|
|
diff --git a/drivers/net/usb/ch9200.c b/drivers/net/usb/ch9200.c
|
|
index 5e151e6a3e09..3c7715ea40c1 100644
|
|
--- a/drivers/net/usb/ch9200.c
|
|
+++ b/drivers/net/usb/ch9200.c
|
|
@@ -255,14 +255,9 @@ static struct sk_buff *ch9200_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
|
|
tx_overhead = 0x40;
|
|
|
|
len = skb->len;
|
|
- if (skb_headroom(skb) < tx_overhead) {
|
|
- struct sk_buff *skb2;
|
|
-
|
|
- skb2 = skb_copy_expand(skb, tx_overhead, 0, flags);
|
|
+ if (skb_cow_head(skb, tx_overhead)) {
|
|
dev_kfree_skb_any(skb);
|
|
- skb = skb2;
|
|
- if (!skb)
|
|
- return NULL;
|
|
+ return NULL;
|
|
}
|
|
|
|
__skb_push(skb, tx_overhead);
|
|
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c
|
|
index cd93220c9b45..a628db738b8a 100644
|
|
--- a/drivers/net/usb/kaweth.c
|
|
+++ b/drivers/net/usb/kaweth.c
|
|
@@ -812,18 +812,12 @@ static netdev_tx_t kaweth_start_xmit(struct sk_buff *skb,
|
|
}
|
|
|
|
/* We now decide whether we can put our special header into the sk_buff */
|
|
- if (skb_cloned(skb) || skb_headroom(skb) < 2) {
|
|
- /* no such luck - we make our own */
|
|
- struct sk_buff *copied_skb;
|
|
- copied_skb = skb_copy_expand(skb, 2, 0, GFP_ATOMIC);
|
|
- dev_kfree_skb_irq(skb);
|
|
- skb = copied_skb;
|
|
- if (!copied_skb) {
|
|
- kaweth->stats.tx_errors++;
|
|
- netif_start_queue(net);
|
|
- spin_unlock_irq(&kaweth->device_lock);
|
|
- return NETDEV_TX_OK;
|
|
- }
|
|
+ if (skb_cow_head(skb, 2)) {
|
|
+ kaweth->stats.tx_errors++;
|
|
+ netif_start_queue(net);
|
|
+ spin_unlock_irq(&kaweth->device_lock);
|
|
+ dev_kfree_skb_any(skb);
|
|
+ return NETDEV_TX_OK;
|
|
}
|
|
|
|
private_header = (__le16 *)__skb_push(skb, 2);
|
|
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
|
|
index 7cee7777d13f..b6b8aec73b28 100644
|
|
--- a/drivers/net/usb/smsc95xx.c
|
|
+++ b/drivers/net/usb/smsc95xx.c
|
|
@@ -1838,13 +1838,13 @@ static struct sk_buff *smsc95xx_tx_fixup(struct usbnet *dev,
|
|
/* We do not advertise SG, so skbs should be already linearized */
|
|
BUG_ON(skb_shinfo(skb)->nr_frags);
|
|
|
|
- if (skb_headroom(skb) < overhead) {
|
|
- struct sk_buff *skb2 = skb_copy_expand(skb,
|
|
- overhead, 0, flags);
|
|
+ /* Make writable and expand header space by overhead if required */
|
|
+ if (skb_cow_head(skb, overhead)) {
|
|
+ /* Must deallocate here as returning NULL to indicate error
|
|
+ * means the skb won't be deallocated in the caller.
|
|
+ */
|
|
dev_kfree_skb_any(skb);
|
|
- skb = skb2;
|
|
- if (!skb)
|
|
- return NULL;
|
|
+ return NULL;
|
|
}
|
|
|
|
if (csum) {
|
|
diff --git a/drivers/net/wireless/cw1200/scan.c b/drivers/net/wireless/cw1200/scan.c
|
|
index bff81b8d4164..9f1037e7e55c 100644
|
|
--- a/drivers/net/wireless/cw1200/scan.c
|
|
+++ b/drivers/net/wireless/cw1200/scan.c
|
|
@@ -78,6 +78,10 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
|
|
if (req->n_ssids > WSM_SCAN_MAX_NUM_OF_SSIDS)
|
|
return -EINVAL;
|
|
|
|
+ /* will be unlocked in cw1200_scan_work() */
|
|
+ down(&priv->scan.lock);
|
|
+ mutex_lock(&priv->conf_mutex);
|
|
+
|
|
frame.skb = ieee80211_probereq_get(hw, priv->vif->addr, NULL, 0,
|
|
req->ie_len);
|
|
if (!frame.skb)
|
|
@@ -86,19 +90,15 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
|
|
if (req->ie_len)
|
|
memcpy(skb_put(frame.skb, req->ie_len), req->ie, req->ie_len);
|
|
|
|
- /* will be unlocked in cw1200_scan_work() */
|
|
- down(&priv->scan.lock);
|
|
- mutex_lock(&priv->conf_mutex);
|
|
-
|
|
ret = wsm_set_template_frame(priv, &frame);
|
|
if (!ret) {
|
|
/* Host want to be the probe responder. */
|
|
ret = wsm_set_probe_responder(priv, true);
|
|
}
|
|
if (ret) {
|
|
+ dev_kfree_skb(frame.skb);
|
|
mutex_unlock(&priv->conf_mutex);
|
|
up(&priv->scan.lock);
|
|
- dev_kfree_skb(frame.skb);
|
|
return ret;
|
|
}
|
|
|
|
@@ -120,10 +120,9 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
|
|
++priv->scan.n_ssids;
|
|
}
|
|
|
|
- mutex_unlock(&priv->conf_mutex);
|
|
-
|
|
if (frame.skb)
|
|
dev_kfree_skb(frame.skb);
|
|
+ mutex_unlock(&priv->conf_mutex);
|
|
queue_work(priv->workqueue, &priv->scan.work);
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/nfc/nxp-nci/firmware.c b/drivers/nfc/nxp-nci/firmware.c
|
|
index 5291797324ba..553011f58339 100644
|
|
--- a/drivers/nfc/nxp-nci/firmware.c
|
|
+++ b/drivers/nfc/nxp-nci/firmware.c
|
|
@@ -24,7 +24,7 @@
|
|
#include <linux/completion.h>
|
|
#include <linux/firmware.h>
|
|
#include <linux/nfc.h>
|
|
-#include <linux/unaligned/access_ok.h>
|
|
+#include <asm/unaligned.h>
|
|
|
|
#include "nxp-nci.h"
|
|
|
|
diff --git a/drivers/nfc/nxp-nci/i2c.c b/drivers/nfc/nxp-nci/i2c.c
|
|
index df4333c7ee0f..0b1122cb5d0c 100644
|
|
--- a/drivers/nfc/nxp-nci/i2c.c
|
|
+++ b/drivers/nfc/nxp-nci/i2c.c
|
|
@@ -36,7 +36,7 @@
|
|
#include <linux/of_gpio.h>
|
|
#include <linux/of_irq.h>
|
|
#include <linux/platform_data/nxp-nci.h>
|
|
-#include <linux/unaligned/access_ok.h>
|
|
+#include <asm/unaligned.h>
|
|
|
|
#include <net/nfc/nfc.h>
|
|
|
|
diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c
|
|
index 9736f9be5447..a9d2e8a0aa85 100644
|
|
--- a/drivers/pinctrl/qcom/pinctrl-msm.c
|
|
+++ b/drivers/pinctrl/qcom/pinctrl-msm.c
|
|
@@ -806,11 +806,24 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
|
|
return ret;
|
|
}
|
|
|
|
- ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev), 0, 0, chip->ngpio);
|
|
- if (ret) {
|
|
- dev_err(pctrl->dev, "Failed to add pin range\n");
|
|
- gpiochip_remove(&pctrl->chip);
|
|
- return ret;
|
|
+ /*
|
|
+ * For DeviceTree-supported systems, the gpio core checks the
|
|
+ * pinctrl's device node for the "gpio-ranges" property.
|
|
+ * If it is present, it takes care of adding the pin ranges
|
|
+ * for the driver. In this case the driver can skip ahead.
|
|
+ *
|
|
+ * In order to remain compatible with older, existing DeviceTree
|
|
+ * files which don't set the "gpio-ranges" property or systems that
|
|
+ * utilize ACPI the driver has to call gpiochip_add_pin_range().
|
|
+ */
|
|
+ if (!of_property_read_bool(pctrl->dev->of_node, "gpio-ranges")) {
|
|
+ ret = gpiochip_add_pin_range(&pctrl->chip,
|
|
+ dev_name(pctrl->dev), 0, 0, chip->ngpio);
|
|
+ if (ret) {
|
|
+ dev_err(pctrl->dev, "Failed to add pin range\n");
|
|
+ gpiochip_remove(&pctrl->chip);
|
|
+ return ret;
|
|
+ }
|
|
}
|
|
|
|
ret = gpiochip_irqchip_add(chip,
|
|
diff --git a/drivers/ptp/ptp_chardev.c b/drivers/ptp/ptp_chardev.c
|
|
index 4eb254a273f8..4861cfddcdd3 100644
|
|
--- a/drivers/ptp/ptp_chardev.c
|
|
+++ b/drivers/ptp/ptp_chardev.c
|
|
@@ -204,7 +204,9 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
|
pct->sec = ts.tv_sec;
|
|
pct->nsec = ts.tv_nsec;
|
|
pct++;
|
|
- ptp->info->gettime64(ptp->info, &ts);
|
|
+ err = ptp->info->gettime64(ptp->info, &ts);
|
|
+ if (err)
|
|
+ goto out;
|
|
pct->sec = ts.tv_sec;
|
|
pct->nsec = ts.tv_nsec;
|
|
pct++;
|
|
@@ -257,6 +259,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
|
break;
|
|
}
|
|
|
|
+out:
|
|
kfree(sysoff);
|
|
return err;
|
|
}
|
|
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
|
|
index fd8fe1202dbe..398c9a0a5ade 100644
|
|
--- a/drivers/scsi/lpfc/lpfc_els.c
|
|
+++ b/drivers/scsi/lpfc/lpfc_els.c
|
|
@@ -5105,6 +5105,9 @@ error:
|
|
stat = (struct ls_rjt *)(pcmd + sizeof(uint32_t));
|
|
stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
|
|
|
|
+ if (shdr_add_status == ADD_STATUS_OPERATION_ALREADY_ACTIVE)
|
|
+ stat->un.b.lsRjtRsnCodeExp = LSEXP_CMD_IN_PROGRESS;
|
|
+
|
|
elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
|
|
phba->fc_stat.elsXmitLSRJT++;
|
|
rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
|
|
diff --git a/drivers/soc/tegra/common.c b/drivers/soc/tegra/common.c
|
|
index cd8f41351add..7bfb154d6fa5 100644
|
|
--- a/drivers/soc/tegra/common.c
|
|
+++ b/drivers/soc/tegra/common.c
|
|
@@ -22,11 +22,15 @@ static const struct of_device_id tegra_machine_match[] = {
|
|
|
|
bool soc_is_tegra(void)
|
|
{
|
|
+ const struct of_device_id *match;
|
|
struct device_node *root;
|
|
|
|
root = of_find_node_by_path("/");
|
|
if (!root)
|
|
return false;
|
|
|
|
- return of_match_node(tegra_machine_match, root) != NULL;
|
|
+ match = of_match_node(tegra_machine_match, root);
|
|
+ of_node_put(root);
|
|
+
|
|
+ return match != NULL;
|
|
}
|
|
diff --git a/drivers/staging/iio/adc/ad7280a.c b/drivers/staging/iio/adc/ad7280a.c
|
|
index 35acb1a4669b..db8390022732 100644
|
|
--- a/drivers/staging/iio/adc/ad7280a.c
|
|
+++ b/drivers/staging/iio/adc/ad7280a.c
|
|
@@ -250,7 +250,9 @@ static int ad7280_read(struct ad7280_state *st, unsigned devaddr,
|
|
if (ret)
|
|
return ret;
|
|
|
|
- __ad7280_read32(st, &tmp);
|
|
+ ret = __ad7280_read32(st, &tmp);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
if (ad7280_check_crc(st, tmp))
|
|
return -EIO;
|
|
@@ -288,7 +290,9 @@ static int ad7280_read_channel(struct ad7280_state *st, unsigned devaddr,
|
|
|
|
ad7280_delay(st);
|
|
|
|
- __ad7280_read32(st, &tmp);
|
|
+ ret = __ad7280_read32(st, &tmp);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
if (ad7280_check_crc(st, tmp))
|
|
return -EIO;
|
|
@@ -321,7 +325,9 @@ static int ad7280_read_all_channels(struct ad7280_state *st, unsigned cnt,
|
|
ad7280_delay(st);
|
|
|
|
for (i = 0; i < cnt; i++) {
|
|
- __ad7280_read32(st, &tmp);
|
|
+ ret = __ad7280_read32(st, &tmp);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
if (ad7280_check_crc(st, tmp))
|
|
return -EIO;
|
|
@@ -364,7 +370,10 @@ static int ad7280_chain_setup(struct ad7280_state *st)
|
|
return ret;
|
|
|
|
for (n = 0; n <= AD7280A_MAX_CHAIN; n++) {
|
|
- __ad7280_read32(st, &val);
|
|
+ ret = __ad7280_read32(st, &val);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
if (val == 0)
|
|
return n - 1;
|
|
|
|
diff --git a/drivers/staging/iio/adc/ad7780.c b/drivers/staging/iio/adc/ad7780.c
|
|
index 3abc7789237f..531338ea5eb4 100644
|
|
--- a/drivers/staging/iio/adc/ad7780.c
|
|
+++ b/drivers/staging/iio/adc/ad7780.c
|
|
@@ -90,12 +90,16 @@ static int ad7780_read_raw(struct iio_dev *indio_dev,
|
|
long m)
|
|
{
|
|
struct ad7780_state *st = iio_priv(indio_dev);
|
|
+ int voltage_uv;
|
|
|
|
switch (m) {
|
|
case IIO_CHAN_INFO_RAW:
|
|
return ad_sigma_delta_single_conversion(indio_dev, chan, val);
|
|
case IIO_CHAN_INFO_SCALE:
|
|
- *val = st->int_vref_mv * st->gain;
|
|
+ voltage_uv = regulator_get_voltage(st->reg);
|
|
+ if (voltage_uv < 0)
|
|
+ return voltage_uv;
|
|
+ *val = (voltage_uv / 1000) * st->gain;
|
|
*val2 = chan->scan_type.realbits - 1;
|
|
return IIO_VAL_FRACTIONAL_LOG2;
|
|
case IIO_CHAN_INFO_OFFSET:
|
|
diff --git a/drivers/staging/iio/resolver/ad2s90.c b/drivers/staging/iio/resolver/ad2s90.c
|
|
index 5b1c0db33e7f..b44253eb62ec 100644
|
|
--- a/drivers/staging/iio/resolver/ad2s90.c
|
|
+++ b/drivers/staging/iio/resolver/ad2s90.c
|
|
@@ -86,7 +86,12 @@ static int ad2s90_probe(struct spi_device *spi)
|
|
/* need 600ns between CS and the first falling edge of SCLK */
|
|
spi->max_speed_hz = 830000;
|
|
spi->mode = SPI_MODE_3;
|
|
- spi_setup(spi);
|
|
+ ret = spi_setup(spi);
|
|
+
|
|
+ if (ret < 0) {
|
|
+ dev_err(&spi->dev, "spi_setup failed!\n");
|
|
+ return ret;
|
|
+ }
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/thermal/thermal_hwmon.h b/drivers/thermal/thermal_hwmon.h
|
|
index c798fdb2ae43..f97f76691bd0 100644
|
|
--- a/drivers/thermal/thermal_hwmon.h
|
|
+++ b/drivers/thermal/thermal_hwmon.h
|
|
@@ -34,13 +34,13 @@
|
|
int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz);
|
|
void thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz);
|
|
#else
|
|
-static int
|
|
+static inline int
|
|
thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
-static void
|
|
+static inline void
|
|
thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz)
|
|
{
|
|
}
|
|
diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
|
|
index 01e2274b23f2..8b5ec9386f0f 100644
|
|
--- a/drivers/tty/serial/fsl_lpuart.c
|
|
+++ b/drivers/tty/serial/fsl_lpuart.c
|
|
@@ -1267,6 +1267,8 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
else
|
|
cr1 &= ~UARTCR1_PT;
|
|
}
|
|
+ } else {
|
|
+ cr1 &= ~UARTCR1_PE;
|
|
}
|
|
|
|
/* ask the core to calculate the divisor */
|
|
@@ -1402,6 +1404,8 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
else
|
|
ctrl &= ~UARTCTRL_PT;
|
|
}
|
|
+ } else {
|
|
+ ctrl &= ~UARTCTRL_PE;
|
|
}
|
|
|
|
/* ask the core to calculate the divisor */
|
|
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
|
|
index 4d532a085db9..12bac2cbae4b 100644
|
|
--- a/drivers/tty/serial/samsung.c
|
|
+++ b/drivers/tty/serial/samsung.c
|
|
@@ -1329,11 +1329,14 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
|
|
wr_regl(port, S3C2410_ULCON, ulcon);
|
|
wr_regl(port, S3C2410_UBRDIV, quot);
|
|
|
|
+ port->status &= ~UPSTAT_AUTOCTS;
|
|
+
|
|
umcon = rd_regl(port, S3C2410_UMCON);
|
|
if (termios->c_cflag & CRTSCTS) {
|
|
umcon |= S3C2410_UMCOM_AFC;
|
|
/* Disable RTS when RX FIFO contains 63 bytes */
|
|
umcon &= ~S3C2412_UMCON_AFC_8;
|
|
+ port->status = UPSTAT_AUTOCTS;
|
|
} else {
|
|
umcon &= ~S3C2410_UMCOM_AFC;
|
|
}
|
|
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
index be63db142d3f..3a6978458d95 100644
|
|
--- a/drivers/usb/core/hub.c
|
|
+++ b/drivers/usb/core/hub.c
|
|
@@ -1092,6 +1092,16 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
|
|
USB_PORT_FEAT_ENABLE);
|
|
}
|
|
|
|
+ /*
|
|
+ * Add debounce if USB3 link is in polling/link training state.
|
|
+ * Link will automatically transition to Enabled state after
|
|
+ * link training completes.
|
|
+ */
|
|
+ if (hub_is_superspeed(hdev) &&
|
|
+ ((portstatus & USB_PORT_STAT_LINK_STATE) ==
|
|
+ USB_SS_PORT_LS_POLLING))
|
|
+ need_debounce_delay = true;
|
|
+
|
|
/* Clear status-change flags; we'll debounce later */
|
|
if (portchange & USB_PORT_STAT_C_CONNECTION) {
|
|
need_debounce_delay = true;
|
|
diff --git a/drivers/usb/gadget/udc/net2272.c b/drivers/usb/gadget/udc/net2272.c
|
|
index 18f5ebd447b8..3b6e34fc032b 100644
|
|
--- a/drivers/usb/gadget/udc/net2272.c
|
|
+++ b/drivers/usb/gadget/udc/net2272.c
|
|
@@ -2100,7 +2100,7 @@ static irqreturn_t net2272_irq(int irq, void *_dev)
|
|
#if defined(PLX_PCI_RDK2)
|
|
/* see if PCI int for us by checking irqstat */
|
|
intcsr = readl(dev->rdk2.fpga_base_addr + RDK2_IRQSTAT);
|
|
- if (!intcsr & (1 << NET2272_PCI_IRQ)) {
|
|
+ if (!(intcsr & (1 << NET2272_PCI_IRQ))) {
|
|
spin_unlock(&dev->lock);
|
|
return IRQ_NONE;
|
|
}
|
|
diff --git a/drivers/usb/phy/phy-am335x.c b/drivers/usb/phy/phy-am335x.c
|
|
index 90b67a4ca221..558f33a75fd9 100644
|
|
--- a/drivers/usb/phy/phy-am335x.c
|
|
+++ b/drivers/usb/phy/phy-am335x.c
|
|
@@ -56,9 +56,6 @@ static int am335x_phy_probe(struct platform_device *pdev)
|
|
if (ret)
|
|
return ret;
|
|
|
|
- ret = usb_add_phy_dev(&am_phy->usb_phy_gen.phy);
|
|
- if (ret)
|
|
- return ret;
|
|
am_phy->usb_phy_gen.phy.init = am335x_init;
|
|
am_phy->usb_phy_gen.phy.shutdown = am335x_shutdown;
|
|
|
|
@@ -77,7 +74,7 @@ static int am335x_phy_probe(struct platform_device *pdev)
|
|
device_set_wakeup_enable(dev, false);
|
|
phy_ctrl_power(am_phy->phy_ctrl, am_phy->id, false);
|
|
|
|
- return 0;
|
|
+ return usb_add_phy_dev(&am_phy->usb_phy_gen.phy);
|
|
}
|
|
|
|
static int am335x_phy_remove(struct platform_device *pdev)
|
|
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
|
|
index 4e3c78d88832..c03c5b9602bb 100644
|
|
--- a/drivers/video/console/fbcon.c
|
|
+++ b/drivers/video/console/fbcon.c
|
|
@@ -3032,7 +3032,7 @@ static int fbcon_fb_unbind(int idx)
|
|
for (i = first_fb_vc; i <= last_fb_vc; i++) {
|
|
if (con2fb_map[i] != idx &&
|
|
con2fb_map[i] != -1) {
|
|
- new_idx = i;
|
|
+ new_idx = con2fb_map[i];
|
|
break;
|
|
}
|
|
}
|
|
diff --git a/drivers/video/fbdev/clps711x-fb.c b/drivers/video/fbdev/clps711x-fb.c
|
|
index 649b32f78c08..c55109524fd5 100644
|
|
--- a/drivers/video/fbdev/clps711x-fb.c
|
|
+++ b/drivers/video/fbdev/clps711x-fb.c
|
|
@@ -287,14 +287,17 @@ static int clps711x_fb_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
ret = of_get_fb_videomode(disp, &cfb->mode, OF_USE_NATIVE_MODE);
|
|
- if (ret)
|
|
+ if (ret) {
|
|
+ of_node_put(disp);
|
|
goto out_fb_release;
|
|
+ }
|
|
|
|
of_property_read_u32(disp, "ac-prescale", &cfb->ac_prescale);
|
|
cfb->cmap_invert = of_property_read_bool(disp, "cmap-invert");
|
|
|
|
ret = of_property_read_u32(disp, "bits-per-pixel",
|
|
&info->var.bits_per_pixel);
|
|
+ of_node_put(disp);
|
|
if (ret)
|
|
goto out_fb_release;
|
|
|
|
diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c
|
|
index 8a29ec5992fd..ea2bd6208a2f 100644
|
|
--- a/drivers/video/fbdev/core/fbmem.c
|
|
+++ b/drivers/video/fbdev/core/fbmem.c
|
|
@@ -433,7 +433,9 @@ static void fb_do_show_logo(struct fb_info *info, struct fb_image *image,
|
|
image->dx += image->width + 8;
|
|
}
|
|
} else if (rotate == FB_ROTATE_UD) {
|
|
- for (x = 0; x < num; x++) {
|
|
+ u32 dx = image->dx;
|
|
+
|
|
+ for (x = 0; x < num && image->dx <= dx; x++) {
|
|
info->fbops->fb_imageblit(info, image);
|
|
image->dx -= image->width + 8;
|
|
}
|
|
@@ -445,7 +447,9 @@ static void fb_do_show_logo(struct fb_info *info, struct fb_image *image,
|
|
image->dy += image->height + 8;
|
|
}
|
|
} else if (rotate == FB_ROTATE_CCW) {
|
|
- for (x = 0; x < num; x++) {
|
|
+ u32 dy = image->dy;
|
|
+
|
|
+ for (x = 0; x < num && image->dy <= dy; x++) {
|
|
info->fbops->fb_imageblit(info, image);
|
|
image->dy -= image->height + 8;
|
|
}
|
|
diff --git a/fs/cifs/Kconfig b/fs/cifs/Kconfig
|
|
index 8bef27b8f85d..e7b478b49985 100644
|
|
--- a/fs/cifs/Kconfig
|
|
+++ b/fs/cifs/Kconfig
|
|
@@ -111,7 +111,7 @@ config CIFS_XATTR
|
|
|
|
config CIFS_POSIX
|
|
bool "CIFS POSIX Extensions"
|
|
- depends on CIFS && CIFS_ALLOW_INSECURE_LEGACY && CIFS_XATTR
|
|
+ depends on CIFS_XATTR
|
|
help
|
|
Enabling this option will cause the cifs client to attempt to
|
|
negotiate a newer dialect with servers, such as Samba 3.0.5
|
|
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
|
|
index 026b399af215..1062e96ee272 100644
|
|
--- a/fs/cifs/file.c
|
|
+++ b/fs/cifs/file.c
|
|
@@ -1081,6 +1081,10 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ BUILD_BUG_ON(sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE) >
|
|
+ PAGE_SIZE);
|
|
+ max_buf = min_t(unsigned int, max_buf - sizeof(struct smb_hdr),
|
|
+ PAGE_SIZE);
|
|
max_num = (max_buf - sizeof(struct smb_hdr)) /
|
|
sizeof(LOCKING_ANDX_RANGE);
|
|
buf = kcalloc(max_num, sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL);
|
|
@@ -1410,6 +1414,10 @@ cifs_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
|
|
if (max_buf < (sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE)))
|
|
return -EINVAL;
|
|
|
|
+ BUILD_BUG_ON(sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE) >
|
|
+ PAGE_SIZE);
|
|
+ max_buf = min_t(unsigned int, max_buf - sizeof(struct smb_hdr),
|
|
+ PAGE_SIZE);
|
|
max_num = (max_buf - sizeof(struct smb_hdr)) /
|
|
sizeof(LOCKING_ANDX_RANGE);
|
|
buf = kcalloc(max_num, sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL);
|
|
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
|
|
index 57b039ebfb1f..43fa471c88d7 100644
|
|
--- a/fs/cifs/readdir.c
|
|
+++ b/fs/cifs/readdir.c
|
|
@@ -652,7 +652,14 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, loff_t pos,
|
|
/* scan and find it */
|
|
int i;
|
|
char *cur_ent;
|
|
- char *end_of_smb = cfile->srch_inf.ntwrk_buf_start +
|
|
+ char *end_of_smb;
|
|
+
|
|
+ if (cfile->srch_inf.ntwrk_buf_start == NULL) {
|
|
+ cifs_dbg(VFS, "ntwrk_buf_start is NULL during readdir\n");
|
|
+ return -EIO;
|
|
+ }
|
|
+
|
|
+ end_of_smb = cfile->srch_inf.ntwrk_buf_start +
|
|
server->ops->calc_smb_size(
|
|
cfile->srch_inf.ntwrk_buf_start);
|
|
|
|
diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
|
|
index b7885dc0d9bb..dee5250701de 100644
|
|
--- a/fs/cifs/smb2file.c
|
|
+++ b/fs/cifs/smb2file.c
|
|
@@ -129,6 +129,8 @@ smb2_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
|
|
if (max_buf < sizeof(struct smb2_lock_element))
|
|
return -EINVAL;
|
|
|
|
+ BUILD_BUG_ON(sizeof(struct smb2_lock_element) > PAGE_SIZE);
|
|
+ max_buf = min_t(unsigned int, max_buf, PAGE_SIZE);
|
|
max_num = max_buf / sizeof(struct smb2_lock_element);
|
|
buf = kcalloc(max_num, sizeof(struct smb2_lock_element), GFP_KERNEL);
|
|
if (!buf)
|
|
@@ -265,6 +267,8 @@ smb2_push_mandatory_locks(struct cifsFileInfo *cfile)
|
|
return -EINVAL;
|
|
}
|
|
|
|
+ BUILD_BUG_ON(sizeof(struct smb2_lock_element) > PAGE_SIZE);
|
|
+ max_buf = min_t(unsigned int, max_buf, PAGE_SIZE);
|
|
max_num = max_buf / sizeof(struct smb2_lock_element);
|
|
buf = kcalloc(max_num, sizeof(struct smb2_lock_element), GFP_KERNEL);
|
|
if (!buf) {
|
|
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
|
|
index e49ba072bd64..22fe11baef2b 100644
|
|
--- a/fs/debugfs/inode.c
|
|
+++ b/fs/debugfs/inode.c
|
|
@@ -671,6 +671,13 @@ struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
|
|
struct dentry *dentry = NULL, *trap;
|
|
struct name_snapshot old_name;
|
|
|
|
+ if (IS_ERR(old_dir))
|
|
+ return old_dir;
|
|
+ if (IS_ERR(new_dir))
|
|
+ return new_dir;
|
|
+ if (IS_ERR_OR_NULL(old_dentry))
|
|
+ return old_dentry;
|
|
+
|
|
trap = lock_rename(new_dir, old_dir);
|
|
/* Source or destination directories don't exist? */
|
|
if (d_really_is_negative(old_dir) || d_really_is_negative(new_dir))
|
|
diff --git a/fs/dlm/ast.c b/fs/dlm/ast.c
|
|
index dcea1e37a1b7..f18619bc2e09 100644
|
|
--- a/fs/dlm/ast.c
|
|
+++ b/fs/dlm/ast.c
|
|
@@ -290,6 +290,8 @@ void dlm_callback_suspend(struct dlm_ls *ls)
|
|
flush_workqueue(ls->ls_callback_wq);
|
|
}
|
|
|
|
+#define MAX_CB_QUEUE 25
|
|
+
|
|
void dlm_callback_resume(struct dlm_ls *ls)
|
|
{
|
|
struct dlm_lkb *lkb, *safe;
|
|
@@ -300,15 +302,23 @@ void dlm_callback_resume(struct dlm_ls *ls)
|
|
if (!ls->ls_callback_wq)
|
|
return;
|
|
|
|
+more:
|
|
mutex_lock(&ls->ls_cb_mutex);
|
|
list_for_each_entry_safe(lkb, safe, &ls->ls_cb_delay, lkb_cb_list) {
|
|
list_del_init(&lkb->lkb_cb_list);
|
|
queue_work(ls->ls_callback_wq, &lkb->lkb_cb_work);
|
|
count++;
|
|
+ if (count == MAX_CB_QUEUE)
|
|
+ break;
|
|
}
|
|
mutex_unlock(&ls->ls_cb_mutex);
|
|
|
|
if (count)
|
|
log_rinfo(ls, "dlm_callback_resume %d", count);
|
|
+ if (count == MAX_CB_QUEUE) {
|
|
+ count = 0;
|
|
+ cond_resched();
|
|
+ goto more;
|
|
+ }
|
|
}
|
|
|
|
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
|
|
index 1b08556776ce..240d9ceb8d0c 100644
|
|
--- a/fs/eventpoll.c
|
|
+++ b/fs/eventpoll.c
|
|
@@ -1034,7 +1034,7 @@ static int ep_poll_callback(wait_queue_t *wait, unsigned mode, int sync, void *k
|
|
* semantics). All the events that happen during that period of time are
|
|
* chained in ep->ovflist and requeued later on.
|
|
*/
|
|
- if (unlikely(ep->ovflist != EP_UNACTIVE_PTR)) {
|
|
+ if (ep->ovflist != EP_UNACTIVE_PTR) {
|
|
if (epi->next == EP_UNACTIVE_PTR) {
|
|
epi->next = ep->ovflist;
|
|
ep->ovflist = epi;
|
|
diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c
|
|
index 83dcf7bfd7b8..f0ea91925343 100644
|
|
--- a/fs/f2fs/acl.c
|
|
+++ b/fs/f2fs/acl.c
|
|
@@ -350,12 +350,14 @@ static int f2fs_acl_create(struct inode *dir, umode_t *mode,
|
|
return PTR_ERR(p);
|
|
|
|
clone = f2fs_acl_clone(p, GFP_NOFS);
|
|
- if (!clone)
|
|
- goto no_mem;
|
|
+ if (!clone) {
|
|
+ ret = -ENOMEM;
|
|
+ goto release_acl;
|
|
+ }
|
|
|
|
ret = f2fs_acl_create_masq(clone, mode);
|
|
if (ret < 0)
|
|
- goto no_mem_clone;
|
|
+ goto release_clone;
|
|
|
|
if (ret == 0)
|
|
posix_acl_release(clone);
|
|
@@ -369,11 +371,11 @@ static int f2fs_acl_create(struct inode *dir, umode_t *mode,
|
|
|
|
return 0;
|
|
|
|
-no_mem_clone:
|
|
+release_clone:
|
|
posix_acl_release(clone);
|
|
-no_mem:
|
|
+release_acl:
|
|
posix_acl_release(p);
|
|
- return -ENOMEM;
|
|
+ return ret;
|
|
}
|
|
|
|
int f2fs_init_acl(struct inode *inode, struct inode *dir, struct page *ipage,
|
|
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
|
|
index 96bfd9f0ea02..bee3bc7a16ac 100644
|
|
--- a/fs/f2fs/file.c
|
|
+++ b/fs/f2fs/file.c
|
|
@@ -200,6 +200,9 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
|
|
|
|
trace_f2fs_sync_file_enter(inode);
|
|
|
|
+ if (S_ISDIR(inode->i_mode))
|
|
+ goto go_write;
|
|
+
|
|
/* if fdatasync is triggered, let's do in-place-update */
|
|
if (get_dirty_pages(inode) <= SM_I(sbi)->min_fsync_blocks)
|
|
set_inode_flag(fi, FI_NEED_IPU);
|
|
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
|
|
index e566652ac922..341196338e48 100644
|
|
--- a/fs/fuse/dev.c
|
|
+++ b/fs/fuse/dev.c
|
|
@@ -1741,7 +1741,6 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode,
|
|
req->in.h.nodeid = outarg->nodeid;
|
|
req->in.numargs = 2;
|
|
req->in.argpages = 1;
|
|
- req->page_descs[0].offset = offset;
|
|
req->end = fuse_retrieve_end;
|
|
|
|
index = outarg->offset >> PAGE_CACHE_SHIFT;
|
|
@@ -1756,6 +1755,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode,
|
|
|
|
this_num = min_t(unsigned, num, PAGE_CACHE_SIZE - offset);
|
|
req->pages[req->num_pages] = page;
|
|
+ req->page_descs[req->num_pages].offset = offset;
|
|
req->page_descs[req->num_pages].length = this_num;
|
|
req->num_pages++;
|
|
|
|
@@ -2074,10 +2074,13 @@ static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
|
|
|
|
ret = fuse_dev_do_write(fud, &cs, len);
|
|
|
|
+ pipe_lock(pipe);
|
|
for (idx = 0; idx < nbuf; idx++) {
|
|
struct pipe_buffer *buf = &bufs[idx];
|
|
buf->ops->release(pipe, buf);
|
|
}
|
|
+ pipe_unlock(pipe);
|
|
+
|
|
out:
|
|
kfree(bufs);
|
|
return ret;
|
|
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
|
|
index 7014318f6d18..d40c2451487c 100644
|
|
--- a/fs/fuse/file.c
|
|
+++ b/fs/fuse/file.c
|
|
@@ -1784,7 +1784,7 @@ static bool fuse_writepage_in_flight(struct fuse_req *new_req,
|
|
spin_unlock(&fc->lock);
|
|
|
|
dec_wb_stat(&bdi->wb, WB_WRITEBACK);
|
|
- dec_zone_page_state(page, NR_WRITEBACK_TEMP);
|
|
+ dec_zone_page_state(new_req->pages[0], NR_WRITEBACK_TEMP);
|
|
wb_writeout_inc(&bdi->wb);
|
|
fuse_writepage_free(fc, new_req);
|
|
fuse_request_free(new_req);
|
|
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
|
|
index 62f358f67764..412fcfbc50e2 100644
|
|
--- a/fs/nfs/super.c
|
|
+++ b/fs/nfs/super.c
|
|
@@ -2376,8 +2376,7 @@ static int nfs_compare_mount_options(const struct super_block *s, const struct n
|
|
goto Ebusy;
|
|
if (a->acdirmax != b->acdirmax)
|
|
goto Ebusy;
|
|
- if (b->auth_info.flavor_len > 0 &&
|
|
- clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor)
|
|
+ if (clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor)
|
|
goto Ebusy;
|
|
return 1;
|
|
Ebusy:
|
|
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
|
|
index 9690cb4dd588..03c7a4e7b6ba 100644
|
|
--- a/fs/nfsd/nfsctl.c
|
|
+++ b/fs/nfsd/nfsctl.c
|
|
@@ -1106,6 +1106,8 @@ static ssize_t write_v4_end_grace(struct file *file, char *buf, size_t size)
|
|
case 'Y':
|
|
case 'y':
|
|
case '1':
|
|
+ if (nn->nfsd_serv)
|
|
+ return -EBUSY;
|
|
nfsd4_end_grace(nn);
|
|
break;
|
|
default:
|
|
diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c
|
|
index 272269f1c310..9ee8bcfbf00f 100644
|
|
--- a/fs/ocfs2/buffer_head_io.c
|
|
+++ b/fs/ocfs2/buffer_head_io.c
|
|
@@ -146,7 +146,6 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block,
|
|
BUG();
|
|
}
|
|
|
|
- clear_buffer_uptodate(bh);
|
|
get_bh(bh); /* for end_buffer_read_sync() */
|
|
bh->b_end_io = end_buffer_read_sync;
|
|
submit_bh(READ, bh);
|
|
@@ -300,7 +299,6 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr,
|
|
continue;
|
|
}
|
|
|
|
- clear_buffer_uptodate(bh);
|
|
get_bh(bh); /* for end_buffer_read_sync() */
|
|
if (validate)
|
|
set_buffer_needs_validate(bh);
|
|
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
|
|
index 0e659d9c69a1..613193c6bb42 100644
|
|
--- a/fs/udf/inode.c
|
|
+++ b/fs/udf/inode.c
|
|
@@ -1364,6 +1364,12 @@ reread:
|
|
|
|
iinfo->i_alloc_type = le16_to_cpu(fe->icbTag.flags) &
|
|
ICBTAG_FLAG_AD_MASK;
|
|
+ if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_SHORT &&
|
|
+ iinfo->i_alloc_type != ICBTAG_FLAG_AD_LONG &&
|
|
+ iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
|
|
+ ret = -EIO;
|
|
+ goto out;
|
|
+ }
|
|
iinfo->i_unique = 0;
|
|
iinfo->i_lenEAttr = 0;
|
|
iinfo->i_lenExtents = 0;
|
|
diff --git a/include/linux/genl_magic_struct.h b/include/linux/genl_magic_struct.h
|
|
index eecd19b37001..250e9be65e74 100644
|
|
--- a/include/linux/genl_magic_struct.h
|
|
+++ b/include/linux/genl_magic_struct.h
|
|
@@ -185,6 +185,7 @@ static inline void ct_assert_unique_operations(void)
|
|
{
|
|
switch (0) {
|
|
#include GENL_MAGIC_INCLUDE_FILE
|
|
+ case 0:
|
|
;
|
|
}
|
|
}
|
|
@@ -203,6 +204,7 @@ static inline void ct_assert_unique_top_level_attributes(void)
|
|
{
|
|
switch (0) {
|
|
#include GENL_MAGIC_INCLUDE_FILE
|
|
+ case 0:
|
|
;
|
|
}
|
|
}
|
|
@@ -212,7 +214,8 @@ static inline void ct_assert_unique_top_level_attributes(void)
|
|
static inline void ct_assert_unique_ ## s_name ## _attributes(void) \
|
|
{ \
|
|
switch (0) { \
|
|
- s_fields \
|
|
+ s_fields \
|
|
+ case 0: \
|
|
; \
|
|
} \
|
|
}
|
|
diff --git a/include/linux/hid-debug.h b/include/linux/hid-debug.h
|
|
index 8663f216c563..2d6100edf204 100644
|
|
--- a/include/linux/hid-debug.h
|
|
+++ b/include/linux/hid-debug.h
|
|
@@ -24,7 +24,10 @@
|
|
|
|
#ifdef CONFIG_DEBUG_FS
|
|
|
|
+#include <linux/kfifo.h>
|
|
+
|
|
#define HID_DEBUG_BUFSIZE 512
|
|
+#define HID_DEBUG_FIFOSIZE 512
|
|
|
|
void hid_dump_input(struct hid_device *, struct hid_usage *, __s32);
|
|
void hid_dump_report(struct hid_device *, int , u8 *, int);
|
|
@@ -37,11 +40,8 @@ void hid_debug_init(void);
|
|
void hid_debug_exit(void);
|
|
void hid_debug_event(struct hid_device *, char *);
|
|
|
|
-
|
|
struct hid_debug_list {
|
|
- char *hid_debug_buf;
|
|
- int head;
|
|
- int tail;
|
|
+ DECLARE_KFIFO_PTR(hid_debug_fifo, char);
|
|
struct fasync_struct *fasync;
|
|
struct hid_device *hdev;
|
|
struct list_head node;
|
|
@@ -64,4 +64,3 @@ struct hid_debug_list {
|
|
#endif
|
|
|
|
#endif
|
|
-
|
|
diff --git a/include/linux/string.h b/include/linux/string.h
|
|
index 98bb781a2eff..c026b7a19e26 100644
|
|
--- a/include/linux/string.h
|
|
+++ b/include/linux/string.h
|
|
@@ -26,7 +26,7 @@ extern char * strncpy(char *,const char *, __kernel_size_t);
|
|
size_t strlcpy(char *, const char *, size_t);
|
|
#endif
|
|
#ifndef __HAVE_ARCH_STRSCPY
|
|
-ssize_t __must_check strscpy(char *, const char *, size_t);
|
|
+ssize_t strscpy(char *, const char *, size_t);
|
|
#endif
|
|
#ifndef __HAVE_ARCH_STRCAT
|
|
extern char * strcat(char *, const char *);
|
|
diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h
|
|
index fa1d05512c09..85ff3181e6f1 100644
|
|
--- a/include/sound/compress_driver.h
|
|
+++ b/include/sound/compress_driver.h
|
|
@@ -178,7 +178,11 @@ static inline void snd_compr_drain_notify(struct snd_compr_stream *stream)
|
|
if (snd_BUG_ON(!stream))
|
|
return;
|
|
|
|
- stream->runtime->state = SNDRV_PCM_STATE_SETUP;
|
|
+ if (stream->direction == SND_COMPRESS_PLAYBACK)
|
|
+ stream->runtime->state = SNDRV_PCM_STATE_SETUP;
|
|
+ else
|
|
+ stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
|
|
+
|
|
wake_up(&stream->runtime->sleep);
|
|
}
|
|
|
|
diff --git a/include/uapi/linux/if_ether.h b/include/uapi/linux/if_ether.h
|
|
index 064d2026ab38..373afec2ed34 100644
|
|
--- a/include/uapi/linux/if_ether.h
|
|
+++ b/include/uapi/linux/if_ether.h
|
|
@@ -136,11 +136,18 @@
|
|
* This is an Ethernet frame header.
|
|
*/
|
|
|
|
+/* allow libcs like musl to deactivate this, glibc does not implement this. */
|
|
+#ifndef __UAPI_DEF_ETHHDR
|
|
+#define __UAPI_DEF_ETHHDR 1
|
|
+#endif
|
|
+
|
|
+#if __UAPI_DEF_ETHHDR
|
|
struct ethhdr {
|
|
unsigned char h_dest[ETH_ALEN]; /* destination eth addr */
|
|
unsigned char h_source[ETH_ALEN]; /* source ether addr */
|
|
__be16 h_proto; /* packet type ID field */
|
|
} __attribute__((packed));
|
|
+#endif
|
|
|
|
|
|
#endif /* _UAPI_LINUX_IF_ETHER_H */
|
|
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
|
|
index 58013ef228a1..358bb53c1e74 100644
|
|
--- a/kernel/events/ring_buffer.c
|
|
+++ b/kernel/events/ring_buffer.c
|
|
@@ -637,6 +637,9 @@ struct ring_buffer *rb_alloc(int nr_pages, long watermark, int cpu, int flags)
|
|
size = sizeof(struct ring_buffer);
|
|
size += nr_pages * sizeof(void *);
|
|
|
|
+ if (order_base_2(size) >= PAGE_SHIFT+MAX_ORDER)
|
|
+ goto fail;
|
|
+
|
|
rb = kzalloc(size, GFP_KERNEL);
|
|
if (!rb)
|
|
goto fail;
|
|
diff --git a/kernel/hung_task.c b/kernel/hung_task.c
|
|
index e0f90c2b57aa..cc05b97ba569 100644
|
|
--- a/kernel/hung_task.c
|
|
+++ b/kernel/hung_task.c
|
|
@@ -30,7 +30,7 @@ int __read_mostly sysctl_hung_task_check_count = PID_MAX_LIMIT;
|
|
* is disabled during the critical section. It also controls the size of
|
|
* the RCU grace period. So it needs to be upper-bound.
|
|
*/
|
|
-#define HUNG_TASK_BATCHING 1024
|
|
+#define HUNG_TASK_LOCK_BREAK (HZ / 10)
|
|
|
|
/*
|
|
* Zero means infinite timeout - no checking done:
|
|
@@ -158,7 +158,7 @@ static bool rcu_lock_break(struct task_struct *g, struct task_struct *t)
|
|
static void check_hung_uninterruptible_tasks(unsigned long timeout)
|
|
{
|
|
int max_count = sysctl_hung_task_check_count;
|
|
- int batch_count = HUNG_TASK_BATCHING;
|
|
+ unsigned long last_break = jiffies;
|
|
struct task_struct *g, *t;
|
|
|
|
/*
|
|
@@ -172,10 +172,10 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)
|
|
for_each_process_thread(g, t) {
|
|
if (!max_count--)
|
|
goto unlock;
|
|
- if (!--batch_count) {
|
|
- batch_count = HUNG_TASK_BATCHING;
|
|
+ if (time_after(jiffies, last_break + HUNG_TASK_LOCK_BREAK)) {
|
|
if (!rcu_lock_break(g, t))
|
|
goto unlock;
|
|
+ last_break = jiffies;
|
|
}
|
|
/* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */
|
|
if (t->state == TASK_UNINTERRUPTIBLE)
|
|
diff --git a/kernel/signal.c b/kernel/signal.c
|
|
index 5b1313309356..96e8c3cbfa38 100644
|
|
--- a/kernel/signal.c
|
|
+++ b/kernel/signal.c
|
|
@@ -696,6 +696,48 @@ static inline bool si_fromuser(const struct siginfo *info)
|
|
(!is_si_special(info) && SI_FROMUSER(info));
|
|
}
|
|
|
|
+static int dequeue_synchronous_signal(siginfo_t *info)
|
|
+{
|
|
+ struct task_struct *tsk = current;
|
|
+ struct sigpending *pending = &tsk->pending;
|
|
+ struct sigqueue *q, *sync = NULL;
|
|
+
|
|
+ /*
|
|
+ * Might a synchronous signal be in the queue?
|
|
+ */
|
|
+ if (!((pending->signal.sig[0] & ~tsk->blocked.sig[0]) & SYNCHRONOUS_MASK))
|
|
+ return 0;
|
|
+
|
|
+ /*
|
|
+ * Return the first synchronous signal in the queue.
|
|
+ */
|
|
+ list_for_each_entry(q, &pending->list, list) {
|
|
+ /* Synchronous signals have a postive si_code */
|
|
+ if ((q->info.si_code > SI_USER) &&
|
|
+ (sigmask(q->info.si_signo) & SYNCHRONOUS_MASK)) {
|
|
+ sync = q;
|
|
+ goto next;
|
|
+ }
|
|
+ }
|
|
+ return 0;
|
|
+next:
|
|
+ /*
|
|
+ * Check if there is another siginfo for the same signal.
|
|
+ */
|
|
+ list_for_each_entry_continue(q, &pending->list, list) {
|
|
+ if (q->info.si_signo == sync->info.si_signo)
|
|
+ goto still_pending;
|
|
+ }
|
|
+
|
|
+ sigdelset(&pending->signal, sync->info.si_signo);
|
|
+ recalc_sigpending();
|
|
+still_pending:
|
|
+ list_del_init(&sync->list);
|
|
+ copy_siginfo(info, &sync->info);
|
|
+ __sigqueue_free(sync);
|
|
+ return info->si_signo;
|
|
+}
|
|
+
|
|
/*
|
|
* called with RCU read lock from check_kill_permission()
|
|
*/
|
|
@@ -2198,6 +2240,14 @@ relock:
|
|
goto relock;
|
|
}
|
|
|
|
+ /* Has this task already been marked for death? */
|
|
+ if (signal_group_exit(signal)) {
|
|
+ ksig->info.si_signo = signr = SIGKILL;
|
|
+ sigdelset(¤t->pending.signal, SIGKILL);
|
|
+ recalc_sigpending();
|
|
+ goto fatal;
|
|
+ }
|
|
+
|
|
for (;;) {
|
|
struct k_sigaction *ka;
|
|
|
|
@@ -2211,7 +2261,15 @@ relock:
|
|
goto relock;
|
|
}
|
|
|
|
- signr = dequeue_signal(current, ¤t->blocked, &ksig->info);
|
|
+ /*
|
|
+ * Signals generated by the execution of an instruction
|
|
+ * need to be delivered before any other pending signals
|
|
+ * so that the instruction pointer in the signal stack
|
|
+ * frame points to the faulting instruction.
|
|
+ */
|
|
+ signr = dequeue_synchronous_signal(&ksig->info);
|
|
+ if (!signr)
|
|
+ signr = dequeue_signal(current, ¤t->blocked, &ksig->info);
|
|
|
|
if (!signr)
|
|
break; /* will return 0 */
|
|
@@ -2293,6 +2351,7 @@ relock:
|
|
continue;
|
|
}
|
|
|
|
+ fatal:
|
|
spin_unlock_irq(&sighand->siglock);
|
|
|
|
/*
|
|
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
|
|
index fed86b2dfc89..d9837d25dfe0 100644
|
|
--- a/kernel/time/timekeeping.c
|
|
+++ b/kernel/time/timekeeping.c
|
|
@@ -39,7 +39,9 @@
|
|
static struct {
|
|
seqcount_t seq;
|
|
struct timekeeper timekeeper;
|
|
-} tk_core ____cacheline_aligned;
|
|
+} tk_core ____cacheline_aligned = {
|
|
+ .seq = SEQCNT_ZERO(tk_core.seq),
|
|
+};
|
|
|
|
static DEFINE_RAW_SPINLOCK(timekeeper_lock);
|
|
static struct timekeeper shadow_timekeeper;
|
|
diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
|
|
index 1dc887bab085..518e62a398d2 100644
|
|
--- a/kernel/trace/trace_uprobe.c
|
|
+++ b/kernel/trace/trace_uprobe.c
|
|
@@ -150,7 +150,14 @@ static void FETCH_FUNC_NAME(memory, string)(struct pt_regs *regs,
|
|
|
|
ret = strncpy_from_user(dst, src, maxlen);
|
|
if (ret == maxlen)
|
|
- dst[--ret] = '\0';
|
|
+ dst[ret - 1] = '\0';
|
|
+ else if (ret >= 0)
|
|
+ /*
|
|
+ * Include the terminating null byte. In this case it
|
|
+ * was copied by strncpy_from_user but not accounted
|
|
+ * for in ret.
|
|
+ */
|
|
+ ret++;
|
|
|
|
if (ret < 0) { /* Failed to fetch string */
|
|
((u8 *)get_rloc_data(dest))[0] = '\0';
|
|
diff --git a/lib/seq_buf.c b/lib/seq_buf.c
|
|
index 5c94e1012a91..cbef5ee4c459 100644
|
|
--- a/lib/seq_buf.c
|
|
+++ b/lib/seq_buf.c
|
|
@@ -143,9 +143,13 @@ int seq_buf_puts(struct seq_buf *s, const char *str)
|
|
|
|
WARN_ON(s->size == 0);
|
|
|
|
+ /* Add 1 to len for the trailing null byte which must be there */
|
|
+ len += 1;
|
|
+
|
|
if (seq_buf_can_fit(s, len)) {
|
|
memcpy(s->buffer + s->len, str, len);
|
|
- s->len += len;
|
|
+ /* Don't count the trailing null byte against the capacity */
|
|
+ s->len += len - 1;
|
|
return 0;
|
|
}
|
|
seq_buf_set_overflow(s);
|
|
diff --git a/lib/test-hexdump.c b/lib/test-hexdump.c
|
|
index 5241df36eedf..dadcabe50988 100644
|
|
--- a/lib/test-hexdump.c
|
|
+++ b/lib/test-hexdump.c
|
|
@@ -81,7 +81,7 @@ static void __init test_hexdump(size_t len, int rowsize, int groupsize,
|
|
const char *q = *result++;
|
|
size_t amount = strlen(q);
|
|
|
|
- strncpy(p, q, amount);
|
|
+ memcpy(p, q, amount);
|
|
p += amount + 1;
|
|
}
|
|
if (i)
|
|
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
|
|
index f11345e163d7..3c8d8142e8c6 100644
|
|
--- a/net/batman-adv/hard-interface.c
|
|
+++ b/net/batman-adv/hard-interface.c
|
|
@@ -18,7 +18,6 @@
|
|
#include "hard-interface.h"
|
|
#include "main.h"
|
|
|
|
-#include <linux/bug.h>
|
|
#include <linux/byteorder/generic.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/fs.h>
|
|
@@ -104,8 +103,10 @@ static bool batadv_is_on_batman_iface(const struct net_device *net_dev)
|
|
/* recurse over the parent device */
|
|
parent_dev = __dev_get_by_index(&init_net, dev_get_iflink(net_dev));
|
|
/* if we got a NULL parent_dev there is something broken.. */
|
|
- if (WARN(!parent_dev, "Cannot find parent device"))
|
|
+ if (!parent_dev) {
|
|
+ pr_err("Cannot find parent device\n");
|
|
return false;
|
|
+ }
|
|
|
|
ret = batadv_is_on_batman_iface(parent_dev);
|
|
|
|
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
|
|
index 9f1fe6169bef..5aeb585571ed 100644
|
|
--- a/net/batman-adv/soft-interface.c
|
|
+++ b/net/batman-adv/soft-interface.c
|
|
@@ -209,6 +209,8 @@ static int batadv_interface_tx(struct sk_buff *skb,
|
|
|
|
soft_iface->trans_start = jiffies;
|
|
vid = batadv_get_vid(skb, 0);
|
|
+
|
|
+ skb_reset_mac_header(skb);
|
|
ethhdr = eth_hdr(skb);
|
|
|
|
switch (ntohs(ethhdr->h_proto)) {
|
|
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
|
|
index d40d32a2c12d..37fe2b158c2a 100644
|
|
--- a/net/bluetooth/hci_event.c
|
|
+++ b/net/bluetooth/hci_event.c
|
|
@@ -5185,6 +5185,12 @@ static bool hci_get_cmd_complete(struct hci_dev *hdev, u16 opcode,
|
|
return true;
|
|
}
|
|
|
|
+ /* Check if request ended in Command Status - no way to retreive
|
|
+ * any extra parameters in this case.
|
|
+ */
|
|
+ if (hdr->evt == HCI_EV_CMD_STATUS)
|
|
+ return false;
|
|
+
|
|
if (hdr->evt != HCI_EV_CMD_COMPLETE) {
|
|
BT_DBG("Last event is not cmd complete (0x%2.2x)", hdr->evt);
|
|
return false;
|
|
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
|
|
index ad3c9e96a275..3e6897efe1eb 100644
|
|
--- a/net/ceph/messenger.c
|
|
+++ b/net/ceph/messenger.c
|
|
@@ -3181,9 +3181,10 @@ void ceph_con_keepalive(struct ceph_connection *con)
|
|
dout("con_keepalive %p\n", con);
|
|
mutex_lock(&con->mutex);
|
|
clear_standby(con);
|
|
+ con_flag_set(con, CON_FLAG_KEEPALIVE_PENDING);
|
|
mutex_unlock(&con->mutex);
|
|
- if (con_flag_test_and_set(con, CON_FLAG_KEEPALIVE_PENDING) == 0 &&
|
|
- con_flag_test_and_set(con, CON_FLAG_WRITE_PENDING) == 0)
|
|
+
|
|
+ if (con_flag_test_and_set(con, CON_FLAG_WRITE_PENDING) == 0)
|
|
queue_con(con);
|
|
}
|
|
EXPORT_SYMBOL(ceph_con_keepalive);
|
|
diff --git a/net/dccp/ccid.h b/net/dccp/ccid.h
|
|
index 6eb837a47b5c..baaaeb2b2c42 100644
|
|
--- a/net/dccp/ccid.h
|
|
+++ b/net/dccp/ccid.h
|
|
@@ -202,7 +202,7 @@ static inline void ccid_hc_tx_packet_recv(struct ccid *ccid, struct sock *sk,
|
|
static inline int ccid_hc_tx_parse_options(struct ccid *ccid, struct sock *sk,
|
|
u8 pkt, u8 opt, u8 *val, u8 len)
|
|
{
|
|
- if (ccid->ccid_ops->ccid_hc_tx_parse_options == NULL)
|
|
+ if (!ccid || !ccid->ccid_ops->ccid_hc_tx_parse_options)
|
|
return 0;
|
|
return ccid->ccid_ops->ccid_hc_tx_parse_options(sk, pkt, opt, val, len);
|
|
}
|
|
@@ -214,7 +214,7 @@ static inline int ccid_hc_tx_parse_options(struct ccid *ccid, struct sock *sk,
|
|
static inline int ccid_hc_rx_parse_options(struct ccid *ccid, struct sock *sk,
|
|
u8 pkt, u8 opt, u8 *val, u8 len)
|
|
{
|
|
- if (ccid->ccid_ops->ccid_hc_rx_parse_options == NULL)
|
|
+ if (!ccid || !ccid->ccid_ops->ccid_hc_rx_parse_options)
|
|
return 0;
|
|
return ccid->ccid_ops->ccid_hc_rx_parse_options(sk, pkt, opt, val, len);
|
|
}
|
|
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
|
|
index 48b28a7ecc7a..4256ac95a141 100644
|
|
--- a/net/dsa/slave.c
|
|
+++ b/net/dsa/slave.c
|
|
@@ -157,10 +157,14 @@ static void dsa_slave_change_rx_flags(struct net_device *dev, int change)
|
|
struct dsa_slave_priv *p = netdev_priv(dev);
|
|
struct net_device *master = p->parent->dst->master_netdev;
|
|
|
|
- if (change & IFF_ALLMULTI)
|
|
- dev_set_allmulti(master, dev->flags & IFF_ALLMULTI ? 1 : -1);
|
|
- if (change & IFF_PROMISC)
|
|
- dev_set_promiscuity(master, dev->flags & IFF_PROMISC ? 1 : -1);
|
|
+ if (dev->flags & IFF_UP) {
|
|
+ if (change & IFF_ALLMULTI)
|
|
+ dev_set_allmulti(master,
|
|
+ dev->flags & IFF_ALLMULTI ? 1 : -1);
|
|
+ if (change & IFF_PROMISC)
|
|
+ dev_set_promiscuity(master,
|
|
+ dev->flags & IFF_PROMISC ? 1 : -1);
|
|
+ }
|
|
}
|
|
|
|
static void dsa_slave_set_rx_mode(struct net_device *dev)
|
|
diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c
|
|
index 5743044cd660..56b72cada346 100644
|
|
--- a/net/ipv6/xfrm6_tunnel.c
|
|
+++ b/net/ipv6/xfrm6_tunnel.c
|
|
@@ -144,6 +144,9 @@ static u32 __xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr)
|
|
index = __xfrm6_tunnel_spi_check(net, spi);
|
|
if (index >= 0)
|
|
goto alloc_spi;
|
|
+
|
|
+ if (spi == XFRM6_TUNNEL_SPI_MAX)
|
|
+ break;
|
|
}
|
|
for (spi = XFRM6_TUNNEL_SPI_MIN; spi < xfrm6_tn->spi; spi++) {
|
|
index = __xfrm6_tunnel_spi_check(net, spi);
|
|
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
|
|
index 64f76f88f819..acacceec8cd8 100644
|
|
--- a/net/mac80211/rx.c
|
|
+++ b/net/mac80211/rx.c
|
|
@@ -149,6 +149,9 @@ ieee80211_rx_radiotap_hdrlen(struct ieee80211_local *local,
|
|
/* allocate extra bitmaps */
|
|
if (status->chains)
|
|
len += 4 * hweight8(status->chains);
|
|
+ /* vendor presence bitmap */
|
|
+ if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA)
|
|
+ len += 4;
|
|
|
|
if (ieee80211_have_rx_timestamp(status)) {
|
|
len = ALIGN(len, 8);
|
|
@@ -185,8 +188,6 @@ ieee80211_rx_radiotap_hdrlen(struct ieee80211_local *local,
|
|
if (status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) {
|
|
struct ieee80211_vendor_radiotap *rtap = (void *)skb->data;
|
|
|
|
- /* vendor presence bitmap */
|
|
- len += 4;
|
|
/* alignment for fixed 6-byte vendor data header */
|
|
len = ALIGN(len, 2);
|
|
/* vendor data header */
|
|
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
|
|
index c1c27a516e45..41f3eb565ef3 100644
|
|
--- a/net/mac80211/tx.c
|
|
+++ b/net/mac80211/tx.c
|
|
@@ -1599,9 +1599,16 @@ static int ieee80211_skb_resize(struct ieee80211_sub_if_data *sdata,
|
|
int head_need, bool may_encrypt)
|
|
{
|
|
struct ieee80211_local *local = sdata->local;
|
|
+ struct ieee80211_hdr *hdr;
|
|
+ bool enc_tailroom;
|
|
int tail_need = 0;
|
|
|
|
- if (may_encrypt && sdata->crypto_tx_tailroom_needed_cnt) {
|
|
+ hdr = (struct ieee80211_hdr *) skb->data;
|
|
+ enc_tailroom = may_encrypt &&
|
|
+ (sdata->crypto_tx_tailroom_needed_cnt ||
|
|
+ ieee80211_is_mgmt(hdr->frame_control));
|
|
+
|
|
+ if (enc_tailroom) {
|
|
tail_need = IEEE80211_ENCRYPT_TAILROOM;
|
|
tail_need -= skb_tailroom(skb);
|
|
tail_need = max_t(int, tail_need, 0);
|
|
@@ -1609,8 +1616,7 @@ static int ieee80211_skb_resize(struct ieee80211_sub_if_data *sdata,
|
|
|
|
if (skb_cloned(skb) &&
|
|
(!ieee80211_hw_check(&local->hw, SUPPORTS_CLONED_SKBS) ||
|
|
- !skb_clone_writable(skb, ETH_HLEN) ||
|
|
- (may_encrypt && sdata->crypto_tx_tailroom_needed_cnt)))
|
|
+ !skb_clone_writable(skb, ETH_HLEN) || enc_tailroom))
|
|
I802_DEBUG_INC(local->tx_expand_skb_head_cloned);
|
|
else if (head_need || tail_need)
|
|
I802_DEBUG_INC(local->tx_expand_skb_head);
|
|
diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c
|
|
index f9ff73a8d815..500c9e614a06 100644
|
|
--- a/net/tipc/subscr.c
|
|
+++ b/net/tipc/subscr.c
|
|
@@ -337,7 +337,7 @@ int tipc_topsrv_start(struct net *net)
|
|
topsrv->tipc_conn_new = tipc_subscrb_connect_cb;
|
|
topsrv->tipc_conn_shutdown = tipc_subscrb_shutdown_cb;
|
|
|
|
- strncpy(topsrv->name, name, strlen(name) + 1);
|
|
+ strscpy(topsrv->name, name, sizeof(topsrv->name));
|
|
tn->topsrv = topsrv;
|
|
atomic_set(&tn->subscription_count, 0);
|
|
|
|
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
|
|
index 476f1fc6d655..177a6c75f136 100644
|
|
--- a/net/xfrm/xfrm_user.c
|
|
+++ b/net/xfrm/xfrm_user.c
|
|
@@ -1404,10 +1404,15 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family)
|
|
if (!ut[i].family)
|
|
ut[i].family = family;
|
|
|
|
- if ((ut[i].mode == XFRM_MODE_TRANSPORT) &&
|
|
- (ut[i].family != prev_family))
|
|
- return -EINVAL;
|
|
-
|
|
+ switch (ut[i].mode) {
|
|
+ case XFRM_MODE_TUNNEL:
|
|
+ case XFRM_MODE_BEET:
|
|
+ break;
|
|
+ default:
|
|
+ if (ut[i].family != prev_family)
|
|
+ return -EINVAL;
|
|
+ break;
|
|
+ }
|
|
if (ut[i].mode >= XFRM_MODE_MAX)
|
|
return -EINVAL;
|
|
|
|
diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh
|
|
index 00d6d53c2681..ffc46c7c3afb 100755
|
|
--- a/scripts/decode_stacktrace.sh
|
|
+++ b/scripts/decode_stacktrace.sh
|
|
@@ -64,7 +64,7 @@ parse_symbol() {
|
|
fi
|
|
|
|
# Strip out the base of the path
|
|
- code=${code//$basepath/""}
|
|
+ code=${code//^$basepath/""}
|
|
|
|
# In the case of inlines, move everything to same line
|
|
code=${code//$'\n'/' '}
|
|
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
|
|
index 064fbfbbb22c..81b1c02a76fa 100644
|
|
--- a/scripts/mod/modpost.c
|
|
+++ b/scripts/mod/modpost.c
|
|
@@ -1197,6 +1197,30 @@ static int secref_whitelist(const struct sectioncheck *mismatch,
|
|
return 1;
|
|
}
|
|
|
|
+static inline int is_arm_mapping_symbol(const char *str)
|
|
+{
|
|
+ return str[0] == '$' && strchr("axtd", str[1])
|
|
+ && (str[2] == '\0' || str[2] == '.');
|
|
+}
|
|
+
|
|
+/*
|
|
+ * If there's no name there, ignore it; likewise, ignore it if it's
|
|
+ * one of the magic symbols emitted used by current ARM tools.
|
|
+ *
|
|
+ * Otherwise if find_symbols_between() returns those symbols, they'll
|
|
+ * fail the whitelist tests and cause lots of false alarms ... fixable
|
|
+ * only by merging __exit and __init sections into __text, bloating
|
|
+ * the kernel (which is especially evil on embedded platforms).
|
|
+ */
|
|
+static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
|
|
+{
|
|
+ const char *name = elf->strtab + sym->st_name;
|
|
+
|
|
+ if (!name || !strlen(name))
|
|
+ return 0;
|
|
+ return !is_arm_mapping_symbol(name);
|
|
+}
|
|
+
|
|
/**
|
|
* Find symbol based on relocation record info.
|
|
* In some cases the symbol supplied is a valid symbol so
|
|
@@ -1222,6 +1246,8 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
|
|
continue;
|
|
if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
|
|
continue;
|
|
+ if (!is_valid_name(elf, sym))
|
|
+ continue;
|
|
if (sym->st_value == addr)
|
|
return sym;
|
|
/* Find a symbol nearby - addr are maybe negative */
|
|
@@ -1240,30 +1266,6 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
|
|
return NULL;
|
|
}
|
|
|
|
-static inline int is_arm_mapping_symbol(const char *str)
|
|
-{
|
|
- return str[0] == '$' && strchr("axtd", str[1])
|
|
- && (str[2] == '\0' || str[2] == '.');
|
|
-}
|
|
-
|
|
-/*
|
|
- * If there's no name there, ignore it; likewise, ignore it if it's
|
|
- * one of the magic symbols emitted used by current ARM tools.
|
|
- *
|
|
- * Otherwise if find_symbols_between() returns those symbols, they'll
|
|
- * fail the whitelist tests and cause lots of false alarms ... fixable
|
|
- * only by merging __exit and __init sections into __text, bloating
|
|
- * the kernel (which is especially evil on embedded platforms).
|
|
- */
|
|
-static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
|
|
-{
|
|
- const char *name = elf->strtab + sym->st_name;
|
|
-
|
|
- if (!name || !strlen(name))
|
|
- return 0;
|
|
- return !is_arm_mapping_symbol(name);
|
|
-}
|
|
-
|
|
/*
|
|
* Find symbols before or equal addr and after addr - in the section sec.
|
|
* If we find two symbols with equal offset prefer one with a valid name.
|
|
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
|
|
index c73361859d11..9db7c80a74aa 100644
|
|
--- a/security/smack/smack_lsm.c
|
|
+++ b/security/smack/smack_lsm.c
|
|
@@ -4311,6 +4311,12 @@ static int smack_key_permission(key_ref_t key_ref,
|
|
int request = 0;
|
|
int rc;
|
|
|
|
+ /*
|
|
+ * Validate requested permissions
|
|
+ */
|
|
+ if (perm & ~KEY_NEED_ALL)
|
|
+ return -EINVAL;
|
|
+
|
|
keyp = key_ref_to_ptr(key_ref);
|
|
if (keyp == NULL)
|
|
return -EINVAL;
|
|
@@ -4330,10 +4336,10 @@ static int smack_key_permission(key_ref_t key_ref,
|
|
ad.a.u.key_struct.key = keyp->serial;
|
|
ad.a.u.key_struct.key_desc = keyp->description;
|
|
#endif
|
|
- if (perm & KEY_NEED_READ)
|
|
- request = MAY_READ;
|
|
+ if (perm & (KEY_NEED_READ | KEY_NEED_SEARCH | KEY_NEED_VIEW))
|
|
+ request |= MAY_READ;
|
|
if (perm & (KEY_NEED_WRITE | KEY_NEED_LINK | KEY_NEED_SETATTR))
|
|
- request = MAY_WRITE;
|
|
+ request |= MAY_WRITE;
|
|
rc = smk_access(tkp, keyp->security, request, &ad);
|
|
rc = smk_bu_note("key access", tkp, keyp->security, request, rc);
|
|
return rc;
|
|
diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c
|
|
index 6efadbfb3fe3..7ea201c05e5d 100644
|
|
--- a/sound/pci/hda/hda_bind.c
|
|
+++ b/sound/pci/hda/hda_bind.c
|
|
@@ -109,7 +109,8 @@ static int hda_codec_driver_probe(struct device *dev)
|
|
err = snd_hda_codec_build_controls(codec);
|
|
if (err < 0)
|
|
goto error_module;
|
|
- if (codec->card->registered) {
|
|
+ /* only register after the bus probe finished; otherwise it's racy */
|
|
+ if (!codec->bus->bus_probing && codec->card->registered) {
|
|
err = snd_card_register(codec->card);
|
|
if (err < 0)
|
|
goto error_module;
|
|
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
|
|
index 776dffa88aee..171e11be938d 100644
|
|
--- a/sound/pci/hda/hda_codec.h
|
|
+++ b/sound/pci/hda/hda_codec.h
|
|
@@ -68,6 +68,7 @@ struct hda_bus {
|
|
unsigned int response_reset:1; /* controller was reset */
|
|
unsigned int in_reset:1; /* during reset operation */
|
|
unsigned int no_response_fallback:1; /* don't fallback at RIRB error */
|
|
+ unsigned int bus_probing :1; /* during probing process */
|
|
|
|
int primary_dig_out_type; /* primary digital out PCM type */
|
|
unsigned int mixer_assigned; /* codec addr for mixer name */
|
|
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
|
|
index f964743b104c..74c9600876d6 100644
|
|
--- a/sound/pci/hda/hda_intel.c
|
|
+++ b/sound/pci/hda/hda_intel.c
|
|
@@ -2100,6 +2100,7 @@ static int azx_probe_continue(struct azx *chip)
|
|
int val;
|
|
int err;
|
|
|
|
+ to_hda_bus(bus)->bus_probing = 1;
|
|
hda->probe_continued = 1;
|
|
|
|
/* Request display power well for the HDA controller or codec. For
|
|
@@ -2200,6 +2201,7 @@ i915_power_fail:
|
|
if (err < 0)
|
|
hda->init_failed = 1;
|
|
complete_all(&hda->probe_wait);
|
|
+ to_hda_bus(bus)->bus_probing = 0;
|
|
return err;
|
|
}
|
|
|
|
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
|
|
index 536184ac315d..40dd46556452 100644
|
|
--- a/sound/pci/hda/patch_conexant.c
|
|
+++ b/sound/pci/hda/patch_conexant.c
|
|
@@ -854,6 +854,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
|
|
SND_PCI_QUIRK(0x103c, 0x807C, "HP EliteBook 820 G3", CXT_FIXUP_HP_DOCK),
|
|
SND_PCI_QUIRK(0x103c, 0x80FD, "HP ProBook 640 G2", CXT_FIXUP_HP_DOCK),
|
|
SND_PCI_QUIRK(0x103c, 0x828c, "HP EliteBook 840 G4", CXT_FIXUP_HP_DOCK),
|
|
+ SND_PCI_QUIRK(0x103c, 0x83b2, "HP EliteBook 840 G5", CXT_FIXUP_HP_DOCK),
|
|
SND_PCI_QUIRK(0x103c, 0x83b3, "HP EliteBook 830 G5", CXT_FIXUP_HP_DOCK),
|
|
SND_PCI_QUIRK(0x103c, 0x83d3, "HP ProBook 640 G4", CXT_FIXUP_HP_DOCK),
|
|
SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE),
|
|
diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig
|
|
index 14dfdee05fd5..3066e068aae5 100644
|
|
--- a/sound/soc/fsl/Kconfig
|
|
+++ b/sound/soc/fsl/Kconfig
|
|
@@ -219,7 +219,7 @@ config SND_SOC_PHYCORE_AC97
|
|
|
|
config SND_SOC_EUKREA_TLV320
|
|
tristate "Eukrea TLV320"
|
|
- depends on ARCH_MXC && I2C
|
|
+ depends on ARCH_MXC && !ARM64 && I2C
|
|
select SND_SOC_TLV320AIC23_I2C
|
|
select SND_SOC_IMX_AUDMUX
|
|
select SND_SOC_IMX_SSI
|
|
diff --git a/sound/soc/intel/atom/sst/sst_loader.c b/sound/soc/intel/atom/sst/sst_loader.c
|
|
index 33917146d9c4..054b1d514e8a 100644
|
|
--- a/sound/soc/intel/atom/sst/sst_loader.c
|
|
+++ b/sound/soc/intel/atom/sst/sst_loader.c
|
|
@@ -354,14 +354,14 @@ static int sst_request_fw(struct intel_sst_drv *sst)
|
|
const struct firmware *fw;
|
|
|
|
retval = request_firmware(&fw, sst->firmware_name, sst->dev);
|
|
- if (fw == NULL) {
|
|
- dev_err(sst->dev, "fw is returning as null\n");
|
|
- return -EINVAL;
|
|
- }
|
|
if (retval) {
|
|
dev_err(sst->dev, "request fw failed %d\n", retval);
|
|
return retval;
|
|
}
|
|
+ if (fw == NULL) {
|
|
+ dev_err(sst->dev, "fw is returning as null\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
mutex_lock(&sst->sst_lock);
|
|
retval = sst_cache_and_parse_fw(sst, fw);
|
|
mutex_unlock(&sst->sst_lock);
|
|
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
|
|
index a9079654107c..1ea1384bc236 100644
|
|
--- a/sound/usb/pcm.c
|
|
+++ b/sound/usb/pcm.c
|
|
@@ -313,6 +313,9 @@ static int search_roland_implicit_fb(struct usb_device *dev, int ifnum,
|
|
return 0;
|
|
}
|
|
|
|
+/* Setup an implicit feedback endpoint from a quirk. Returns 0 if no quirk
|
|
+ * applies. Returns 1 if a quirk was found.
|
|
+ */
|
|
static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
|
|
struct usb_device *dev,
|
|
struct usb_interface_descriptor *altsd,
|
|
@@ -381,7 +384,7 @@ add_sync_ep:
|
|
|
|
subs->data_endpoint->sync_master = subs->sync_endpoint;
|
|
|
|
- return 0;
|
|
+ return 1;
|
|
}
|
|
|
|
static int set_sync_endpoint(struct snd_usb_substream *subs,
|
|
@@ -420,6 +423,10 @@ static int set_sync_endpoint(struct snd_usb_substream *subs,
|
|
if (err < 0)
|
|
return err;
|
|
|
|
+ /* endpoint set by quirk */
|
|
+ if (err > 0)
|
|
+ return 0;
|
|
+
|
|
if (altsd->bNumEndpoints < 2)
|
|
return 0;
|
|
|
|
diff --git a/tools/perf/arch/x86/util/kvm-stat.c b/tools/perf/arch/x86/util/kvm-stat.c
|
|
index 14e4e668fad7..f97696a418cc 100644
|
|
--- a/tools/perf/arch/x86/util/kvm-stat.c
|
|
+++ b/tools/perf/arch/x86/util/kvm-stat.c
|
|
@@ -146,7 +146,7 @@ int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid)
|
|
if (strstr(cpuid, "Intel")) {
|
|
kvm->exit_reasons = vmx_exit_reasons;
|
|
kvm->exit_reasons_isa = "VMX";
|
|
- } else if (strstr(cpuid, "AMD")) {
|
|
+ } else if (strstr(cpuid, "AMD") || strstr(cpuid, "Hygon")) {
|
|
kvm->exit_reasons = svm_exit_reasons;
|
|
kvm->exit_reasons_isa = "SVM";
|
|
} else
|
|
diff --git a/tools/perf/tests/evsel-tp-sched.c b/tools/perf/tests/evsel-tp-sched.c
|
|
index 790e413d9a1f..da474d743b6a 100644
|
|
--- a/tools/perf/tests/evsel-tp-sched.c
|
|
+++ b/tools/perf/tests/evsel-tp-sched.c
|
|
@@ -16,7 +16,7 @@ static int perf_evsel__test_field(struct perf_evsel *evsel, const char *name,
|
|
return -1;
|
|
}
|
|
|
|
- is_signed = !!(field->flags | FIELD_IS_SIGNED);
|
|
+ is_signed = !!(field->flags & FIELD_IS_SIGNED);
|
|
if (should_be_signed && !is_signed) {
|
|
pr_debug("%s: \"%s\" signedness(%d) is wrong, should be %d\n",
|
|
evsel->name, name, is_signed, should_be_signed);
|