diff options
191 files changed, 1175 insertions, 571 deletions
| diff --git a/Documentation/devicetree/bindings/mtd/gpmc-nand.txt b/Documentation/devicetree/bindings/mtd/gpmc-nand.txt index fb733c4e1c11..3a58fdf0c566 100644 --- a/Documentation/devicetree/bindings/mtd/gpmc-nand.txt +++ b/Documentation/devicetree/bindings/mtd/gpmc-nand.txt @@ -112,7 +112,7 @@ on various other factors also like;  	so the device should have enough free bytes available its OOB/Spare  	area to accommodate ECC for entire page. In general following expression  	helps in determining if given device can accommodate ECC syndrome: -	"2 + (PAGESIZE / 512) * ECC_BYTES" >= OOBSIZE" +	"2 + (PAGESIZE / 512) * ECC_BYTES" <= OOBSIZE"  	where  		OOBSIZE		number of bytes in OOB/spare area  		PAGESIZE	number of bytes in main-area of device page @@ -1,6 +1,6 @@  VERSION = 4  PATCHLEVEL = 4 -SUBLEVEL = 283 +SUBLEVEL = 288  EXTRAVERSION =  NAME = Blurry Fish Butt diff --git a/arch/alpha/include/asm/io.h b/arch/alpha/include/asm/io.h index 355aec0867f4..e55a5e6ab460 100644 --- a/arch/alpha/include/asm/io.h +++ b/arch/alpha/include/asm/io.h @@ -60,7 +60,7 @@ extern inline void set_hae(unsigned long new_hae)   * Change virtual addresses to physical addresses and vv.   */  #ifdef USE_48_BIT_KSEG -static inline unsigned long virt_to_phys(void *address) +static inline unsigned long virt_to_phys(volatile void *address)  {  	return (unsigned long)address - IDENT_ADDR;  } @@ -70,7 +70,7 @@ static inline void * phys_to_virt(unsigned long address)  	return (void *) (address + IDENT_ADDR);  }  #else -static inline unsigned long virt_to_phys(void *address) +static inline unsigned long virt_to_phys(volatile void *address)  {          unsigned long phys = (unsigned long)address; @@ -111,7 +111,7 @@ static inline dma_addr_t __deprecated isa_page_to_bus(struct page *page)  extern unsigned long __direct_map_base;  extern unsigned long __direct_map_size; -static inline unsigned long __deprecated virt_to_bus(void *address) +static inline unsigned long __deprecated virt_to_bus(volatile void *address)  {  	unsigned long phys = virt_to_phys(address);  	unsigned long bus = phys + __direct_map_base; diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index a5d8bef65911..77f6b1c73737 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig @@ -23,7 +23,7 @@ config ARC  	select GENERIC_SMP_IDLE_THREAD  	select HAVE_ARCH_KGDB  	select HAVE_ARCH_TRACEHOOK -	select HAVE_FUTEX_CMPXCHG +	select HAVE_FUTEX_CMPXCHG if FUTEX  	select HAVE_IOREMAP_PROT  	select HAVE_KPROBES  	select HAVE_KRETPROBES diff --git a/arch/arc/mm/cache.c b/arch/arc/mm/cache.c index 017fb440bba4..f425405a8a76 100644 --- a/arch/arc/mm/cache.c +++ b/arch/arc/mm/cache.c @@ -904,7 +904,7 @@ void clear_user_page(void *to, unsigned long u_vaddr, struct page *page)  	clear_page(to);  	clear_bit(PG_dc_clean, &page->flags);  } - +EXPORT_SYMBOL(clear_user_page);  /**********************************************************************   * Explicit Cache flush request from user space via syscall diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index 3f9a9ebc77c3..7f167276d4c5 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile @@ -86,6 +86,8 @@ $(addprefix $(obj)/,$(libfdt_objs) atags_to_fdt.o): \  	$(addprefix $(obj)/,$(libfdt_hdrs))  ifeq ($(CONFIG_ARM_ATAG_DTB_COMPAT),y) +CFLAGS_REMOVE_atags_to_fdt.o += -Wframe-larger-than=${CONFIG_FRAME_WARN} +CFLAGS_atags_to_fdt.o += -Wframe-larger-than=1280  OBJS	+= $(libfdt_objs) atags_to_fdt.o  endif diff --git a/arch/arm/boot/dts/tegra20-tamonten.dtsi b/arch/arm/boot/dts/tegra20-tamonten.dtsi index 13d4e6185275..c70d1ec02957 100644 --- a/arch/arm/boot/dts/tegra20-tamonten.dtsi +++ b/arch/arm/boot/dts/tegra20-tamonten.dtsi @@ -180,8 +180,9 @@  				nvidia,pins = "ata", "atb", "atc", "atd", "ate",  					"cdev1", "cdev2", "dap1", "dtb", "gma",  					"gmb", "gmc", "gmd", "gme", "gpu7", -					"gpv", "i2cp", "pta", "rm", "slxa", -					"slxk", "spia", "spib", "uac"; +					"gpv", "i2cp", "irrx", "irtx", "pta", +					"rm", "slxa", "slxk", "spia", "spib", +					"uac";  				nvidia,pull = <TEGRA_PIN_PULL_NONE>;  				nvidia,tristate = <TEGRA_PIN_DISABLE>;  			}; @@ -206,7 +207,7 @@  			conf_ddc {  				nvidia,pins = "ddc", "dta", "dtd", "kbca",  					"kbcb", "kbcc", "kbcd", "kbce", "kbcf", -					"sdc"; +					"sdc", "uad", "uca";  				nvidia,pull = <TEGRA_PIN_PULL_UP>;  				nvidia,tristate = <TEGRA_PIN_DISABLE>;  			}; @@ -216,10 +217,9 @@  					"lvp0", "owc", "sdb";  				nvidia,tristate = <TEGRA_PIN_ENABLE>;  			}; -			conf_irrx { -				nvidia,pins = "irrx", "irtx", "sdd", "spic", -					"spie", "spih", "uaa", "uab", "uad", -					"uca", "ucb"; +			conf_sdd { +				nvidia,pins = "sdd", "spic", "spie", "spih", +					"uaa", "uab", "ucb";  				nvidia,pull = <TEGRA_PIN_PULL_UP>;  				nvidia,tristate = <TEGRA_PIN_ENABLE>;  			}; diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 649bc3300c93..a43601d61ce0 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -16,10 +16,14 @@ CFLAGS_REMOVE_return_address.o = -pg  # Object file lists.  obj-y		:= elf.o entry-common.o irq.o opcodes.o \ -		   process.o ptrace.o reboot.o return_address.o \ +		   process.o ptrace.o reboot.o \  		   setup.o signal.o sigreturn_codes.o \  		   stacktrace.o sys_arm.o time.o traps.o +ifneq ($(CONFIG_ARM_UNWIND),y) +obj-$(CONFIG_FRAME_POINTER)	+= return_address.o +endif +  obj-$(CONFIG_ATAGS)		+= atags_parse.o  obj-$(CONFIG_ATAGS_PROC)	+= atags_proc.o  obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o diff --git a/arch/arm/kernel/return_address.c b/arch/arm/kernel/return_address.c index 36ed35073289..f945742dea44 100644 --- a/arch/arm/kernel/return_address.c +++ b/arch/arm/kernel/return_address.c @@ -10,8 +10,6 @@   */  #include <linux/export.h>  #include <linux/ftrace.h> - -#if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND)  #include <linux/sched.h>  #include <asm/stacktrace.h> @@ -56,6 +54,4 @@ void *return_address(unsigned int level)  		return NULL;  } -#endif /* if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) */ -  EXPORT_SYMBOL_GPL(return_address); diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 2e9931d9f1e4..9fbb9c34b127 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -480,7 +480,7 @@ config ARM64_ERRATUM_1024718  	help  	  This option adds work around for Arm Cortex-A55 Erratum 1024718. -	  Affected Cortex-A55 cores (r0p0, r0p1, r1p0) could cause incorrect +	  Affected Cortex-A55 cores (all revisions) could cause incorrect  	  update of the hardware dirty bit when the DBM/AP bits are updated  	  without a break-before-make. The work around is to disable the usage  	  of hardware DBM locally on the affected cores. CPUs not affected by diff --git a/arch/arm64/boot/dts/exynos/exynos7.dtsi b/arch/arm64/boot/dts/exynos/exynos7.dtsi index f9c5a549c2c0..cb863891f29e 100644 --- a/arch/arm64/boot/dts/exynos/exynos7.dtsi +++ b/arch/arm64/boot/dts/exynos/exynos7.dtsi @@ -90,7 +90,7 @@  			#address-cells = <0>;  			interrupt-controller;  			reg =	<0x11001000 0x1000>, -				<0x11002000 0x1000>, +				<0x11002000 0x2000>,  				<0x11004000 0x2000>,  				<0x11006000 0x2000>;  		}; diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S index b78688806652..3e8ffc8871f7 100644 --- a/arch/arm64/mm/proc.S +++ b/arch/arm64/mm/proc.S @@ -285,8 +285,8 @@ ENTRY(__cpu_setup)  	cmp	x9, #2  	b.lt	1f  #ifdef CONFIG_ARM64_ERRATUM_1024718 -	/* Disable hardware DBM on Cortex-A55 r0p0, r0p1 & r1p0 */ -	cpu_midr_match MIDR_CORTEX_A55, MIDR_CPU_VAR_REV(0, 0), MIDR_CPU_VAR_REV(1, 0), x1, x2, x3, x4 +	/* Disable hardware DBM on Cortex-A55 all versions */ +	cpu_midr_match MIDR_CORTEX_A55, MIDR_CPU_VAR_REV(0, 0), MIDR_CPU_VAR_REV(0xf, 0xf), x1, x2, x3, x4  	cbnz	x1, 1f  #endif  	orr	x10, x10, #TCR_HD		// hardware Dirty flag update diff --git a/arch/m68k/emu/nfeth.c b/arch/m68k/emu/nfeth.c index a0985fd088d1..7d695fc7a2d0 100644 --- a/arch/m68k/emu/nfeth.c +++ b/arch/m68k/emu/nfeth.c @@ -260,8 +260,8 @@ static void __exit nfeth_cleanup(void)  	for (i = 0; i < MAX_UNIT; i++) {  		if (nfeth_dev[i]) { -			unregister_netdev(nfeth_dev[0]); -			free_netdev(nfeth_dev[0]); +			unregister_netdev(nfeth_dev[i]); +			free_netdev(nfeth_dev[i]);  		}  	}  	free_irq(nfEtherIRQ, nfeth_interrupt); diff --git a/arch/m68k/include/asm/raw_io.h b/arch/m68k/include/asm/raw_io.h index 932faa35655b..2238232c360e 100644 --- a/arch/m68k/include/asm/raw_io.h +++ b/arch/m68k/include/asm/raw_io.h @@ -30,21 +30,21 @@ extern void __iounmap(void *addr, unsigned long size);   * two accesses to memory, which may be undesirable for some devices.   */  #define in_8(addr) \ -    ({ u8 __v = (*(__force volatile u8 *) (addr)); __v; }) +    ({ u8 __v = (*(__force volatile u8 *) (unsigned long)(addr)); __v; })  #define in_be16(addr) \ -    ({ u16 __v = (*(__force volatile u16 *) (addr)); __v; }) +    ({ u16 __v = (*(__force volatile u16 *) (unsigned long)(addr)); __v; })  #define in_be32(addr) \ -    ({ u32 __v = (*(__force volatile u32 *) (addr)); __v; }) +    ({ u32 __v = (*(__force volatile u32 *) (unsigned long)(addr)); __v; })  #define in_le16(addr) \ -    ({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (addr)); __v; }) +    ({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (unsigned long)(addr)); __v; })  #define in_le32(addr) \ -    ({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (addr)); __v; }) +    ({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (unsigned long)(addr)); __v; }) -#define out_8(addr,b) (void)((*(__force volatile u8 *) (addr)) = (b)) -#define out_be16(addr,w) (void)((*(__force volatile u16 *) (addr)) = (w)) -#define out_be32(addr,l) (void)((*(__force volatile u32 *) (addr)) = (l)) -#define out_le16(addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w)) -#define out_le32(addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l)) +#define out_8(addr,b) (void)((*(__force volatile u8 *) (unsigned long)(addr)) = (b)) +#define out_be16(addr,w) (void)((*(__force volatile u16 *) (unsigned long)(addr)) = (w)) +#define out_be32(addr,l) (void)((*(__force volatile u32 *) (unsigned long)(addr)) = (l)) +#define out_le16(addr,w) (void)((*(__force volatile __le16 *) (unsigned long)(addr)) = cpu_to_le16(w)) +#define out_le32(addr,l) (void)((*(__force volatile __le32 *) (unsigned long)(addr)) = cpu_to_le32(l))  #define raw_inb in_8  #define raw_inw in_be16 diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S index 3fbe420f49c4..92cdc1e56b60 100644 --- a/arch/openrisc/kernel/entry.S +++ b/arch/openrisc/kernel/entry.S @@ -491,6 +491,7 @@ EXCEPTION_ENTRY(_external_irq_handler)  	l.bnf	1f			// ext irq enabled, all ok.  	l.nop +#ifdef CONFIG_PRINTK  	l.addi  r1,r1,-0x8  	l.movhi r3,hi(42f)  	l.ori	r3,r3,lo(42f) @@ -504,6 +505,7 @@ EXCEPTION_ENTRY(_external_irq_handler)  		.string "\n\rESR interrupt bug: in _external_irq_handler (ESR %x)\n\r"  		.align 4  	.previous +#endif  	l.ori	r4,r4,SPR_SR_IEE	// fix the bug  //	l.sw	PT_SR(r1),r4 diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h index 80e742a1c162..088888fcf8df 100644 --- a/arch/parisc/include/asm/page.h +++ b/arch/parisc/include/asm/page.h @@ -174,7 +174,7 @@ extern int npmem_ranges;  #include <asm-generic/getorder.h>  #include <asm/pdc.h> -#define PAGE0   ((struct zeropage *)__PAGE_OFFSET) +#define PAGE0   ((struct zeropage *)absolute_pointer(__PAGE_OFFSET))  /* DEFINITION OF THE ZERO-PAGE (PAG0) */  /* based on work by Jason Eckhardt (jason@equator.com) */ diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 2264f68f3c2f..d9a4d6ffc0a8 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c @@ -239,6 +239,12 @@ setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs,  #endif  	usp = (regs->gr[30] & ~(0x01UL)); +#ifdef CONFIG_64BIT +	if (is_compat_task()) { +		/* The gcc alloca implementation leaves garbage in the upper 32 bits of sp */ +		usp = (compat_uint_t)usp; +	} +#endif  	/*FIXME: frame_size parameter is unused, remove it. */  	frame = get_sigframe(&ksig->ka, usp, sizeof(*frame)); diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S index a3550e8f1a77..51669cdbf011 100644 --- a/arch/powerpc/boot/crt0.S +++ b/arch/powerpc/boot/crt0.S @@ -49,9 +49,6 @@ p_end:		.long	_end  p_pstack:	.long	_platform_stack_top  #endif -	.globl	_zimage_start -	/* Clang appears to require the .weak directive to be after the symbol -	 * is defined. See https://bugs.llvm.org/show_bug.cgi?id=38921  */  	.weak	_zimage_start  _zimage_start:  	.globl	_zimage_start_lib diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index 08b7a40de5f8..0a96b1941397 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c @@ -662,7 +662,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,  			/*  			 * If found, replace it with:  			 *	addis r2, r12, (.TOC.-func)@ha -			 *	addi r2, r12, (.TOC.-func)@l +			 *	addi  r2,  r2, (.TOC.-func)@l  			 */  			((uint32_t *)location)[0] = 0x3c4c0000 + PPC_HA(value);  			((uint32_t *)location)[1] = 0x38420000 + PPC_LO(value); diff --git a/arch/s390/kernel/dis.c b/arch/s390/kernel/dis.c index 1d4a054ce59a..c4def044f27b 100644 --- a/arch/s390/kernel/dis.c +++ b/arch/s390/kernel/dis.c @@ -2025,7 +2025,7 @@ void show_code(struct pt_regs *regs)  		start += opsize;  		printk(buffer);  		ptr = buffer; -		ptr += sprintf(ptr, "\n\t  "); +		ptr += sprintf(ptr, "\n          ");  		hops++;  	}  	printk("\n"); diff --git a/arch/s390/kernel/jump_label.c b/arch/s390/kernel/jump_label.c index 083b05f5f5ab..cbc187706648 100644 --- a/arch/s390/kernel/jump_label.c +++ b/arch/s390/kernel/jump_label.c @@ -43,7 +43,7 @@ static void jump_label_bug(struct jump_entry *entry, struct insn *expected,  	unsigned char *ipe = (unsigned char *)expected;  	unsigned char *ipn = (unsigned char *)new; -	pr_emerg("Jump label code mismatch at %pS [%p]\n", ipc, ipc); +	pr_emerg("Jump label code mismatch at %pS [%px]\n", ipc, ipc);  	pr_emerg("Found:    %6ph\n", ipc);  	pr_emerg("Expected: %6ph\n", ipe);  	pr_emerg("New:      %6ph\n", ipn); diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c index c5c3056f4c4a..03ad0455931d 100644 --- a/arch/s390/net/bpf_jit_comp.c +++ b/arch/s390/net/bpf_jit_comp.c @@ -596,10 +596,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i  		EMIT4(0xb9080000, dst_reg, src_reg);  		break;  	case BPF_ALU | BPF_ADD | BPF_K: /* dst = (u32) dst + (u32) imm */ -		if (!imm) -			break; -		/* alfi %dst,imm */ -		EMIT6_IMM(0xc20b0000, dst_reg, imm); +		if (imm != 0) { +			/* alfi %dst,imm */ +			EMIT6_IMM(0xc20b0000, dst_reg, imm); +		}  		EMIT_ZERO(dst_reg);  		break;  	case BPF_ALU64 | BPF_ADD | BPF_K: /* dst = dst + imm */ @@ -621,17 +621,22 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i  		EMIT4(0xb9090000, dst_reg, src_reg);  		break;  	case BPF_ALU | BPF_SUB | BPF_K: /* dst = (u32) dst - (u32) imm */ -		if (!imm) -			break; -		/* alfi %dst,-imm */ -		EMIT6_IMM(0xc20b0000, dst_reg, -imm); +		if (imm != 0) { +			/* alfi %dst,-imm */ +			EMIT6_IMM(0xc20b0000, dst_reg, -imm); +		}  		EMIT_ZERO(dst_reg);  		break;  	case BPF_ALU64 | BPF_SUB | BPF_K: /* dst = dst - imm */  		if (!imm)  			break; -		/* agfi %dst,-imm */ -		EMIT6_IMM(0xc2080000, dst_reg, -imm); +		if (imm == -0x80000000) { +			/* algfi %dst,0x80000000 */ +			EMIT6_IMM(0xc20a0000, dst_reg, 0x80000000); +		} else { +			/* agfi %dst,-imm */ +			EMIT6_IMM(0xc2080000, dst_reg, -imm); +		}  		break;  	/*  	 * BPF_MUL @@ -646,10 +651,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i  		EMIT4(0xb90c0000, dst_reg, src_reg);  		break;  	case BPF_ALU | BPF_MUL | BPF_K: /* dst = (u32) dst * (u32) imm */ -		if (imm == 1) -			break; -		/* msfi %r5,imm */ -		EMIT6_IMM(0xc2010000, dst_reg, imm); +		if (imm != 1) { +			/* msfi %r5,imm */ +			EMIT6_IMM(0xc2010000, dst_reg, imm); +		}  		EMIT_ZERO(dst_reg);  		break;  	case BPF_ALU64 | BPF_MUL | BPF_K: /* dst = dst * imm */ @@ -710,6 +715,8 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i  			if (BPF_OP(insn->code) == BPF_MOD)  				/* lhgi %dst,0 */  				EMIT4_IMM(0xa7090000, dst_reg, 0); +			else +				EMIT_ZERO(dst_reg);  			break;  		}  		/* lhi %w0,0 */ @@ -802,10 +809,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i  		EMIT4(0xb9820000, dst_reg, src_reg);  		break;  	case BPF_ALU | BPF_XOR | BPF_K: /* dst = (u32) dst ^ (u32) imm */ -		if (!imm) -			break; -		/* xilf %dst,imm */ -		EMIT6_IMM(0xc0070000, dst_reg, imm); +		if (imm != 0) { +			/* xilf %dst,imm */ +			EMIT6_IMM(0xc0070000, dst_reg, imm); +		}  		EMIT_ZERO(dst_reg);  		break;  	case BPF_ALU64 | BPF_XOR | BPF_K: /* dst = dst ^ imm */ @@ -826,10 +833,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i  		EMIT6_DISP_LH(0xeb000000, 0x000d, dst_reg, dst_reg, src_reg, 0);  		break;  	case BPF_ALU | BPF_LSH | BPF_K: /* dst = (u32) dst << (u32) imm */ -		if (imm == 0) -			break; -		/* sll %dst,imm(%r0) */ -		EMIT4_DISP(0x89000000, dst_reg, REG_0, imm); +		if (imm != 0) { +			/* sll %dst,imm(%r0) */ +			EMIT4_DISP(0x89000000, dst_reg, REG_0, imm); +		}  		EMIT_ZERO(dst_reg);  		break;  	case BPF_ALU64 | BPF_LSH | BPF_K: /* dst = dst << imm */ @@ -851,10 +858,10 @@ static noinline int bpf_jit_insn(struct bpf_jit *jit, struct bpf_prog *fp, int i  		EMIT6_DISP_LH(0xeb000000, 0x000c, dst_reg, dst_reg, src_reg, 0);  		break;  	case BPF_ALU | BPF_RSH | BPF_K: /* dst = (u32) dst >> (u32) imm */ -		if (imm == 0) -			break; -		/* srl %dst,imm(%r0) */ -		EMIT4_DISP(0x88000000, dst_reg, REG_0, imm); +		if (imm != 0) { +			/* srl %dst,imm(%r0) */ +			EMIT4_DISP(0x88000000, dst_reg, REG_0, imm); +		}  		EMIT_ZERO(dst_reg);  		break;  	case BPF_ALU64 | BPF_RSH | BPF_K: /* dst = dst >> imm */ diff --git a/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c index 6f80936e0eea..75445ba7e237 100644 --- a/arch/sparc/kernel/mdesc.c +++ b/arch/sparc/kernel/mdesc.c @@ -37,6 +37,7 @@ struct mdesc_hdr {  	u32	node_sz; /* node block size */  	u32	name_sz; /* name block size */  	u32	data_sz; /* data block size */ +	char	data[];  } __attribute__((aligned(16)));  struct mdesc_elem { @@ -369,7 +370,7 @@ out:  static struct mdesc_elem *node_block(struct mdesc_hdr *mdesc)  { -	return (struct mdesc_elem *) (mdesc + 1); +	return (struct mdesc_elem *) mdesc->data;  }  static void *name_block(struct mdesc_hdr *mdesc) diff --git a/arch/sparc/lib/iomap.c b/arch/sparc/lib/iomap.c index c4d42a50ebc0..fa4abbaf27de 100644 --- a/arch/sparc/lib/iomap.c +++ b/arch/sparc/lib/iomap.c @@ -18,8 +18,10 @@ void ioport_unmap(void __iomem *addr)  EXPORT_SYMBOL(ioport_map);  EXPORT_SYMBOL(ioport_unmap); +#ifdef CONFIG_PCI  void pci_iounmap(struct pci_dev *dev, void __iomem * addr)  {  	/* nothing to do */  }  EXPORT_SYMBOL(pci_iounmap); +#endif diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 1c2451107e49..143c06f84596 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -337,10 +337,11 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {  	},  	{	/* Handle problems with rebooting on the OptiPlex 990. */  		.callback = set_pci_reboot, -		.ident = "Dell OptiPlex 990", +		.ident = "Dell OptiPlex 990 BIOS A0x",  		.matches = {  			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),  			DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 990"), +			DMI_MATCH(DMI_BIOS_VERSION, "A0"),  		},  	},  	{	/* Handle problems with rebooting on Dell 300's */ diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 42000fffe77e..8dce61ca934b 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -2172,6 +2172,10 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)  			if (!msr_info->host_initiated) {  				s64 adj = data - vcpu->arch.ia32_tsc_adjust_msr;  				adjust_tsc_offset_guest(vcpu, adj); +				/* Before back to guest, tsc_timestamp must be adjusted +				 * as well, otherwise guest's percpu pvclock time could jump. +				 */ +				kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);  			}  			vcpu->arch.ia32_tsc_adjust_msr = data;  		} diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 97b6b0164dcb..a935039c20be 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -1179,21 +1179,21 @@ int kern_addr_valid(unsigned long addr)  		return 0;  	pud = pud_offset(pgd, addr); -	if (pud_none(*pud)) +	if (!pud_present(*pud))  		return 0;  	if (pud_large(*pud))  		return pfn_valid(pud_pfn(*pud));  	pmd = pmd_offset(pud, addr); -	if (pmd_none(*pmd)) +	if (!pmd_present(*pmd))  		return 0;  	if (pmd_large(*pmd))  		return pfn_valid(pmd_pfn(*pmd));  	pte = pte_offset_kernel(pmd, addr); -	if (pte_none(*pte)) +	if (!pte_present(*pte))  		return 0;  	return pfn_valid(pte_pfn(*pte)); diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 79aff24eed65..28725a6ed5de 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -861,8 +861,8 @@ static void xen_write_idt_entry(gate_desc *dt, int entrynum, const gate_desc *g)  	preempt_enable();  } -static void xen_convert_trap_info(const struct desc_ptr *desc, -				  struct trap_info *traps) +static unsigned xen_convert_trap_info(const struct desc_ptr *desc, +				      struct trap_info *traps, bool full)  {  	unsigned in, out, count; @@ -872,17 +872,18 @@ static void xen_convert_trap_info(const struct desc_ptr *desc,  	for (in = out = 0; in < count; in++) {  		gate_desc *entry = (gate_desc*)(desc->address) + in; -		if (cvt_gate_to_trap(in, entry, &traps[out])) +		if (cvt_gate_to_trap(in, entry, &traps[out]) || full)  			out++;  	} -	traps[out].address = 0; + +	return out;  }  void xen_copy_trap_info(struct trap_info *traps)  {  	const struct desc_ptr *desc = this_cpu_ptr(&idt_desc); -	xen_convert_trap_info(desc, traps); +	xen_convert_trap_info(desc, traps, true);  }  /* Load a new IDT into Xen.  In principle this can be per-CPU, so we @@ -892,6 +893,7 @@ static void xen_load_idt(const struct desc_ptr *desc)  {  	static DEFINE_SPINLOCK(lock);  	static struct trap_info traps[257]; +	unsigned out;  	trace_xen_cpu_load_idt(desc); @@ -899,7 +901,8 @@ static void xen_load_idt(const struct desc_ptr *desc)  	memcpy(this_cpu_ptr(&idt_desc), desc, sizeof(idt_desc)); -	xen_convert_trap_info(desc, traps); +	out = xen_convert_trap_info(desc, traps, false); +	memset(&traps[out], 0, sizeof(traps[0]));  	xen_mc_flush();  	if (HYPERVISOR_set_trap_table(traps)) diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index 86047b18b013..af0ebe18248a 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c @@ -623,8 +623,8 @@ int xen_alloc_p2m_entry(unsigned long pfn)  	}  	/* Expanded the p2m? */ -	if (pfn > xen_p2m_last_pfn) { -		xen_p2m_last_pfn = pfn; +	if (pfn >= xen_p2m_last_pfn) { +		xen_p2m_last_pfn = ALIGN(pfn + 1, P2M_PER_PAGE);  		HYPERVISOR_shared_info->arch.max_pfn = xen_p2m_last_pfn;  	} diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index bdad9be4a729..8a0ebb171363 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -18,7 +18,7 @@ config XTENSA  	select HAVE_DMA_ATTRS  	select HAVE_EXIT_THREAD  	select HAVE_FUNCTION_TRACER -	select HAVE_FUTEX_CMPXCHG if !MMU +	select HAVE_FUTEX_CMPXCHG if !MMU && FUTEX  	select HAVE_IRQ_TIME_ACCOUNTING  	select HAVE_OPROFILE  	select HAVE_PERF_EVENTS diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c index 92d785fefb6d..5d264ae517f5 100644 --- a/arch/xtensa/platforms/iss/console.c +++ b/arch/xtensa/platforms/iss/console.c @@ -186,9 +186,13 @@ static const struct tty_operations serial_ops = {  int __init rs_init(void)  { -	tty_port_init(&serial_port); +	int ret;  	serial_driver = alloc_tty_driver(SERIAL_MAX_NUM_LINES); +	if (!serial_driver) +		return -ENOMEM; + +	tty_port_init(&serial_port);  	printk ("%s %s\n", serial_name, serial_version); @@ -208,8 +212,15 @@ int __init rs_init(void)  	tty_set_operations(serial_driver, &serial_ops);  	tty_port_link_device(&serial_port, serial_driver, 0); -	if (tty_register_driver(serial_driver)) -		panic("Couldn't register serial driver\n"); +	ret = tty_register_driver(serial_driver); +	if (ret) { +		pr_err("Couldn't register serial driver\n"); +		tty_driver_kref_put(serial_driver); +		tty_port_destroy(&serial_port); + +		return ret; +	} +  	return 0;  } diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 17bdd6b55beb..fbd08c4569ce 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -1588,6 +1588,7 @@ int blk_throtl_init(struct request_queue *q)  void blk_throtl_exit(struct request_queue *q)  {  	BUG_ON(!q->td); +	del_timer_sync(&q->td->service_queue.pending_timer);  	throtl_shutdown_wq(q);  	blkcg_deactivate_policy(q, &blkcg_policy_throtl);  	kfree(q->td); diff --git a/certs/Makefile b/certs/Makefile index 9d89b992eee6..f82be3690250 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -43,11 +43,19 @@ endif  redirect_openssl	= 2>&1  quiet_redirect_openssl	= 2>&1  silent_redirect_openssl = 2>/dev/null +openssl_available       = $(shell openssl help 2>/dev/null && echo yes)  # We do it this way rather than having a boolean option for enabling an  # external private key, because 'make randconfig' might enable such a  # boolean option and we unfortunately can't make it depend on !RANDCONFIG.  ifeq ($(CONFIG_MODULE_SIG_KEY),"certs/signing_key.pem") + +ifeq ($(openssl_available),yes) +X509TEXT=$(shell openssl x509 -in "certs/signing_key.pem" -text 2>/dev/null) + +$(if $(findstring rsaEncryption,$(X509TEXT)),,$(shell rm -f "certs/signing_key.pem")) +endif +  $(obj)/signing_key.pem: $(obj)/x509.genkey  	@$(kecho) "###"  	@$(kecho) "### Now generating an X.509 key pair to be used for signing modules." diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 8ed3f6d75ff1..7120da5a03f3 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -2077,6 +2077,25 @@ static inline u8 ata_dev_knobble(struct ata_device *dev)  	return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(dev->id)));  } +static bool ata_dev_check_adapter(struct ata_device *dev, +				  unsigned short vendor_id) +{ +	struct pci_dev *pcidev = NULL; +	struct device *parent_dev = NULL; + +	for (parent_dev = dev->tdev.parent; parent_dev != NULL; +	     parent_dev = parent_dev->parent) { +		if (dev_is_pci(parent_dev)) { +			pcidev = to_pci_dev(parent_dev); +			if (pcidev->vendor == vendor_id) +				return true; +			break; +		} +	} + +	return false; +} +  static int ata_dev_config_ncq(struct ata_device *dev,  			       char *desc, size_t desc_sz)  { @@ -2093,6 +2112,13 @@ static int ata_dev_config_ncq(struct ata_device *dev,  		snprintf(desc, desc_sz, "NCQ (not used)");  		return 0;  	} + +	if (dev->horkage & ATA_HORKAGE_NO_NCQ_ON_ATI && +	    ata_dev_check_adapter(dev, PCI_VENDOR_ID_ATI)) { +		snprintf(desc, desc_sz, "NCQ (not used)"); +		return 0; +	} +  	if (ap->flags & ATA_FLAG_NCQ) {  		hdepth = min(ap->scsi_host->can_queue, ATA_MAX_QUEUE - 1);  		dev->flags |= ATA_DFLAG_NCQ; @@ -4269,6 +4295,12 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {  						ATA_HORKAGE_ZERO_AFTER_TRIM, },  	{ "Samsung SSD 850*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM |  						ATA_HORKAGE_ZERO_AFTER_TRIM, }, +	{ "Samsung SSD 860*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM | +						ATA_HORKAGE_ZERO_AFTER_TRIM | +						ATA_HORKAGE_NO_NCQ_ON_ATI, }, +	{ "Samsung SSD 870*",		NULL,	ATA_HORKAGE_NO_NCQ_TRIM | +						ATA_HORKAGE_ZERO_AFTER_TRIM | +						ATA_HORKAGE_NO_NCQ_ON_ATI, },  	{ "FCCT*M500*",			NULL,	ATA_HORKAGE_NO_NCQ_TRIM |  						ATA_HORKAGE_ZERO_AFTER_TRIM, }, @@ -6026,7 +6058,7 @@ int ata_host_start(struct ata_host *host)  			have_stop = 1;  	} -	if (host->ops->host_stop) +	if (host->ops && host->ops->host_stop)  		have_stop = 1;  	if (have_stop) { @@ -6516,6 +6548,8 @@ static int __init ata_parse_force_one(char **cur,  		{ "ncq",	.horkage_off	= ATA_HORKAGE_NONCQ },  		{ "noncqtrim",	.horkage_on	= ATA_HORKAGE_NO_NCQ_TRIM },  		{ "ncqtrim",	.horkage_off	= ATA_HORKAGE_NO_NCQ_TRIM }, +		{ "noncqati",	.horkage_on	= ATA_HORKAGE_NO_NCQ_ON_ATI }, +		{ "ncqati",	.horkage_off	= ATA_HORKAGE_NO_NCQ_ON_ATI },  		{ "dump_id",	.horkage_on	= ATA_HORKAGE_DUMP_ID },  		{ "pio0",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 0) },  		{ "pio1",	.xfer_mask	= 1 << (ATA_SHIFT_PIO + 1) }, diff --git a/drivers/base/power/wakeirq.c b/drivers/base/power/wakeirq.c index feba1b211898..8c05e7a5e777 100644 --- a/drivers/base/power/wakeirq.c +++ b/drivers/base/power/wakeirq.c @@ -319,8 +319,13 @@ void dev_pm_arm_wake_irq(struct wake_irq *wirq)  	if (!wirq)  		return; -	if (device_may_wakeup(wirq->dev)) +	if (device_may_wakeup(wirq->dev)) { +		if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED && +		    !pm_runtime_status_suspended(wirq->dev)) +			enable_irq(wirq->irq); +  		enable_irq_wake(wirq->irq); +	}  }  /** @@ -335,6 +340,11 @@ void dev_pm_disarm_wake_irq(struct wake_irq *wirq)  	if (!wirq)  		return; -	if (device_may_wakeup(wirq->dev)) +	if (device_may_wakeup(wirq->dev)) {  		disable_irq_wake(wirq->irq); + +		if (wirq->status & WAKE_IRQ_DEDICATED_ALLOCATED && +		    !pm_runtime_status_suspended(wirq->dev)) +			disable_irq_nosync(wirq->irq); +	}  } diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c index 327f9e374b44..30827ab3bb07 100644 --- a/drivers/bcma/main.c +++ b/drivers/bcma/main.c @@ -246,6 +246,7 @@ EXPORT_SYMBOL(bcma_core_irq);  void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core)  { +	device_initialize(&core->dev);  	core->dev.release = bcma_release_core_dev;  	core->dev.bus = &bcma_bus_type;  	dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index); @@ -309,11 +310,10 @@ static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core)  {  	int err; -	err = device_register(&core->dev); +	err = device_add(&core->dev);  	if (err) {  		bcma_err(bus, "Could not register dev for core 0x%03X\n",  			 core->id.id); -		put_device(&core->dev);  		return;  	}  	core->dev_registered = true; @@ -404,7 +404,7 @@ void bcma_unregister_cores(struct bcma_bus *bus)  	/* Now noone uses internally-handled cores, we can free them */  	list_for_each_entry_safe(core, tmp, &bus->cores, list) {  		list_del(&core->list); -		kfree(core); +		put_device(&core->dev);  	}  } diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig index c794e215ea3d..324abc8d53fa 100644 --- a/drivers/block/Kconfig +++ b/drivers/block/Kconfig @@ -267,7 +267,7 @@ config BLK_DEV_LOOP_MIN_COUNT  	  dynamically allocated with the /dev/loop-control interface.  config BLK_DEV_CRYPTOLOOP -	tristate "Cryptoloop Support" +	tristate "Cryptoloop Support (DEPRECATED)"  	select CRYPTO  	select CRYPTO_CBC  	depends on BLK_DEV_LOOP @@ -279,7 +279,7 @@ config BLK_DEV_CRYPTOLOOP  	  WARNING: This device is not safe for journaled file systems like  	  ext3 or Reiserfs. Please use the Device Mapper crypto module  	  instead, which can be configured to be on-disk compatible with the -	  cryptoloop device. +	  cryptoloop device.  cryptoloop support will be removed in Linux 5.16.  source "drivers/block/drbd/Kconfig" diff --git a/drivers/block/cryptoloop.c b/drivers/block/cryptoloop.c index 99e773cb70d0..d3d1f24ca7a3 100644 --- a/drivers/block/cryptoloop.c +++ b/drivers/block/cryptoloop.c @@ -201,6 +201,8 @@ init_cryptoloop(void)  	if (rc)  		printk(KERN_ERR "cryptoloop: loop_register_transfer failed\n"); +	else +		pr_warn("the cryptoloop driver has been deprecated and will be removed in in Linux 5.16\n");  	return rc;  } diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c index 1d2b9a1a9609..53b1d300ed8f 100644 --- a/drivers/clk/mvebu/kirkwood.c +++ b/drivers/clk/mvebu/kirkwood.c @@ -254,6 +254,7 @@ static const char *powersave_parents[] = {  static const struct clk_muxing_soc_desc kirkwood_mux_desc[] __initconst = {  	{ "powersave", powersave_parents, ARRAY_SIZE(powersave_parents),  		11, 1, 0 }, +	{ }  };  #define to_clk_mux(_hw) container_of(_hw, struct clk_mux, hw) diff --git a/drivers/crypto/mxs-dcp.c b/drivers/crypto/mxs-dcp.c index 1a8dc76e117e..b83e8970a2db 100644 --- a/drivers/crypto/mxs-dcp.c +++ b/drivers/crypto/mxs-dcp.c @@ -167,15 +167,19 @@ static struct dcp *global_sdcp;  static int mxs_dcp_start_dma(struct dcp_async_ctx *actx)  { +	int dma_err;  	struct dcp *sdcp = global_sdcp;  	const int chan = actx->chan;  	uint32_t stat;  	unsigned long ret;  	struct dcp_dma_desc *desc = &sdcp->coh->desc[actx->chan]; -  	dma_addr_t desc_phys = dma_map_single(sdcp->dev, desc, sizeof(*desc),  					      DMA_TO_DEVICE); +	dma_err = dma_mapping_error(sdcp->dev, desc_phys); +	if (dma_err) +		return dma_err; +  	reinit_completion(&sdcp->completion[chan]);  	/* Clear status register. */ @@ -213,18 +217,29 @@ static int mxs_dcp_start_dma(struct dcp_async_ctx *actx)  static int mxs_dcp_run_aes(struct dcp_async_ctx *actx,  			   struct ablkcipher_request *req, int init)  { +	dma_addr_t key_phys, src_phys, dst_phys;  	struct dcp *sdcp = global_sdcp;  	struct dcp_dma_desc *desc = &sdcp->coh->desc[actx->chan];  	struct dcp_aes_req_ctx *rctx = ablkcipher_request_ctx(req);  	int ret; -	dma_addr_t key_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_key, -					     2 * AES_KEYSIZE_128, -					     DMA_TO_DEVICE); -	dma_addr_t src_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_in_buf, -					     DCP_BUF_SZ, DMA_TO_DEVICE); -	dma_addr_t dst_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_out_buf, -					     DCP_BUF_SZ, DMA_FROM_DEVICE); +	key_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_key, +				  2 * AES_KEYSIZE_128, DMA_TO_DEVICE); +	ret = dma_mapping_error(sdcp->dev, key_phys); +	if (ret) +		return ret; + +	src_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_in_buf, +				  DCP_BUF_SZ, DMA_TO_DEVICE); +	ret = dma_mapping_error(sdcp->dev, src_phys); +	if (ret) +		goto err_src; + +	dst_phys = dma_map_single(sdcp->dev, sdcp->coh->aes_out_buf, +				  DCP_BUF_SZ, DMA_FROM_DEVICE); +	ret = dma_mapping_error(sdcp->dev, dst_phys); +	if (ret) +		goto err_dst;  	if (actx->fill % AES_BLOCK_SIZE) {  		dev_err(sdcp->dev, "Invalid block size!\n"); @@ -262,10 +277,12 @@ static int mxs_dcp_run_aes(struct dcp_async_ctx *actx,  	ret = mxs_dcp_start_dma(actx);  aes_done_run: +	dma_unmap_single(sdcp->dev, dst_phys, DCP_BUF_SZ, DMA_FROM_DEVICE); +err_dst: +	dma_unmap_single(sdcp->dev, src_phys, DCP_BUF_SZ, DMA_TO_DEVICE); +err_src:  	dma_unmap_single(sdcp->dev, key_phys, 2 * AES_KEYSIZE_128,  			 DMA_TO_DEVICE); -	dma_unmap_single(sdcp->dev, src_phys, DCP_BUF_SZ, DMA_TO_DEVICE); -	dma_unmap_single(sdcp->dev, dst_phys, DCP_BUF_SZ, DMA_FROM_DEVICE);  	return ret;  } @@ -280,21 +297,20 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)  	struct scatterlist *dst = req->dst;  	struct scatterlist *src = req->src; -	const int nents = sg_nents(req->src); +	int dst_nents = sg_nents(dst);  	const int out_off = DCP_BUF_SZ;  	uint8_t *in_buf = sdcp->coh->aes_in_buf;  	uint8_t *out_buf = sdcp->coh->aes_out_buf; -	uint8_t *out_tmp, *src_buf, *dst_buf = NULL;  	uint32_t dst_off = 0; +	uint8_t *src_buf = NULL;  	uint32_t last_out_len = 0;  	uint8_t *key = sdcp->coh->aes_key;  	int ret = 0; -	int split = 0; -	unsigned int i, len, clen, rem = 0, tlen = 0; +	unsigned int i, len, clen, tlen = 0;  	int init = 0;  	bool limit_hit = false; @@ -312,7 +328,7 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)  		memset(key + AES_KEYSIZE_128, 0, AES_KEYSIZE_128);  	} -	for_each_sg(req->src, src, nents, i) { +	for_each_sg(req->src, src, sg_nents(src), i) {  		src_buf = sg_virt(src);  		len = sg_dma_len(src);  		tlen += len; @@ -337,34 +353,17 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)  			 * submit the buffer.  			 */  			if (actx->fill == out_off || sg_is_last(src) || -				limit_hit) { +			    limit_hit) {  				ret = mxs_dcp_run_aes(actx, req, init);  				if (ret)  					return ret;  				init = 0; -				out_tmp = out_buf; +				sg_pcopy_from_buffer(dst, dst_nents, out_buf, +						     actx->fill, dst_off); +				dst_off += actx->fill;  				last_out_len = actx->fill; -				while (dst && actx->fill) { -					if (!split) { -						dst_buf = sg_virt(dst); -						dst_off = 0; -					} -					rem = min(sg_dma_len(dst) - dst_off, -						  actx->fill); - -					memcpy(dst_buf + dst_off, out_tmp, rem); -					out_tmp += rem; -					dst_off += rem; -					actx->fill -= rem; - -					if (dst_off == sg_dma_len(dst)) { -						dst = sg_next(dst); -						split = 0; -					} else { -						split = 1; -					} -				} +				actx->fill = 0;  			}  		} while (len); @@ -570,6 +569,10 @@ static int mxs_dcp_run_sha(struct ahash_request *req)  	dma_addr_t buf_phys = dma_map_single(sdcp->dev, sdcp->coh->sha_in_buf,  					     DCP_BUF_SZ, DMA_TO_DEVICE); +	ret = dma_mapping_error(sdcp->dev, buf_phys); +	if (ret) +		return ret; +  	/* Fill in the DMA descriptor. */  	desc->control0 = MXS_DCP_CONTROL0_DECR_SEMAPHORE |  		    MXS_DCP_CONTROL0_INTERRUPT | @@ -602,6 +605,10 @@ static int mxs_dcp_run_sha(struct ahash_request *req)  	if (rctx->fini) {  		digest_phys = dma_map_single(sdcp->dev, sdcp->coh->sha_out_buf,  					     DCP_SHA_PAY_SZ, DMA_FROM_DEVICE); +		ret = dma_mapping_error(sdcp->dev, digest_phys); +		if (ret) +			goto done_run; +  		desc->control0 |= MXS_DCP_CONTROL0_HASH_TERM;  		desc->payload = digest_phys;  	} diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c index 7e9a44cee425..be82186a8afb 100644 --- a/drivers/crypto/omap-sham.c +++ b/drivers/crypto/omap-sham.c @@ -1630,7 +1630,7 @@ static void omap_sham_done_task(unsigned long data)  				goto finish;  		}  	} else if (test_bit(FLAGS_DMA_READY, &dd->flags)) { -		if (test_and_clear_bit(FLAGS_DMA_ACTIVE, &dd->flags)) { +		if (test_bit(FLAGS_DMA_ACTIVE, &dd->flags)) {  			omap_sham_update_dma_stop(dd);  			if (dd->err) {  				err = dd->err; diff --git a/drivers/crypto/qat/qat_common/adf_init.c b/drivers/crypto/qat/qat_common/adf_init.c index d873eeecc363..06b35edb0d43 100644 --- a/drivers/crypto/qat/qat_common/adf_init.c +++ b/drivers/crypto/qat/qat_common/adf_init.c @@ -121,6 +121,7 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)  	struct service_hndl *service;  	struct list_head *list_itr;  	struct adf_hw_device_data *hw_data = accel_dev->hw_device; +	int ret;  	if (!hw_data) {  		dev_err(&GET_DEV(accel_dev), @@ -187,9 +188,9 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)  	}  	hw_data->enable_error_correction(accel_dev); -	hw_data->enable_vf2pf_comms(accel_dev); +	ret = hw_data->enable_vf2pf_comms(accel_dev); -	return 0; +	return ret;  }  EXPORT_SYMBOL_GPL(adf_dev_init); diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c index 5fdbad809343..711706819b05 100644 --- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c +++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c @@ -384,6 +384,8 @@ static int adf_vf2pf_request_version(struct adf_accel_dev *accel_dev)  	msg |= ADF_PFVF_COMPATIBILITY_VERSION << ADF_VF2PF_COMPAT_VER_REQ_SHIFT;  	BUILD_BUG_ON(ADF_PFVF_COMPATIBILITY_VERSION > 255); +	reinit_completion(&accel_dev->vf.iov_msg_completion); +  	/* Send request from VF to PF */  	ret = adf_iov_putmsg(accel_dev, msg, 0);  	if (ret) { diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig index 35f8d70fd871..41ce77dff9c6 100644 --- a/drivers/dma/Kconfig +++ b/drivers/dma/Kconfig @@ -239,7 +239,7 @@ config INTEL_IDMA64  config INTEL_IOATDMA  	tristate "Intel I/OAT DMA support" -	depends on PCI && X86_64 +	depends on PCI && X86_64 && !UML  	select DMA_ENGINE  	select DMA_ENGINE_RAID  	select DCA diff --git a/drivers/dma/acpi-dma.c b/drivers/dma/acpi-dma.c index 16d0daa058a5..eef1b93828c2 100644 --- a/drivers/dma/acpi-dma.c +++ b/drivers/dma/acpi-dma.c @@ -15,6 +15,7 @@  #include <linux/device.h>  #include <linux/err.h>  #include <linux/module.h> +#include <linux/kernel.h>  #include <linux/list.h>  #include <linux/mutex.h>  #include <linux/slab.h> @@ -71,8 +72,14 @@ static int acpi_dma_parse_resource_group(const struct acpi_csrt_group *grp,  	si = (const struct acpi_csrt_shared_info *)&grp[1]; -	/* Match device by MMIO and IRQ */ -	if (si->mmio_base_low != mem || si->gsi_interrupt != irq) +	/* Match device by MMIO */ +	if (si->mmio_base_low != lower_32_bits(mem) || +	    si->mmio_base_high != upper_32_bits(mem)) +		return 0; + +	/* Match device by Linux vIRQ */ +	ret = acpi_register_gsi(NULL, si->gsi_interrupt, si->interrupt_mode, si->interrupt_polarity); +	if (ret != irq)  		return 0;  	dev_dbg(&adev->dev, "matches with %.4s%04X (rev %u)\n", diff --git a/drivers/edac/synopsys_edac.c b/drivers/edac/synopsys_edac.c index fc153aea2f6c..091f03852dca 100644 --- a/drivers/edac/synopsys_edac.c +++ b/drivers/edac/synopsys_edac.c @@ -371,7 +371,7 @@ static int synps_edac_init_csrows(struct mem_ctl_info *mci)  		for (j = 0; j < csi->nr_channels; j++) {  			dimm            = csi->channels[j]->dimm; -			dimm->edac_mode = EDAC_FLAG_SECDED; +			dimm->edac_mode = EDAC_SECDED;  			dimm->mtype     = synps_edac_get_mtype(priv->baseaddr);  			dimm->nr_pages  = (size >> PAGE_SHIFT) / csi->nr_channels;  			dimm->grain     = SYNPS_EDAC_ERR_GRAIN; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c index 31a676376d73..3490d300bed2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c @@ -340,7 +340,7 @@ static void amdgpu_i2c_put_byte(struct amdgpu_i2c_chan *i2c_bus,  void  amdgpu_i2c_router_select_ddc_port(struct amdgpu_connector *amdgpu_connector)  { -	u8 val; +	u8 val = 0;  	if (!amdgpu_connector->router.ddc_valid)  		return; diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c index f9bed1058f38..e3f07f58bbed 100644 --- a/drivers/gpu/drm/msm/dsi/dsi.c +++ b/drivers/gpu/drm/msm/dsi/dsi.c @@ -36,8 +36,10 @@ static int dsi_get_phy(struct msm_dsi *msm_dsi)  	}  	phy_pdev = of_find_device_by_node(phy_node); -	if (phy_pdev) +	if (phy_pdev) {  		msm_dsi->phy = platform_get_drvdata(phy_pdev); +		msm_dsi->phy_dev = &phy_pdev->dev; +	}  	of_node_put(phy_node); @@ -46,8 +48,6 @@ static int dsi_get_phy(struct msm_dsi *msm_dsi)  		return -EPROBE_DEFER;  	} -	msm_dsi->phy_dev = get_device(&phy_pdev->dev); -  	return 0;  } diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c index cf8bc068e9b7..381c59279d7f 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c @@ -56,7 +56,7 @@ nvkm_control_mthd_pstate_info(struct nvkm_control *ctrl, void *data, u32 size)  		args->v0.count = 0;  		args->v0.ustate_ac = NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE;  		args->v0.ustate_dc = NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE; -		args->v0.pwrsrc = -ENOSYS; +		args->v0.pwrsrc = -ENODEV;  		args->v0.pstate = NVIF_CONTROL_PSTATE_INFO_V0_PSTATE_UNKNOWN;  	} diff --git a/drivers/hid/hid-betopff.c b/drivers/hid/hid-betopff.c index 69cfc8dc6af1..9b60efe6ec44 100644 --- a/drivers/hid/hid-betopff.c +++ b/drivers/hid/hid-betopff.c @@ -59,15 +59,22 @@ static int betopff_init(struct hid_device *hid)  {  	struct betopff_device *betopff;  	struct hid_report *report; -	struct hid_input *hidinput = -			list_first_entry(&hid->inputs, struct hid_input, list); +	struct hid_input *hidinput;  	struct list_head *report_list =  			&hid->report_enum[HID_OUTPUT_REPORT].report_list; -	struct input_dev *dev = hidinput->input; +	struct input_dev *dev;  	int field_count = 0;  	int error;  	int i, j; +	if (list_empty(&hid->inputs)) { +		hid_err(hid, "no inputs found\n"); +		return -ENODEV; +	} + +	hidinput = list_first_entry(&hid->inputs, struct hid_input, list); +	dev = hidinput->input; +  	if (list_empty(report_list)) {  		hid_err(hid, "no output reports found\n");  		return -ENODEV; diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index d51fc2be0e10..c7da6ec4d923 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -500,7 +500,7 @@ static void hid_ctrl(struct urb *urb)  	if (unplug) {  		usbhid->ctrltail = usbhid->ctrlhead; -	} else { +	} else if (usbhid->ctrlhead != usbhid->ctrltail) {  		usbhid->ctrltail = (usbhid->ctrltail + 1) & (HID_CONTROL_FIFO_SIZE - 1);  		if (usbhid->ctrlhead != usbhid->ctrltail && @@ -1185,9 +1185,20 @@ static void usbhid_stop(struct hid_device *hid)  		usbhid->intf->needs_remote_wakeup = 0;  	clear_bit(HID_STARTED, &usbhid->iofl); +  	spin_lock_irq(&usbhid->lock);	/* Sync with error and led handlers */  	set_bit(HID_DISCONNECTED, &usbhid->iofl); +	while (usbhid->ctrltail != usbhid->ctrlhead) { +		if (usbhid->ctrl[usbhid->ctrltail].dir == USB_DIR_OUT) { +			kfree(usbhid->ctrl[usbhid->ctrltail].raw_report); +			usbhid->ctrl[usbhid->ctrltail].raw_report = NULL; +		} + +		usbhid->ctrltail = (usbhid->ctrltail + 1) & +			(HID_CONTROL_FIFO_SIZE - 1); +	}  	spin_unlock_irq(&usbhid->lock); +  	usb_kill_urb(usbhid->urbin);  	usb_kill_urb(usbhid->urbout);  	usb_kill_urb(usbhid->urbctrl); diff --git a/drivers/i2c/busses/i2c-highlander.c b/drivers/i2c/busses/i2c-highlander.c index 56dc69e7349f..9ad031ea3300 100644 --- a/drivers/i2c/busses/i2c-highlander.c +++ b/drivers/i2c/busses/i2c-highlander.c @@ -382,7 +382,7 @@ static int highlander_i2c_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, dev);  	dev->irq = platform_get_irq(pdev, 0); -	if (iic_force_poll) +	if (dev->irq < 0 || iic_force_poll)  		dev->irq = 0;  	if (dev->irq) { diff --git a/drivers/i2c/busses/i2c-iop3xx.c b/drivers/i2c/busses/i2c-iop3xx.c index 72d6161cf77c..6b9031ccd767 100644 --- a/drivers/i2c/busses/i2c-iop3xx.c +++ b/drivers/i2c/busses/i2c-iop3xx.c @@ -459,16 +459,14 @@ iop3xx_i2c_probe(struct platform_device *pdev)  	irq = platform_get_irq(pdev, 0);  	if (irq < 0) { -		ret = -ENXIO; +		ret = irq;  		goto unmap;  	}  	ret = request_irq(irq, iop3xx_i2c_irq_handler, 0,  				pdev->name, adapter_data); -	if (ret) { -		ret = -EIO; +	if (ret)  		goto unmap; -	}  	memcpy(new_adapter->name, pdev->name, strlen(pdev->name));  	new_adapter->owner = THIS_MODULE; diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c index 9b867169142f..42a998fa5f79 100644 --- a/drivers/i2c/busses/i2c-mt65xx.c +++ b/drivers/i2c/busses/i2c-mt65xx.c @@ -639,7 +639,7 @@ static int mtk_i2c_probe(struct platform_device *pdev)  		return PTR_ERR(i2c->pdmabase);  	irq = platform_get_irq(pdev, 0); -	if (irq <= 0) +	if (irq < 0)  		return irq;  	init_completion(&i2c->msg_complete); diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index bea74aa3f56c..44af640496bb 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -1213,7 +1213,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev)  	if (!(i2c->quirks & QUIRK_POLL)) {  		i2c->irq = ret = platform_get_irq(pdev, 0); -		if (ret <= 0) { +		if (ret < 0) {  			dev_err(&pdev->dev, "cannot find IRQ\n");  			clk_unprepare(i2c->clk);  			return ret; diff --git a/drivers/iio/dac/ad5624r_spi.c b/drivers/iio/dac/ad5624r_spi.c index 5489ec43b95d..e5cefdb674f8 100644 --- a/drivers/iio/dac/ad5624r_spi.c +++ b/drivers/iio/dac/ad5624r_spi.c @@ -231,7 +231,7 @@ static int ad5624r_probe(struct spi_device *spi)  	if (!indio_dev)  		return -ENOMEM;  	st = iio_priv(indio_dev); -	st->reg = devm_regulator_get(&spi->dev, "vcc"); +	st->reg = devm_regulator_get_optional(&spi->dev, "vref");  	if (!IS_ERR(st->reg)) {  		ret = regulator_enable(st->reg);  		if (ret) @@ -242,6 +242,22 @@ static int ad5624r_probe(struct spi_device *spi)  			goto error_disable_reg;  		voltage_uv = ret; +	} else { +		if (PTR_ERR(st->reg) != -ENODEV) +			return PTR_ERR(st->reg); +		/* Backwards compatibility. This naming is not correct */ +		st->reg = devm_regulator_get_optional(&spi->dev, "vcc"); +		if (!IS_ERR(st->reg)) { +			ret = regulator_enable(st->reg); +			if (ret) +				return ret; + +			ret = regulator_get_voltage(st->reg); +			if (ret < 0) +				goto error_disable_reg; + +			voltage_uv = ret; +		}  	}  	spi_set_drvdata(spi, indio_dev); diff --git a/drivers/ipack/devices/ipoctal.c b/drivers/ipack/devices/ipoctal.c index 035d5449227e..c1175464064b 100644 --- a/drivers/ipack/devices/ipoctal.c +++ b/drivers/ipack/devices/ipoctal.c @@ -38,6 +38,7 @@ struct ipoctal_channel {  	unsigned int			pointer_read;  	unsigned int			pointer_write;  	struct tty_port			tty_port; +	bool				tty_registered;  	union scc2698_channel __iomem	*regs;  	union scc2698_block __iomem	*block_regs;  	unsigned int			board_id; @@ -86,22 +87,34 @@ static int ipoctal_port_activate(struct tty_port *port, struct tty_struct *tty)  	return 0;  } -static int ipoctal_open(struct tty_struct *tty, struct file *file) +static int ipoctal_install(struct tty_driver *driver, struct tty_struct *tty)  {  	struct ipoctal_channel *channel = dev_get_drvdata(tty->dev);  	struct ipoctal *ipoctal = chan_to_ipoctal(channel, tty->index); -	int err; - -	tty->driver_data = channel; +	int res;  	if (!ipack_get_carrier(ipoctal->dev))  		return -EBUSY; -	err = tty_port_open(&channel->tty_port, tty, file); -	if (err) -		ipack_put_carrier(ipoctal->dev); +	res = tty_standard_install(driver, tty); +	if (res) +		goto err_put_carrier; + +	tty->driver_data = channel; + +	return 0; + +err_put_carrier: +	ipack_put_carrier(ipoctal->dev); + +	return res; +} + +static int ipoctal_open(struct tty_struct *tty, struct file *file) +{ +	struct ipoctal_channel *channel = tty->driver_data; -	return err; +	return tty_port_open(&channel->tty_port, tty, file);  }  static void ipoctal_reset_stats(struct ipoctal_stats *stats) @@ -269,7 +282,6 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,  	int res;  	int i;  	struct tty_driver *tty; -	char name[20];  	struct ipoctal_channel *channel;  	struct ipack_region *region;  	void __iomem *addr; @@ -360,8 +372,11 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,  	/* Fill struct tty_driver with ipoctal data */  	tty->owner = THIS_MODULE;  	tty->driver_name = KBUILD_MODNAME; -	sprintf(name, KBUILD_MODNAME ".%d.%d.", bus_nr, slot); -	tty->name = name; +	tty->name = kasprintf(GFP_KERNEL, KBUILD_MODNAME ".%d.%d.", bus_nr, slot); +	if (!tty->name) { +		res = -ENOMEM; +		goto err_put_driver; +	}  	tty->major = 0;  	tty->minor_start = 0; @@ -377,8 +392,7 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,  	res = tty_register_driver(tty);  	if (res) {  		dev_err(&ipoctal->dev->dev, "Can't register tty driver.\n"); -		put_tty_driver(tty); -		return res; +		goto err_free_name;  	}  	/* Save struct tty_driver for use it when uninstalling the device */ @@ -389,7 +403,9 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,  		channel = &ipoctal->channel[i];  		tty_port_init(&channel->tty_port); -		tty_port_alloc_xmit_buf(&channel->tty_port); +		res = tty_port_alloc_xmit_buf(&channel->tty_port); +		if (res) +			continue;  		channel->tty_port.ops = &ipoctal_tty_port_ops;  		ipoctal_reset_stats(&channel->stats); @@ -397,13 +413,15 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,  		spin_lock_init(&channel->lock);  		channel->pointer_read = 0;  		channel->pointer_write = 0; -		tty_dev = tty_port_register_device(&channel->tty_port, tty, i, NULL); +		tty_dev = tty_port_register_device_attr(&channel->tty_port, tty, +							i, NULL, channel, NULL);  		if (IS_ERR(tty_dev)) {  			dev_err(&ipoctal->dev->dev, "Failed to register tty device.\n"); +			tty_port_free_xmit_buf(&channel->tty_port);  			tty_port_destroy(&channel->tty_port);  			continue;  		} -		dev_set_drvdata(tty_dev, channel); +		channel->tty_registered = true;  	}  	/* @@ -415,6 +433,13 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,  				       ipoctal_irq_handler, ipoctal);  	return 0; + +err_free_name: +	kfree(tty->name); +err_put_driver: +	put_tty_driver(tty); + +	return res;  }  static inline int ipoctal_copy_write_buffer(struct ipoctal_channel *channel, @@ -656,6 +681,7 @@ static void ipoctal_cleanup(struct tty_struct *tty)  static const struct tty_operations ipoctal_fops = {  	.ioctl =		NULL, +	.install =		ipoctal_install,  	.open =			ipoctal_open,  	.close =		ipoctal_close,  	.write =		ipoctal_write_tty, @@ -698,12 +724,17 @@ static void __ipoctal_remove(struct ipoctal *ipoctal)  	for (i = 0; i < NR_CHANNELS; i++) {  		struct ipoctal_channel *channel = &ipoctal->channel[i]; + +		if (!channel->tty_registered) +			continue; +  		tty_unregister_device(ipoctal->tty_drv, i);  		tty_port_free_xmit_buf(&channel->tty_port);  		tty_port_destroy(&channel->tty_port);  	}  	tty_unregister_driver(ipoctal->tty_drv); +	kfree(ipoctal->tty_drv->name);  	put_tty_driver(ipoctal->tty_drv);  	kfree(ipoctal);  } diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c index c3befb3f5dcd..546cd995ab29 100644 --- a/drivers/media/i2c/tc358743.c +++ b/drivers/media/i2c/tc358743.c @@ -241,7 +241,7 @@ static void i2c_wr16(struct v4l2_subdev *sd, u16 reg, u16 val)  static void i2c_wr16_and_or(struct v4l2_subdev *sd, u16 reg, u16 mask, u16 val)  { -	i2c_wrreg(sd, reg, (i2c_rdreg(sd, reg, 2) & mask) | val, 2); +	i2c_wrreg(sd, reg, (i2c_rdreg(sd, reg, 1) & mask) | val, 1);  }  static u32 i2c_rd32(struct v4l2_subdev *sd, u16 reg) diff --git a/drivers/media/rc/rc-loopback.c b/drivers/media/rc/rc-loopback.c index 63dace8198b0..b3810b85e7d5 100644 --- a/drivers/media/rc/rc-loopback.c +++ b/drivers/media/rc/rc-loopback.c @@ -55,7 +55,7 @@ static int loop_set_tx_mask(struct rc_dev *dev, u32 mask)  	if ((mask & (RXMASK_REGULAR | RXMASK_LEARNING)) != mask) {  		dprintk("invalid tx mask: %u\n", mask); -		return -EINVAL; +		return 2;  	}  	dprintk("setting tx mask: %u\n", mask); diff --git a/drivers/media/usb/dvb-usb/nova-t-usb2.c b/drivers/media/usb/dvb-usb/nova-t-usb2.c index 6c55384e2fca..c570c4af64f3 100644 --- a/drivers/media/usb/dvb-usb/nova-t-usb2.c +++ b/drivers/media/usb/dvb-usb/nova-t-usb2.c @@ -122,7 +122,7 @@ static int nova_t_rc_query(struct dvb_usb_device *d, u32 *event, int *state)  static int nova_t_read_mac_address (struct dvb_usb_device *d, u8 mac[6])  { -	int i; +	int i, ret;  	u8 b;  	mac[0] = 0x00; @@ -131,7 +131,9 @@ static int nova_t_read_mac_address (struct dvb_usb_device *d, u8 mac[6])  	/* this is a complete guess, but works for my box */  	for (i = 136; i < 139; i++) { -		dibusb_read_eeprom_byte(d,i, &b); +		ret = dibusb_read_eeprom_byte(d, i, &b); +		if (ret) +			return ret;  		mac[5 - (i - 136)] = b;  	} diff --git a/drivers/media/usb/dvb-usb/vp702x.c b/drivers/media/usb/dvb-usb/vp702x.c index ee1e19e36445..55d515507f0e 100644 --- a/drivers/media/usb/dvb-usb/vp702x.c +++ b/drivers/media/usb/dvb-usb/vp702x.c @@ -294,16 +294,22 @@ static int vp702x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)  static int vp702x_read_mac_addr(struct dvb_usb_device *d,u8 mac[6])  {  	u8 i, *buf; +	int ret;  	struct vp702x_device_state *st = d->priv;  	mutex_lock(&st->buf_mutex);  	buf = st->buf; -	for (i = 6; i < 12; i++) -		vp702x_usb_in_op(d, READ_EEPROM_REQ, i, 1, &buf[i - 6], 1); +	for (i = 6; i < 12; i++) { +		ret = vp702x_usb_in_op(d, READ_EEPROM_REQ, i, 1, +				       &buf[i - 6], 1); +		if (ret < 0) +			goto err; +	}  	memcpy(mac, buf, 6); +err:  	mutex_unlock(&st->buf_mutex); -	return 0; +	return ret;  }  static int vp702x_frontend_attach(struct dvb_usb_adapter *adap) diff --git a/drivers/media/usb/go7007/go7007-driver.c b/drivers/media/usb/go7007/go7007-driver.c index ae1cfa792c58..11429bf28c8a 100644 --- a/drivers/media/usb/go7007/go7007-driver.c +++ b/drivers/media/usb/go7007/go7007-driver.c @@ -698,49 +698,23 @@ struct go7007 *go7007_alloc(const struct go7007_board_info *board,  						struct device *dev)  {  	struct go7007 *go; -	int i;  	go = kzalloc(sizeof(struct go7007), GFP_KERNEL);  	if (go == NULL)  		return NULL;  	go->dev = dev;  	go->board_info = board; -	go->board_id = 0;  	go->tuner_type = -1; -	go->channel_number = 0; -	go->name[0] = 0;  	mutex_init(&go->hw_lock);  	init_waitqueue_head(&go->frame_waitq);  	spin_lock_init(&go->spinlock);  	go->status = STATUS_INIT; -	memset(&go->i2c_adapter, 0, sizeof(go->i2c_adapter)); -	go->i2c_adapter_online = 0; -	go->interrupt_available = 0;  	init_waitqueue_head(&go->interrupt_waitq); -	go->input = 0;  	go7007_update_board(go); -	go->encoder_h_halve = 0; -	go->encoder_v_halve = 0; -	go->encoder_subsample = 0;  	go->format = V4L2_PIX_FMT_MJPEG;  	go->bitrate = 1500000;  	go->fps_scale = 1; -	go->pali = 0;  	go->aspect_ratio = GO7007_RATIO_1_1; -	go->gop_size = 0; -	go->ipb = 0; -	go->closed_gop = 0; -	go->repeat_seqhead = 0; -	go->seq_header_enable = 0; -	go->gop_header_enable = 0; -	go->dvd_mode = 0; -	go->interlace_coding = 0; -	for (i = 0; i < 4; ++i) -		go->modet[i].enable = 0; -	for (i = 0; i < 1624; ++i) -		go->modet_map[i] = 0; -	go->audio_deliver = NULL; -	go->audio_enabled = 0;  	return go;  } diff --git a/drivers/media/usb/stkwebcam/stk-webcam.c b/drivers/media/usb/stkwebcam/stk-webcam.c index 17ee9cde4156..51ac9d067acf 100644 --- a/drivers/media/usb/stkwebcam/stk-webcam.c +++ b/drivers/media/usb/stkwebcam/stk-webcam.c @@ -1353,7 +1353,7 @@ static int stk_camera_probe(struct usb_interface *interface,  	if (!dev->isoc_ep) {  		STK_ERROR("Could not find isoc-in endpoint");  		err = -ENODEV; -		goto error; +		goto error_put;  	}  	dev->vsettings.palette = V4L2_PIX_FMT_RGB565;  	dev->vsettings.mode = MODE_VGA; @@ -1366,10 +1366,12 @@ static int stk_camera_probe(struct usb_interface *interface,  	err = stk_register_video_device(dev);  	if (err) -		goto error; +		goto error_put;  	return 0; +error_put: +	usb_put_intf(interface);  error:  	v4l2_ctrl_handler_free(hdl);  	v4l2_device_unregister(&dev->v4l2_dev); diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index 154f5bd45940..049d664e94f0 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -866,8 +866,8 @@ static int uvc_ioctl_g_input(struct file *file, void *fh, unsigned int *input)  {  	struct uvc_fh *handle = fh;  	struct uvc_video_chain *chain = handle->chain; +	u8 *buf;  	int ret; -	u8 i;  	if (chain->selector == NULL ||  	    (chain->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) { @@ -875,22 +875,27 @@ static int uvc_ioctl_g_input(struct file *file, void *fh, unsigned int *input)  		return 0;  	} +	buf = kmalloc(1, GFP_KERNEL); +	if (!buf) +		return -ENOMEM; +  	ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, chain->selector->id,  			     chain->dev->intfnum,  UVC_SU_INPUT_SELECT_CONTROL, -			     &i, 1); -	if (ret < 0) -		return ret; +			     buf, 1); +	if (!ret) +		*input = *buf - 1; -	*input = i - 1; -	return 0; +	kfree(buf); + +	return ret;  }  static int uvc_ioctl_s_input(struct file *file, void *fh, unsigned int input)  {  	struct uvc_fh *handle = fh;  	struct uvc_video_chain *chain = handle->chain; +	u8 *buf;  	int ret; -	u32 i;  	ret = uvc_acquire_privileges(handle);  	if (ret < 0) @@ -906,10 +911,17 @@ static int uvc_ioctl_s_input(struct file *file, void *fh, unsigned int input)  	if (input >= chain->selector->bNrInPins)  		return -EINVAL; -	i = input + 1; -	return uvc_query_ctrl(chain->dev, UVC_SET_CUR, chain->selector->id, -			      chain->dev->intfnum, UVC_SU_INPUT_SELECT_CONTROL, -			      &i, 1); +	buf = kmalloc(1, GFP_KERNEL); +	if (!buf) +		return -ENOMEM; + +	*buf = input + 1; +	ret = uvc_query_ctrl(chain->dev, UVC_SET_CUR, chain->selector->id, +			     chain->dev->intfnum, UVC_SU_INPUT_SELECT_CONTROL, +			     buf, 1); +	kfree(buf); + +	return ret;  }  static int uvc_ioctl_queryctrl(struct file *file, void *fh, diff --git a/drivers/misc/vmw_vmci/vmci_queue_pair.c b/drivers/misc/vmw_vmci/vmci_queue_pair.c index fcc4b4026834..11325bc70aef 100644 --- a/drivers/misc/vmw_vmci/vmci_queue_pair.c +++ b/drivers/misc/vmw_vmci/vmci_queue_pair.c @@ -2344,7 +2344,8 @@ int vmci_qp_broker_map(struct vmci_handle handle,  	is_local = entry->qp.flags & VMCI_QPFLAG_LOCAL;  	result = VMCI_SUCCESS; -	if (context_id != VMCI_HOST_CONTEXT_ID) { +	if (context_id != VMCI_HOST_CONTEXT_ID && +	    !QPBROKERSTATE_HAS_MEM(entry)) {  		struct vmci_qp_page_store page_store;  		page_store.pages = guest_mem; @@ -2454,7 +2455,8 @@ int vmci_qp_broker_unmap(struct vmci_handle handle,  	is_local = entry->qp.flags & VMCI_QPFLAG_LOCAL; -	if (context_id != VMCI_HOST_CONTEXT_ID) { +	if (context_id != VMCI_HOST_CONTEXT_ID && +	    QPBROKERSTATE_HAS_MEM(entry)) {  		qp_acquire_queue_mutex(entry->produce_q);  		result = qp_save_headers(entry);  		if (result < VMCI_SUCCESS) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 9eff3b41a086..03ac8d599763 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -701,6 +701,7 @@ static int dw_mci_edmac_start_dma(struct dw_mci *host,  	int ret = 0;  	/* Set external dma config: burst size, burst width */ +	memset(&cfg, 0, sizeof(cfg));  	cfg.dst_addr = host->phy_regs + fifo_offset;  	cfg.src_addr = cfg.dst_addr;  	cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; diff --git a/drivers/mmc/host/moxart-mmc.c b/drivers/mmc/host/moxart-mmc.c index bbad309679cf..41a5493cb68d 100644 --- a/drivers/mmc/host/moxart-mmc.c +++ b/drivers/mmc/host/moxart-mmc.c @@ -633,6 +633,7 @@ static int moxart_probe(struct platform_device *pdev)  			 host->dma_chan_tx, host->dma_chan_rx);  		host->have_dma = true; +		memset(&cfg, 0, sizeof(cfg));  		cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;  		cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c index 93137483ecde..10ec88833889 100644 --- a/drivers/mmc/host/rtsx_pci_sdmmc.c +++ b/drivers/mmc/host/rtsx_pci_sdmmc.c @@ -553,9 +553,22 @@ static int sd_write_long_data(struct realtek_pci_sdmmc *host,  	return 0;  } +static inline void sd_enable_initial_mode(struct realtek_pci_sdmmc *host) +{ +	rtsx_pci_write_register(host->pcr, SD_CFG1, +			SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_128); +} + +static inline void sd_disable_initial_mode(struct realtek_pci_sdmmc *host) +{ +	rtsx_pci_write_register(host->pcr, SD_CFG1, +			SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_0); +} +  static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq)  {  	struct mmc_data *data = mrq->data; +	int err;  	if (host->sg_count < 0) {  		data->error = host->sg_count; @@ -564,22 +577,19 @@ static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq)  		return data->error;  	} -	if (data->flags & MMC_DATA_READ) -		return sd_read_long_data(host, mrq); +	if (data->flags & MMC_DATA_READ) { +		if (host->initial_mode) +			sd_disable_initial_mode(host); -	return sd_write_long_data(host, mrq); -} +		err = sd_read_long_data(host, mrq); -static inline void sd_enable_initial_mode(struct realtek_pci_sdmmc *host) -{ -	rtsx_pci_write_register(host->pcr, SD_CFG1, -			SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_128); -} +		if (host->initial_mode) +			sd_enable_initial_mode(host); -static inline void sd_disable_initial_mode(struct realtek_pci_sdmmc *host) -{ -	rtsx_pci_write_register(host->pcr, SD_CFG1, -			SD_CLK_DIVIDE_MASK, SD_CLK_DIVIDE_0); +		return err; +	} + +	return sd_write_long_data(host, mrq);  }  static void sd_normal_rw(struct realtek_pci_sdmmc *host, diff --git a/drivers/mtd/nand/cafe_nand.c b/drivers/mtd/nand/cafe_nand.c index 9de78d2a2eb1..10c063d73ee3 100644 --- a/drivers/mtd/nand/cafe_nand.c +++ b/drivers/mtd/nand/cafe_nand.c @@ -672,7 +672,7 @@ static int cafe_nand_probe(struct pci_dev *pdev,  			  "CAFE NAND", mtd);  	if (err) {  		dev_warn(&pdev->dev, "Could not register IRQ %d\n", pdev->irq); -		goto out_ior; +		goto out_free_rs;  	}  	/* Disable master reset, enable NAND clock */ @@ -781,6 +781,8 @@ static int cafe_nand_probe(struct pci_dev *pdev,  	/* Disable NAND IRQ in global IRQ mask register */  	cafe_writel(cafe, ~1 & cafe_readl(cafe, GLOBAL_IRQ_MASK), GLOBAL_IRQ_MASK);  	free_irq(pdev->irq, mtd); + out_free_rs: +	free_rs(cafe->rs);   out_ior:  	pci_iounmap(pdev, cafe->mmio);   out_free_mtd: diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c index 92c965cb3633..38fae8802663 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c @@ -1246,7 +1246,7 @@ int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param,  	/* SR-IOV capability was enabled but there are no VFs*/  	if (iov->total == 0) { -		err = -EINVAL; +		err = 0;  		goto failed;  	} diff --git a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c index f5f1b0b51ebd..79eb2257a30e 100644 --- a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c +++ b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c @@ -1133,6 +1133,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	if (!adapter->registered_device_map) {  		pr_err("%s: could not register any net devices\n",  		       pci_name(pdev)); +		err = -EINVAL;  		goto out_release_adapter_res;  	} diff --git a/drivers/net/ethernet/i825xx/82596.c b/drivers/net/ethernet/i825xx/82596.c index 7ce6379fd1a3..1500027ae18b 100644 --- a/drivers/net/ethernet/i825xx/82596.c +++ b/drivers/net/ethernet/i825xx/82596.c @@ -1155,7 +1155,7 @@ struct net_device * __init i82596_probe(int unit)  			err = -ENODEV;  			goto out;  		} -		memcpy(eth_addr, (void *) 0xfffc1f2c, ETH_ALEN);	/* YUCK! Get addr from NOVRAM */ +		memcpy(eth_addr, absolute_pointer(0xfffc1f2c), ETH_ALEN); /* YUCK! Get addr from NOVRAM */  		dev->base_addr = MVME_I596_BASE;  		dev->irq = (unsigned) MVME16x_IRQ_I596;  		goto found; diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c index 9035cb5fc70d..aa556e4f9051 100644 --- a/drivers/net/ethernet/intel/e100.c +++ b/drivers/net/ethernet/intel/e100.c @@ -2462,11 +2462,15 @@ static void e100_get_drvinfo(struct net_device *netdev,  		sizeof(info->bus_info));  } -#define E100_PHY_REGS 0x1C +#define E100_PHY_REGS 0x1D  static int e100_get_regs_len(struct net_device *netdev)  {  	struct nic *nic = netdev_priv(netdev); -	return 1 + E100_PHY_REGS + sizeof(nic->mem->dump_buf); + +	/* We know the number of registers, and the size of the dump buffer. +	 * Calculate the total size in bytes. +	 */ +	return (1 + E100_PHY_REGS) * sizeof(u32) + sizeof(nic->mem->dump_buf);  }  static void e100_get_regs(struct net_device *netdev, @@ -2480,14 +2484,18 @@ static void e100_get_regs(struct net_device *netdev,  	buff[0] = ioread8(&nic->csr->scb.cmd_hi) << 24 |  		ioread8(&nic->csr->scb.cmd_lo) << 16 |  		ioread16(&nic->csr->scb.status); -	for (i = E100_PHY_REGS; i >= 0; i--) -		buff[1 + E100_PHY_REGS - i] = -			mdio_read(netdev, nic->mii.phy_id, i); +	for (i = 0; i < E100_PHY_REGS; i++) +		/* Note that we read the registers in reverse order. This +		 * ordering is the ABI apparently used by ethtool and other +		 * applications. +		 */ +		buff[1 + i] = mdio_read(netdev, nic->mii.phy_id, +					E100_PHY_REGS - 1 - i);  	memset(nic->mem->dump_buf, 0, sizeof(nic->mem->dump_buf));  	e100_exec_cb(nic, NULL, e100_dump);  	msleep(10); -	memcpy(&buff[2 + E100_PHY_REGS], nic->mem->dump_buf, -		sizeof(nic->mem->dump_buf)); +	memcpy(&buff[1 + E100_PHY_REGS], nic->mem->dump_buf, +	       sizeof(nic->mem->dump_buf));  }  static void e100_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 112ce16717cd..b9014ec73b67 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c @@ -311,6 +311,9 @@ mlx4_en_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,  	int nhoff = skb_network_offset(skb);  	int ret = 0; +	if (skb->encapsulation) +		return -EPROTONOSUPPORT; +  	if (skb->protocol != htons(ETH_P_IP))  		return -EPROTONOSUPPORT; diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c index c677b69bbb0b..22c6eaaf3d9f 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_main.c +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c @@ -1918,6 +1918,7 @@ static void qede_sync_free_irqs(struct qede_dev *edev)  	}  	edev->int_info.used_cnt = 0; +	edev->int_info.msix_cnt = 0;  }  static int qede_req_msix_irqs(struct qede_dev *edev) @@ -2341,7 +2342,6 @@ static int qede_load(struct qede_dev *edev, enum qede_load_mode mode)  err4:  	qede_sync_free_irqs(edev); -	memset(&edev->int_info.msix_cnt, 0, sizeof(struct qed_int_info));  err3:  	qede_napi_disable_remove(edev);  err2: diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c index be41e4c77b65..eff587c6e9be 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c @@ -440,7 +440,6 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)  	QLCWR32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, 1);  	msleep(20); -	qlcnic_rom_unlock(adapter);  	/* big hammer don't reset CAM block on reset */  	QLCWR32(adapter, QLCNIC_ROMUSB_GLB_SW_RESET, 0xfeffffff); diff --git a/drivers/net/ethernet/rdc/r6040.c b/drivers/net/ethernet/rdc/r6040.c index 9a37247cf4b8..15a4a266824a 100644 --- a/drivers/net/ethernet/rdc/r6040.c +++ b/drivers/net/ethernet/rdc/r6040.c @@ -133,6 +133,8 @@  #define PHY_ST		0x8A	/* PHY status register */  #define MAC_SM		0xAC	/* MAC status machine */  #define  MAC_SM_RST	0x0002	/* MAC status machine reset */ +#define MD_CSC		0xb6	/* MDC speed control register */ +#define  MD_CSC_DEFAULT	0x0030  #define MAC_ID		0xBE	/* Identifier register */  #define TX_DCNT		0x80	/* TX descriptor count */ @@ -369,8 +371,9 @@ static void r6040_reset_mac(struct r6040_private *lp)  {  	void __iomem *ioaddr = lp->base;  	int limit = MAC_DEF_TIMEOUT; -	u16 cmd; +	u16 cmd, md_csc; +	md_csc = ioread16(ioaddr + MD_CSC);  	iowrite16(MAC_RST, ioaddr + MCR1);  	while (limit--) {  		cmd = ioread16(ioaddr + MCR1); @@ -382,6 +385,10 @@ static void r6040_reset_mac(struct r6040_private *lp)  	iowrite16(MAC_SM_RST, ioaddr + MAC_SM);  	iowrite16(0, ioaddr + MAC_SM);  	mdelay(5); + +	/* Restore MDIO clock frequency */ +	if (md_csc != MD_CSC_DEFAULT) +		iowrite16(md_csc, ioaddr + MD_CSC);  }  static void r6040_init_mac_regs(struct net_device *dev) diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index 1942264b621b..73fc8e9683b7 100644 --- a/drivers/net/ethernet/renesas/sh_eth.c +++ b/drivers/net/ethernet/renesas/sh_eth.c @@ -2426,6 +2426,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)  	else  		txdesc->status |= cpu_to_edmac(mdp, TD_TACT); +	wmb(); /* cur_tx must be incremented after TACT bit was set */  	mdp->cur_tx++;  	if (!(sh_eth_read(ndev, EDTRR) & sh_eth_get_edtrr_trns(mdp))) diff --git a/drivers/net/ethernet/xilinx/ll_temac_main.c b/drivers/net/ethernet/xilinx/ll_temac_main.c index 98a1c712b62a..74092c0eeafd 100644 --- a/drivers/net/ethernet/xilinx/ll_temac_main.c +++ b/drivers/net/ethernet/xilinx/ll_temac_main.c @@ -735,10 +735,8 @@ temac_start_xmit(struct sk_buff *skb, struct net_device *ndev)  	/* Kick off the transfer */  	lp->dma_out(lp, TX_TAILDESC_PTR, tail_p); /* DMA start */ -	if (temac_check_tx_bd_space(lp, MAX_SKB_FRAGS + 1)) { -		netdev_info(ndev, "%s -> netif_stop_queue\n", __func__); +	if (temac_check_tx_bd_space(lp, MAX_SKB_FRAGS + 1))  		netif_stop_queue(ndev); -	}  	return NETDEV_TX_OK;  } diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c index cce901add654..908de9e45394 100644 --- a/drivers/net/hamradio/6pack.c +++ b/drivers/net/hamradio/6pack.c @@ -68,9 +68,9 @@  #define SIXP_DAMA_OFF		0  /* default level 2 parameters */ -#define SIXP_TXDELAY			(HZ/4)	/* in 1 s */ +#define SIXP_TXDELAY			25	/* 250 ms */  #define SIXP_PERSIST			50	/* in 256ths */ -#define SIXP_SLOTTIME			(HZ/10)	/* in 1 s */ +#define SIXP_SLOTTIME			10	/* 100 ms */  #define SIXP_INIT_RESYNC_TIMEOUT	(3*HZ/2) /* in 1 s */  #define SIXP_RESYNC_TIMEOUT		5*HZ	/* in 1 s */ diff --git a/drivers/net/phy/dp83640_reg.h b/drivers/net/phy/dp83640_reg.h index e7fe41117003..f7ad94773d81 100644 --- a/drivers/net/phy/dp83640_reg.h +++ b/drivers/net/phy/dp83640_reg.h @@ -4,7 +4,7 @@  #ifndef HAVE_DP83640_REGISTERS  #define HAVE_DP83640_REGISTERS -#define PAGE0                     0x0000 +/* #define PAGE0                  0x0000 */  #define PHYCR2                    0x001c /* PHY Control Register 2 */  #define PAGE4                     0x0004 diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 5d988829f7d5..e6f272019da0 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c @@ -2729,14 +2729,14 @@ struct hso_device *hso_create_mux_serial_device(struct usb_interface *interface,  	serial = kzalloc(sizeof(*serial), GFP_KERNEL);  	if (!serial) -		goto exit; +		goto err_free_dev;  	hso_dev->port_data.dev_serial = serial;  	serial->parent = hso_dev;  	if (hso_serial_common_create  	    (serial, 1, CTRL_URB_RX_SIZE, CTRL_URB_TX_SIZE)) -		goto exit; +		goto err_free_serial;  	serial->tx_data_length--;  	serial->write_data = hso_mux_serial_write_data; @@ -2752,11 +2752,9 @@ struct hso_device *hso_create_mux_serial_device(struct usb_interface *interface,  	/* done, return it */  	return hso_dev; -exit: -	if (serial) { -		tty_unregister_device(tty_drv, serial->minor); -		kfree(serial); -	} +err_free_serial: +	kfree(serial); +err_free_dev:  	kfree(hso_dev);  	return NULL; diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h index da7a7c8dafb2..135600405dd0 100644 --- a/drivers/net/wireless/ath/ath.h +++ b/drivers/net/wireless/ath/ath.h @@ -199,12 +199,13 @@ struct sk_buff *ath_rxbuf_alloc(struct ath_common *common,  bool ath_is_mybeacon(struct ath_common *common, struct ieee80211_hdr *hdr);  void ath_hw_setbssidmask(struct ath_common *common); -void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key); +void ath_key_delete(struct ath_common *common, u8 hw_key_idx);  int ath_key_config(struct ath_common *common,  			  struct ieee80211_vif *vif,  			  struct ieee80211_sta *sta,  			  struct ieee80211_key_conf *key);  bool ath_hw_keyreset(struct ath_common *common, u16 entry); +bool ath_hw_keysetmac(struct ath_common *common, u16 entry, const u8 *mac);  void ath_hw_cycle_counters_update(struct ath_common *common);  int32_t ath_hw_get_listen_time(struct ath_common *common); diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c index 16e052d02c94..0f4836fc3b7c 100644 --- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c +++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c @@ -522,7 +522,7 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,  		}  		break;  	case DISABLE_KEY: -		ath_key_delete(common, key); +		ath_key_delete(common, key->hw_key_idx);  		break;  	default:  		ret = -EINVAL; diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c index da3b47b87ecc..a5a7e0901bab 100644 --- a/drivers/net/wireless/ath/ath6kl/wmi.c +++ b/drivers/net/wireless/ath/ath6kl/wmi.c @@ -2508,8 +2508,10 @@ static int ath6kl_wmi_sync_point(struct wmi *wmi, u8 if_idx)  		goto free_data_skb;  	for (index = 0; index < num_pri_streams; index++) { -		if (WARN_ON(!data_sync_bufs[index].skb)) +		if (WARN_ON(!data_sync_bufs[index].skb)) { +			ret = -ENOMEM;  			goto free_data_skb; +		}  		ep_id = ath6kl_ac2_endpoint_id(wmi->parent_dev,  					       data_sync_bufs[index]. diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c index c876dc2437b0..96e1f54cccaf 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c @@ -3345,7 +3345,8 @@ found:  			"Found block at %x: code=%d ref=%d length=%d major=%d minor=%d\n",  			cptr, code, reference, length, major, minor);  		if ((!AR_SREV_9485(ah) && length >= 1024) || -		    (AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485)) { +		    (AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485) || +		    (length > cptr)) {  			ath_dbg(common, EEPROM, "Skipping bad header\n");  			cptr -= COMP_HDR_LEN;  			continue; diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index 83103d25bc91..e32e35b59829 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c @@ -1463,7 +1463,7 @@ static int ath9k_htc_set_key(struct ieee80211_hw *hw,  		}  		break;  	case DISABLE_KEY: -		ath_key_delete(common, key); +		ath_key_delete(common, key->hw_key_idx);  		break;  	default:  		ret = -EINVAL; diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 831a54415a25..52afc1506cf5 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h @@ -814,6 +814,7 @@ struct ath_hw {  	struct ath9k_pacal_info pacal_info;  	struct ar5416Stats stats;  	struct ath9k_tx_queue_info txq[ATH9K_NUM_TX_QUEUES]; +	DECLARE_BITMAP(pending_del_keymap, ATH_KEYMAX);  	enum ath9k_int imask;  	u32 imrs2_reg; diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index fe4f9ec661fa..11ed11d07f6c 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c @@ -819,12 +819,80 @@ exit:  	ieee80211_free_txskb(hw, skb);  } +static bool ath9k_txq_list_has_key(struct list_head *txq_list, u32 keyix) +{ +	struct ath_buf *bf; +	struct ieee80211_tx_info *txinfo; +	struct ath_frame_info *fi; + +	list_for_each_entry(bf, txq_list, list) { +		if (bf->bf_state.stale || !bf->bf_mpdu) +			continue; + +		txinfo = IEEE80211_SKB_CB(bf->bf_mpdu); +		fi = (struct ath_frame_info *)&txinfo->rate_driver_data[0]; +		if (fi->keyix == keyix) +			return true; +	} + +	return false; +} + +static bool ath9k_txq_has_key(struct ath_softc *sc, u32 keyix) +{ +	struct ath_hw *ah = sc->sc_ah; +	int i; +	struct ath_txq *txq; +	bool key_in_use = false; + +	for (i = 0; !key_in_use && i < ATH9K_NUM_TX_QUEUES; i++) { +		if (!ATH_TXQ_SETUP(sc, i)) +			continue; +		txq = &sc->tx.txq[i]; +		if (!txq->axq_depth) +			continue; +		if (!ath9k_hw_numtxpending(ah, txq->axq_qnum)) +			continue; + +		ath_txq_lock(sc, txq); +		key_in_use = ath9k_txq_list_has_key(&txq->axq_q, keyix); +		if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { +			int idx = txq->txq_tailidx; + +			while (!key_in_use && +			       !list_empty(&txq->txq_fifo[idx])) { +				key_in_use = ath9k_txq_list_has_key( +					&txq->txq_fifo[idx], keyix); +				INCR(idx, ATH_TXFIFO_DEPTH); +			} +		} +		ath_txq_unlock(sc, txq); +	} + +	return key_in_use; +} + +static void ath9k_pending_key_del(struct ath_softc *sc, u8 keyix) +{ +	struct ath_hw *ah = sc->sc_ah; +	struct ath_common *common = ath9k_hw_common(ah); + +	if (!test_bit(keyix, ah->pending_del_keymap) || +	    ath9k_txq_has_key(sc, keyix)) +		return; + +	/* No more TXQ frames point to this key cache entry, so delete it. */ +	clear_bit(keyix, ah->pending_del_keymap); +	ath_key_delete(common, keyix); +} +  static void ath9k_stop(struct ieee80211_hw *hw)  {  	struct ath_softc *sc = hw->priv;  	struct ath_hw *ah = sc->sc_ah;  	struct ath_common *common = ath9k_hw_common(ah);  	bool prev_idle; +	int i;  	ath9k_deinit_channel_context(sc); @@ -890,6 +958,14 @@ static void ath9k_stop(struct ieee80211_hw *hw)  	spin_unlock_bh(&sc->sc_pcu_lock); +	for (i = 0; i < ATH_KEYMAX; i++) +		ath9k_pending_key_del(sc, i); + +	/* Clear key cache entries explicitly to get rid of any potentially +	 * remaining keys. +	 */ +	ath9k_cmn_init_crypto(sc->sc_ah); +  	ath9k_ps_restore(sc);  	sc->ps_idle = prev_idle; @@ -1521,12 +1597,11 @@ static void ath9k_del_ps_key(struct ath_softc *sc,  {  	struct ath_common *common = ath9k_hw_common(sc->sc_ah);  	struct ath_node *an = (struct ath_node *) sta->drv_priv; -	struct ieee80211_key_conf ps_key = { .hw_key_idx = an->ps_key };  	if (!an->ps_key)  	    return; -	ath_key_delete(common, &ps_key); +	ath_key_delete(common, an->ps_key);  	an->ps_key = 0;  	an->key_idx[0] = 0;  } @@ -1688,6 +1763,12 @@ static int ath9k_set_key(struct ieee80211_hw *hw,  	if (sta)  		an = (struct ath_node *)sta->drv_priv; +	/* Delete pending key cache entries if no more frames are pointing to +	 * them in TXQs. +	 */ +	for (i = 0; i < ATH_KEYMAX; i++) +		ath9k_pending_key_del(sc, i); +  	switch (cmd) {  	case SET_KEY:  		if (sta) @@ -1717,7 +1798,15 @@ static int ath9k_set_key(struct ieee80211_hw *hw,  		}  		break;  	case DISABLE_KEY: -		ath_key_delete(common, key); +		if (ath9k_txq_has_key(sc, key->hw_key_idx)) { +			/* Delay key cache entry deletion until there are no +			 * remaining TXQ frames pointing to this entry. +			 */ +			set_bit(key->hw_key_idx, sc->sc_ah->pending_del_keymap); +			ath_hw_keysetmac(common, key->hw_key_idx, NULL); +		} else { +			ath_key_delete(common, key->hw_key_idx); +		}  		if (an) {  			for (i = 0; i < ARRAY_SIZE(an->key_idx); i++) {  				if (an->key_idx[i] != key->hw_key_idx) diff --git a/drivers/net/wireless/ath/key.c b/drivers/net/wireless/ath/key.c index 1816b4e7dc26..61b59a804e30 100644 --- a/drivers/net/wireless/ath/key.c +++ b/drivers/net/wireless/ath/key.c @@ -84,8 +84,7 @@ bool ath_hw_keyreset(struct ath_common *common, u16 entry)  }  EXPORT_SYMBOL(ath_hw_keyreset); -static bool ath_hw_keysetmac(struct ath_common *common, -			     u16 entry, const u8 *mac) +bool ath_hw_keysetmac(struct ath_common *common, u16 entry, const u8 *mac)  {  	u32 macHi, macLo;  	u32 unicast_flag = AR_KEYTABLE_VALID; @@ -125,6 +124,7 @@ static bool ath_hw_keysetmac(struct ath_common *common,  	return true;  } +EXPORT_SYMBOL(ath_hw_keysetmac);  static bool ath_hw_set_keycache_entry(struct ath_common *common, u16 entry,  				      const struct ath_keyval *k, @@ -581,29 +581,38 @@ EXPORT_SYMBOL(ath_key_config);  /*   * Delete Key.   */ -void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key) +void ath_key_delete(struct ath_common *common, u8 hw_key_idx)  { -	ath_hw_keyreset(common, key->hw_key_idx); -	if (key->hw_key_idx < IEEE80211_WEP_NKID) +	/* Leave CCMP and TKIP (main key) configured to avoid disabling +	 * encryption for potentially pending frames already in a TXQ with the +	 * keyix pointing to this key entry. Instead, only clear the MAC address +	 * to prevent RX processing from using this key cache entry. +	 */ +	if (test_bit(hw_key_idx, common->ccmp_keymap) || +	    test_bit(hw_key_idx, common->tkip_keymap)) +		ath_hw_keysetmac(common, hw_key_idx, NULL); +	else +		ath_hw_keyreset(common, hw_key_idx); +	if (hw_key_idx < IEEE80211_WEP_NKID)  		return; -	clear_bit(key->hw_key_idx, common->keymap); -	clear_bit(key->hw_key_idx, common->ccmp_keymap); -	if (key->cipher != WLAN_CIPHER_SUITE_TKIP) +	clear_bit(hw_key_idx, common->keymap); +	clear_bit(hw_key_idx, common->ccmp_keymap); +	if (!test_bit(hw_key_idx, common->tkip_keymap))  		return; -	clear_bit(key->hw_key_idx + 64, common->keymap); +	clear_bit(hw_key_idx + 64, common->keymap); -	clear_bit(key->hw_key_idx, common->tkip_keymap); -	clear_bit(key->hw_key_idx + 64, common->tkip_keymap); +	clear_bit(hw_key_idx, common->tkip_keymap); +	clear_bit(hw_key_idx + 64, common->tkip_keymap);  	if (!(common->crypt_caps & ATH_CRYPT_CAP_MIC_COMBINED)) { -		ath_hw_keyreset(common, key->hw_key_idx + 32); -		clear_bit(key->hw_key_idx + 32, common->keymap); -		clear_bit(key->hw_key_idx + 64 + 32, common->keymap); +		ath_hw_keyreset(common, hw_key_idx + 32); +		clear_bit(hw_key_idx + 32, common->keymap); +		clear_bit(hw_key_idx + 64 + 32, common->keymap); -		clear_bit(key->hw_key_idx + 32, common->tkip_keymap); -		clear_bit(key->hw_key_idx + 64 + 32, common->tkip_keymap); +		clear_bit(hw_key_idx + 32, common->tkip_keymap); +		clear_bit(hw_key_idx + 64 + 32, common->tkip_keymap);  	}  }  EXPORT_SYMBOL(ath_key_delete); diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index c8c6afc0ab51..15c73ebe5efc 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -994,7 +994,7 @@ check_frags:  				 * the header's copy failed, and they are  				 * sharing a slot, send an error  				 */ -				if (i == 0 && sharedslot) +				if (i == 0 && !first_shinfo && sharedslot)  					xenvif_idx_release(queue, pending_idx,  							   XEN_NETIF_RSP_ERROR);  				else diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index 8524faf28acb..88e760c88aba 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c @@ -160,15 +160,6 @@ struct dino_device  	(struct dino_device *)__pdata; }) -/* Check if PCI device is behind a Card-mode Dino. */ -static int pci_dev_is_behind_card_dino(struct pci_dev *dev) -{ -	struct dino_device *dino_dev; - -	dino_dev = DINO_DEV(parisc_walk_tree(dev->bus->bridge)); -	return is_card_dino(&dino_dev->hba.dev->id); -} -  /*   * Dino Configuration Space Accessor Functions   */ @@ -452,6 +443,15 @@ static void quirk_cirrus_cardbus(struct pci_dev *dev)  DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_6832, quirk_cirrus_cardbus );  #ifdef CONFIG_TULIP +/* Check if PCI device is behind a Card-mode Dino. */ +static int pci_dev_is_behind_card_dino(struct pci_dev *dev) +{ +	struct dino_device *dino_dev; + +	dino_dev = DINO_DEV(parisc_walk_tree(dev->bus->bridge)); +	return is_card_dino(&dino_dev->hba.dev->id); +} +  static void pci_fixup_tulip(struct pci_dev *dev)  {  	if (!pci_dev_is_behind_card_dino(dev)) diff --git a/drivers/parport/ieee1284_ops.c b/drivers/parport/ieee1284_ops.c index 2e21af43d91e..b6d808037045 100644 --- a/drivers/parport/ieee1284_ops.c +++ b/drivers/parport/ieee1284_ops.c @@ -534,7 +534,7 @@ size_t parport_ieee1284_ecp_read_data (struct parport *port,  				goto out;  			/* Yield the port for a while. */ -			if (count && dev->port->irq != PARPORT_IRQ_NONE) { +			if (dev->port->irq != PARPORT_IRQ_NONE) {  				parport_release (dev);  				schedule_timeout_interruptible(msecs_to_jiffies(40));  				parport_claim_or_block (dev); diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index e9c98f1576dd..a635af3b9076 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -748,6 +748,9 @@ static void msix_mask_all(void __iomem *base, int tsize)  	u32 ctrl = PCI_MSIX_ENTRY_CTRL_MASKBIT;  	int i; +	if (pci_msi_ignore_mask) +		return; +  	for (i = 0; i < tsize; i++, base += PCI_MSIX_ENTRY_SIZE)  		writel(ctrl, base + PCI_MSIX_ENTRY_VECTOR_CTRL);  } diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 8a12b5392b8f..f4021636de0a 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -1334,11 +1334,7 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)  	 * so that things like MSI message writing will behave as expected  	 * (e.g. if the device really is in D0 at enable time).  	 */ -	if (dev->pm_cap) { -		u16 pmcsr; -		pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); -		dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK); -	} +	pci_update_current_state(dev, dev->current_state);  	if (atomic_inc_return(&dev->enable_cnt) > 1)  		return 0;		/* already enabled */ @@ -1876,7 +1872,14 @@ int __pci_enable_wake(struct pci_dev *dev, pci_power_t state,  	if (enable) {  		int error; -		if (pci_pme_capable(dev, state)) +		/* +		 * Enable PME signaling if the device can signal PME from +		 * D3cold regardless of whether or not it can signal PME from +		 * the current target state, because that will allow it to +		 * signal PME when the hierarchy above it goes into D3cold and +		 * the device itself ends up in D3cold as a result of that. +		 */ +		if (pci_pme_capable(dev, state) || pci_pme_capable(dev, PCI_D3cold))  			pci_pme_active(dev, true);  		else  			ret = 1; diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index e65eec0644a7..f8f0849b9cdc 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -2915,12 +2915,13 @@ static void fixup_mpss_256(struct pci_dev *dev)  {  	dev->pcie_mpss = 1; /* 256 bytes */  } -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, -			 PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0, fixup_mpss_256); -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, -			 PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256); -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SOLARFLARE, -			 PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256); +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE, +			PCI_DEVICE_ID_SOLARFLARE_SFC4000A_0, fixup_mpss_256); +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE, +			PCI_DEVICE_ID_SOLARFLARE_SFC4000A_1, fixup_mpss_256); +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLARFLARE, +			PCI_DEVICE_ID_SOLARFLARE_SFC4000B, fixup_mpss_256); +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ASMEDIA, 0x0612, fixup_mpss_256);  /* Intel 5000 and 5100 Memory controllers have an errata with read completion   * coalescing (which is enabled by default on some BIOSes) and MPS of 256B. diff --git a/drivers/pci/syscall.c b/drivers/pci/syscall.c index 7958250856d3..f602176eb8b0 100644 --- a/drivers/pci/syscall.c +++ b/drivers/pci/syscall.c @@ -23,8 +23,10 @@ SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned long, dfn,  	long err;  	int cfg_ret; +	err = -EPERM; +	dev = NULL;  	if (!capable(CAP_SYS_ADMIN)) -		return -EPERM; +		goto error;  	err = -ENODEV;  	dev = pci_get_bus_and_slot(bus, dfn); diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index 17714793c08e..9c6afaebc9cf 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c @@ -1328,6 +1328,7 @@ static int pcs_parse_bits_in_pinctrl_entry(struct pcs_device *pcs,  	if (PCS_HAS_PINCONF) {  		dev_err(pcs->dev, "pinconf not supported\n"); +		res = -ENOTSUPP;  		goto free_pingroups;  	} diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c index d20190c8f0c0..db2cd5994c2d 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -182,6 +182,15 @@ static int cros_ec_host_command_proto_query(struct cros_ec_device *ec_dev,  	msg->insize = sizeof(struct ec_response_get_protocol_info);  	ret = send_command(ec_dev, msg); +	/* +	 * Send command once again when timeout occurred. +	 * Fingerprint MCU (FPMCU) is restarted during system boot which +	 * introduces small window in which FPMCU won't respond for any +	 * messages sent by kernel. There is no need to wait before next +	 * attempt because we waited at least EC_MSG_DEADLINE_MS. +	 */ +	if (ret == -ETIMEDOUT) +		ret = send_command(ec_dev, msg);  	if (ret < 0) {  		dev_dbg(ec_dev->dev, diff --git a/drivers/power/max17042_battery.c b/drivers/power/max17042_battery.c index da7a75f82489..f18d845b3b92 100644 --- a/drivers/power/max17042_battery.c +++ b/drivers/power/max17042_battery.c @@ -644,7 +644,7 @@ static inline void max17042_override_por_values(struct max17042_chip *chip)  	struct max17042_config_data *config = chip->pdata->config_data;  	max17042_override_por(map, MAX17042_TGAIN, config->tgain); -	max17042_override_por(map, MAx17042_TOFF, config->toff); +	max17042_override_por(map, MAX17042_TOFF, config->toff);  	max17042_override_por(map, MAX17042_CGAIN, config->cgain);  	max17042_override_por(map, MAX17042_COFF, config->coff); @@ -760,8 +760,12 @@ static irqreturn_t max17042_thread_handler(int id, void *dev)  {  	struct max17042_chip *chip = dev;  	u32 val; +	int ret; + +	ret = regmap_read(chip->regmap, MAX17042_STATUS, &val); +	if (ret) +		return IRQ_HANDLED; -	regmap_read(chip->regmap, MAX17042_STATUS, &val);  	if ((val & STATUS_INTR_SOCMIN_BIT) ||  		(val & STATUS_INTR_SOCMAX_BIT)) {  		dev_info(&chip->client->dev, "SOC threshold INTR\n"); diff --git a/drivers/rtc/rtc-tps65910.c b/drivers/rtc/rtc-tps65910.c index f42aa2b2dcba..f78360d99fb9 100644 --- a/drivers/rtc/rtc-tps65910.c +++ b/drivers/rtc/rtc-tps65910.c @@ -332,6 +332,6 @@ static struct platform_driver tps65910_rtc_driver = {  };  module_platform_driver(tps65910_rtc_driver); -MODULE_ALIAS("platform:rtc-tps65910"); +MODULE_ALIAS("platform:tps65910-rtc");  MODULE_AUTHOR("Venu Byravarasu <vbyravarasu@nvidia.com>");  MODULE_LICENSE("GPL"); diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 39d03300d3d9..9906a3b562e9 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -429,9 +429,7 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,  	struct iscsi_transport *t = iface->transport;  	int param = -1; -	if (attr == &dev_attr_iface_enabled.attr) -		param = ISCSI_NET_PARAM_IFACE_ENABLE; -	else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr) +	if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr)  		param = ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO;  	else if (attr == &dev_attr_iface_header_digest.attr)  		param = ISCSI_IFACE_PARAM_HDRDGST_EN; @@ -471,7 +469,9 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,  	if (param != -1)  		return t->attr_is_visible(ISCSI_IFACE_PARAM, param); -	if (attr == &dev_attr_iface_vlan_id.attr) +	if (attr == &dev_attr_iface_enabled.attr) +		param = ISCSI_NET_PARAM_IFACE_ENABLE; +	else if (attr == &dev_attr_iface_vlan_id.attr)  		param = ISCSI_NET_PARAM_VLAN_ID;  	else if (attr == &dev_attr_iface_vlan_priority.attr)  		param = ISCSI_NET_PARAM_VLAN_PRIORITY; diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 71aa6a646a28..631570d4845d 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -3147,15 +3147,16 @@ static int sd_probe(struct device *dev)  	}  	device_initialize(&sdkp->dev); -	sdkp->dev.parent = dev; +	sdkp->dev.parent = get_device(dev);  	sdkp->dev.class = &sd_disk_class;  	dev_set_name(&sdkp->dev, "%s", dev_name(dev));  	error = device_add(&sdkp->dev); -	if (error) -		goto out_free_index; +	if (error) { +		put_device(&sdkp->dev); +		goto out; +	} -	get_device(dev);  	dev_set_drvdata(dev, sdkp);  	get_device(&sdkp->dev);	/* prevent release before async_schedule */ diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c index 9f14560686b6..88bfe7682a9e 100644 --- a/drivers/spi/spi-tegra20-slink.c +++ b/drivers/spi/spi-tegra20-slink.c @@ -1210,7 +1210,7 @@ static int tegra_slink_resume(struct device *dev)  }  #endif -static int tegra_slink_runtime_suspend(struct device *dev) +static int __maybe_unused tegra_slink_runtime_suspend(struct device *dev)  {  	struct spi_master *master = dev_get_drvdata(dev);  	struct tegra_slink_data *tspi = spi_master_get_devdata(master); @@ -1222,7 +1222,7 @@ static int tegra_slink_runtime_suspend(struct device *dev)  	return 0;  } -static int tegra_slink_runtime_resume(struct device *dev) +static int __maybe_unused tegra_slink_runtime_resume(struct device *dev)  {  	struct spi_master *master = dev_get_drvdata(dev);  	struct tegra_slink_data *tspi = spi_master_get_devdata(master); diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c index 16d45a25284f..a4c0542f6141 100644 --- a/drivers/thermal/samsung/exynos_tmu.c +++ b/drivers/thermal/samsung/exynos_tmu.c @@ -1347,6 +1347,7 @@ static int exynos_tmu_probe(struct platform_device *pdev)  		data->sclk = devm_clk_get(&pdev->dev, "tmu_sclk");  		if (IS_ERR(data->sclk)) {  			dev_err(&pdev->dev, "Failed to get sclk\n"); +			ret = PTR_ERR(data->sclk);  			goto err_clk;  		} else {  			ret = clk_prepare_enable(data->sclk); diff --git a/drivers/tty/hvc/hvsi.c b/drivers/tty/hvc/hvsi.c index a75146f600cb..3e29f5f0d4ca 100644 --- a/drivers/tty/hvc/hvsi.c +++ b/drivers/tty/hvc/hvsi.c @@ -1051,7 +1051,7 @@ static const struct tty_operations hvsi_ops = {  static int __init hvsi_init(void)  { -	int i; +	int i, ret;  	hvsi_driver = alloc_tty_driver(hvsi_count);  	if (!hvsi_driver) @@ -1082,12 +1082,25 @@ static int __init hvsi_init(void)  	}  	hvsi_wait = wait_for_state; /* irqs active now */ -	if (tty_register_driver(hvsi_driver)) -		panic("Couldn't register hvsi console driver\n"); +	ret = tty_register_driver(hvsi_driver); +	if (ret) { +		pr_err("Couldn't register hvsi console driver\n"); +		goto err_free_irq; +	}  	printk(KERN_DEBUG "HVSI: registered %i devices\n", hvsi_count);  	return 0; +err_free_irq: +	hvsi_wait = poll_for_state; +	for (i = 0; i < hvsi_count; i++) { +		struct hvsi_struct *hp = &hvsi_ports[i]; + +		free_irq(hp->virq, hp); +	} +	tty_driver_kref_put(hvsi_driver); + +	return ret;  }  device_initcall(hvsi_init); diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c index 72f6cde146b5..db66e533319e 100644 --- a/drivers/tty/serial/8250/8250_pci.c +++ b/drivers/tty/serial/8250/8250_pci.c @@ -78,7 +78,7 @@ static void moan_device(const char *str, struct pci_dev *dev)  static int  setup_port(struct serial_private *priv, struct uart_8250_port *port, -	   int bar, int offset, int regshift) +	   u8 bar, unsigned int offset, int regshift)  {  	struct pci_dev *dev = priv->dev; diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 041bfe1d4191..d0d90752f9f3 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -124,7 +124,8 @@ static const struct serial8250_config uart_config[] = {  		.name		= "16C950/954",  		.fifo_size	= 128,  		.tx_loadsz	= 128, -		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, +		.fcr		= UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01, +		.rxtrig_bytes	= {16, 32, 112, 120},  		/* UART_CAP_EFR breaks billionon CF bluetooth card. */  		.flags		= UART_CAP_FIFO | UART_CAP_SLEEP,  	}, diff --git a/drivers/tty/serial/jsm/jsm_neo.c b/drivers/tty/serial/jsm/jsm_neo.c index 932b2accd06f..4ed0c099c757 100644 --- a/drivers/tty/serial/jsm/jsm_neo.c +++ b/drivers/tty/serial/jsm/jsm_neo.c @@ -827,7 +827,9 @@ static inline void neo_parse_isr(struct jsm_board *brd, u32 port)  		/* Parse any modem signal changes */  		jsm_dbg(INTR, &ch->ch_bd->pci_dev,  			"MOD_STAT: sending to parse_modem_sigs\n"); +		spin_lock_irqsave(&ch->uart_port.lock, lock_flags);  		neo_parse_modem(ch, readb(&ch->ch_neo_uart->msr)); +		spin_unlock_irqrestore(&ch->uart_port.lock, lock_flags);  	}  } diff --git a/drivers/tty/serial/jsm/jsm_tty.c b/drivers/tty/serial/jsm/jsm_tty.c index 524e86ab3cae..dad3abab8280 100644 --- a/drivers/tty/serial/jsm/jsm_tty.c +++ b/drivers/tty/serial/jsm/jsm_tty.c @@ -195,6 +195,7 @@ static void jsm_tty_break(struct uart_port *port, int break_state)  static int jsm_tty_open(struct uart_port *port)  { +	unsigned long lock_flags;  	struct jsm_board *brd;  	struct jsm_channel *channel =  		container_of(port, struct jsm_channel, uart_port); @@ -248,6 +249,7 @@ static int jsm_tty_open(struct uart_port *port)  	channel->ch_cached_lsr = 0;  	channel->ch_stops_sent = 0; +	spin_lock_irqsave(&port->lock, lock_flags);  	termios = &port->state->port.tty->termios;  	channel->ch_c_cflag	= termios->c_cflag;  	channel->ch_c_iflag	= termios->c_iflag; @@ -267,6 +269,7 @@ static int jsm_tty_open(struct uart_port *port)  	jsm_carrier(channel);  	channel->ch_open_count++; +	spin_unlock_irqrestore(&port->lock, lock_flags);  	jsm_dbg(OPEN, &channel->ch_bd->pci_dev, "finish\n");  	return 0; diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c index bdb25b23e8d3..c896b4e98aaa 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -2287,8 +2287,6 @@ static int tty_fasync(int fd, struct file *filp, int on)   *	Locking:   *		Called functions take tty_ldiscs_lock   *		current->signal->tty check is safe without locks - * - *	FIXME: may race normal receive processing   */  static int tiocsti(struct tty_struct *tty, char __user *p) @@ -2302,8 +2300,10 @@ static int tiocsti(struct tty_struct *tty, char __user *p)  		return -EFAULT;  	tty_audit_tiocsti(tty, ch);  	ld = tty_ldisc_ref_wait(tty); +	tty_buffer_lock_exclusive(tty->port);  	if (ld->ops->receive_buf)  		ld->ops->receive_buf(tty, &ch, &mbz, 1); +	tty_buffer_unlock_exclusive(tty->port);  	tty_ldisc_deref(ld);  	return 0;  } diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 9f479b4c6491..0fab196a1d90 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c @@ -882,8 +882,25 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,  	new_row_size = new_cols << 1;  	new_screen_size = new_row_size * new_rows; -	if (new_cols == vc->vc_cols && new_rows == vc->vc_rows) -		return 0; +	if (new_cols == vc->vc_cols && new_rows == vc->vc_rows) { +		/* +		 * This function is being called here to cover the case +		 * where the userspace calls the FBIOPUT_VSCREENINFO twice, +		 * passing the same fb_var_screeninfo containing the fields +		 * yres/xres equal to a number non-multiple of vc_font.height +		 * and yres_virtual/xres_virtual equal to number lesser than the +		 * vc_font.height and yres/xres. +		 * In the second call, the struct fb_var_screeninfo isn't +		 * being modified by the underlying driver because of the +		 * if above, and this causes the fbcon_display->vrows to become +		 * negative and it eventually leads to out-of-bound +		 * access by the imageblit function. +		 * To give the correct values to the struct and to not have +		 * to deal with possible errors from the code below, we call +		 * the resize_screen here as well. +		 */ +		return resize_screen(vc, new_cols, new_rows, user); +	}  	if (new_screen_size > (4 << 20))  		return -EINVAL; diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c index 34a337888788..f9ab75c4a311 100644 --- a/drivers/usb/gadget/function/u_ether.c +++ b/drivers/usb/gadget/function/u_ether.c @@ -621,8 +621,9 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb,  	}  	spin_unlock_irqrestore(&dev->lock, flags); -	if (skb && !in) { -		dev_kfree_skb_any(skb); +	if (!in) { +		if (skb) +			dev_kfree_skb_any(skb);  		return NETDEV_TX_OK;  	} diff --git a/drivers/usb/gadget/udc/at91_udc.c b/drivers/usb/gadget/udc/at91_udc.c index d0d18947f58b..2da281a743b8 100644 --- a/drivers/usb/gadget/udc/at91_udc.c +++ b/drivers/usb/gadget/udc/at91_udc.c @@ -1898,7 +1898,9 @@ static int at91udc_probe(struct platform_device *pdev)  	clk_disable(udc->iclk);  	/* request UDC and maybe VBUS irqs */ -	udc->udp_irq = platform_get_irq(pdev, 0); +	udc->udp_irq = retval = platform_get_irq(pdev, 0); +	if (retval < 0) +		goto err_unprepare_iclk;  	retval = devm_request_irq(dev, udc->udp_irq, at91_udc_irq, 0,  				  driver_name, udc);  	if (retval) { diff --git a/drivers/usb/gadget/udc/mv_u3d_core.c b/drivers/usb/gadget/udc/mv_u3d_core.c index dafe74eb9ade..9ee4a2605dea 100644 --- a/drivers/usb/gadget/udc/mv_u3d_core.c +++ b/drivers/usb/gadget/udc/mv_u3d_core.c @@ -1929,14 +1929,6 @@ static int mv_u3d_probe(struct platform_device *dev)  		goto err_get_irq;  	}  	u3d->irq = r->start; -	if (request_irq(u3d->irq, mv_u3d_irq, -		IRQF_SHARED, driver_name, u3d)) { -		u3d->irq = 0; -		dev_err(&dev->dev, "Request irq %d for u3d failed\n", -			u3d->irq); -		retval = -ENODEV; -		goto err_request_irq; -	}  	/* initialize gadget structure */  	u3d->gadget.ops = &mv_u3d_ops;	/* usb_gadget_ops */ @@ -1949,6 +1941,15 @@ static int mv_u3d_probe(struct platform_device *dev)  	mv_u3d_eps_init(u3d); +	if (request_irq(u3d->irq, mv_u3d_irq, +		IRQF_SHARED, driver_name, u3d)) { +		u3d->irq = 0; +		dev_err(&dev->dev, "Request irq %d for u3d failed\n", +			u3d->irq); +		retval = -ENODEV; +		goto err_request_irq; +	} +  	/* external vbus detection */  	if (u3d->vbus) {  		u3d->clock_gating = 1; @@ -1972,8 +1973,8 @@ static int mv_u3d_probe(struct platform_device *dev)  err_unregister:  	free_irq(u3d->irq, u3d); -err_request_irq:  err_get_irq: +err_request_irq:  	kfree(u3d->status_req);  err_alloc_status_req:  	kfree(u3d->eps); diff --git a/drivers/usb/gadget/udc/r8a66597-udc.c b/drivers/usb/gadget/udc/r8a66597-udc.c index 4eb8e181763d..ffe6cb4c78ff 100644 --- a/drivers/usb/gadget/udc/r8a66597-udc.c +++ b/drivers/usb/gadget/udc/r8a66597-udc.c @@ -1253,7 +1253,7 @@ static void set_feature(struct r8a66597 *r8a66597, struct usb_ctrlrequest *ctrl)  			do {  				tmp = r8a66597_read(r8a66597, INTSTS0) & CTSQ;  				udelay(1); -			} while (tmp != CS_IDST || timeout-- > 0); +			} while (tmp != CS_IDST && timeout-- > 0);  			if (tmp == CS_IDST)  				r8a66597_bset(r8a66597, diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index ee8d5faa0194..3eecf47d4e89 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c @@ -218,8 +218,11 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)  	 * the clock does not exists.  	 */  	priv->clk = devm_clk_get(&pdev->dev, NULL); -	if (!IS_ERR(priv->clk)) -		clk_prepare_enable(priv->clk); +	if (!IS_ERR(priv->clk)) { +		err = clk_prepare_enable(priv->clk); +		if (err) +			goto err_put_hcd; +	}  	priv->phy = devm_phy_optional_get(&pdev->dev, "usb");  	if (IS_ERR(priv->phy)) { @@ -280,6 +283,7 @@ err_phy_init:  err_phy_get:  	if (!IS_ERR(priv->clk))  		clk_disable_unprepare(priv->clk); +err_put_hcd:  	usb_put_hcd(hcd);  err:  	dev_err(&pdev->dev, "init %s fail, %d\n", diff --git a/drivers/usb/host/fotg210-hcd.c b/drivers/usb/host/fotg210-hcd.c index 5dacc3076efd..e081392ec830 100644 --- a/drivers/usb/host/fotg210-hcd.c +++ b/drivers/usb/host/fotg210-hcd.c @@ -4495,13 +4495,12 @@ static bool itd_complete(struct fotg210_hcd *fotg210, struct fotg210_itd *itd)  			/* HC need not update length with this error */  			if (!(t & FOTG210_ISOC_BABBLE)) { -				desc->actual_length = -					fotg210_itdlen(urb, desc, t); +				desc->actual_length = FOTG210_ITD_LENGTH(t);  				urb->actual_length += desc->actual_length;  			}  		} else if (likely((t & FOTG210_ISOC_ACTIVE) == 0)) {  			desc->status = 0; -			desc->actual_length = fotg210_itdlen(urb, desc, t); +			desc->actual_length = FOTG210_ITD_LENGTH(t);  			urb->actual_length += desc->actual_length;  		} else {  			/* URB was too late */ diff --git a/drivers/usb/host/fotg210.h b/drivers/usb/host/fotg210.h index b5cfa7aeb277..1a3f94123c88 100644 --- a/drivers/usb/host/fotg210.h +++ b/drivers/usb/host/fotg210.h @@ -682,11 +682,6 @@ static inline unsigned fotg210_read_frame_index(struct fotg210_hcd *fotg210)  	return fotg210_readl(fotg210, &fotg210->regs->frame_index);  } -#define fotg210_itdlen(urb, desc, t) ({			\ -	usb_pipein((urb)->pipe) ?				\ -	(desc)->length - FOTG210_ITD_LENGTH(t) :			\ -	FOTG210_ITD_LENGTH(t);					\ -})  /*-------------------------------------------------------------------------*/  #endif /* __LINUX_FOTG210_H */ diff --git a/drivers/usb/host/ohci-tmio.c b/drivers/usb/host/ohci-tmio.c index cfcfadfc94fc..9c9e97294c18 100644 --- a/drivers/usb/host/ohci-tmio.c +++ b/drivers/usb/host/ohci-tmio.c @@ -202,6 +202,9 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev)  	if (!cell)  		return -EINVAL; +	if (irq < 0) +		return irq; +  	hcd = usb_create_hcd(&ohci_tmio_hc_driver, &dev->dev, dev_name(&dev->dev));  	if (!hcd) {  		ret = -ENOMEM; diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 85eb0fe2183c..80e3e2d6af9e 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -4484,19 +4484,19 @@ static u16 xhci_calculate_u1_timeout(struct xhci_hcd *xhci,  {  	unsigned long long timeout_ns; -	if (xhci->quirks & XHCI_INTEL_HOST) -		timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc); -	else -		timeout_ns = udev->u1_params.sel; -  	/* Prevent U1 if service interval is shorter than U1 exit latency */  	if (usb_endpoint_xfer_int(desc) || usb_endpoint_xfer_isoc(desc)) { -		if (xhci_service_interval_to_ns(desc) <= timeout_ns) { +		if (xhci_service_interval_to_ns(desc) <= udev->u1_params.mel) {  			dev_dbg(&udev->dev, "Disable U1, ESIT shorter than exit latency\n");  			return USB3_LPM_DISABLED;  		}  	} +	if (xhci->quirks & XHCI_INTEL_HOST) +		timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc); +	else +		timeout_ns = udev->u1_params.sel; +  	/* The U1 timeout is encoded in 1us intervals.  	 * Don't return a timeout of zero, because that's USB3_LPM_DISABLED.  	 */ @@ -4548,19 +4548,19 @@ static u16 xhci_calculate_u2_timeout(struct xhci_hcd *xhci,  {  	unsigned long long timeout_ns; -	if (xhci->quirks & XHCI_INTEL_HOST) -		timeout_ns = xhci_calculate_intel_u2_timeout(udev, desc); -	else -		timeout_ns = udev->u2_params.sel; -  	/* Prevent U2 if service interval is shorter than U2 exit latency */  	if (usb_endpoint_xfer_int(desc) || usb_endpoint_xfer_isoc(desc)) { -		if (xhci_service_interval_to_ns(desc) <= timeout_ns) { +		if (xhci_service_interval_to_ns(desc) <= udev->u2_params.mel) {  			dev_dbg(&udev->dev, "Disable U2, ESIT shorter than exit latency\n");  			return USB3_LPM_DISABLED;  		}  	} +	if (xhci->quirks & XHCI_INTEL_HOST) +		timeout_ns = xhci_calculate_intel_u2_timeout(udev, desc); +	else +		timeout_ns = udev->u2_params.sel; +  	/* The U2 timeout is encoded in 256us intervals */  	timeout_ns = DIV_ROUND_UP_ULL(timeout_ns, 256 * 1000);  	/* If the necessary timeout value is bigger than what we can set in the diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index df7c9f46be54..85a57385958f 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c @@ -193,6 +193,7 @@ tusb_fifo_write_unaligned(void __iomem *fifo, const u8 *buf, u16 len)  	}  	if (len > 0) {  		/* Write the rest 1 - 3 bytes to FIFO */ +		val = 0;  		memcpy(&val, buf, len);  		musb_writel(fifo, 0, val);  	} diff --git a/drivers/usb/phy/phy-fsl-usb.c b/drivers/usb/phy/phy-fsl-usb.c index 85d031ce85c1..63798de8b5ae 100644 --- a/drivers/usb/phy/phy-fsl-usb.c +++ b/drivers/usb/phy/phy-fsl-usb.c @@ -891,6 +891,8 @@ int usb_otg_start(struct platform_device *pdev)  	/* request irq */  	p_otg->irq = platform_get_irq(pdev, 0); +	if (p_otg->irq < 0) +		return p_otg->irq;  	status = request_irq(p_otg->irq, fsl_otg_isr,  				IRQF_SHARED, driver_name, p_otg);  	if (status) { diff --git a/drivers/usb/phy/phy-isp1301.c b/drivers/usb/phy/phy-isp1301.c index b3b33cf7ddf6..f333024660b4 100644 --- a/drivers/usb/phy/phy-isp1301.c +++ b/drivers/usb/phy/phy-isp1301.c @@ -136,7 +136,7 @@ static int isp1301_remove(struct i2c_client *client)  static struct i2c_driver isp1301_driver = {  	.driver = {  		.name = DRV_NAME, -		.of_match_table = of_match_ptr(isp1301_of_match), +		.of_match_table = isp1301_of_match,  	},  	.probe = isp1301_probe,  	.remove = isp1301_remove, diff --git a/drivers/usb/phy/phy-tahvo.c b/drivers/usb/phy/phy-tahvo.c index 335a1ef35224..ec86eedd789b 100644 --- a/drivers/usb/phy/phy-tahvo.c +++ b/drivers/usb/phy/phy-tahvo.c @@ -404,7 +404,9 @@ static int tahvo_usb_probe(struct platform_device *pdev)  	dev_set_drvdata(&pdev->dev, tu); -	tu->irq = platform_get_irq(pdev, 0); +	tu->irq = ret = platform_get_irq(pdev, 0); +	if (ret < 0) +		return ret;  	ret = request_threaded_irq(tu->irq, NULL, tahvo_usb_vbus_interrupt,  				   IRQF_ONESHOT,  				   "tahvo-vbus", tu); diff --git a/drivers/usb/phy/phy-twl6030-usb.c b/drivers/usb/phy/phy-twl6030-usb.c index 12741856a75c..220e1a59a871 100644 --- a/drivers/usb/phy/phy-twl6030-usb.c +++ b/drivers/usb/phy/phy-twl6030-usb.c @@ -336,6 +336,11 @@ static int twl6030_usb_probe(struct platform_device *pdev)  	twl->irq2		= platform_get_irq(pdev, 1);  	twl->linkstat		= OMAP_MUSB_UNKNOWN; +	if (twl->irq1 < 0) +		return twl->irq1; +	if (twl->irq2 < 0) +		return twl->irq2; +  	twl->comparator.set_vbus	= twl6030_set_vbus;  	twl->comparator.start_srp	= twl6030_start_srp; diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index f039b85d5f57..0fbdfea7ec2c 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c @@ -230,6 +230,7 @@ static const struct usb_device_id id_table[] = {  	{ USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */  	{ USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */  	{ USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */ +	{ USB_DEVICE(0x2184, 0x0030) }, /* GW Instek GDM-834x Digital Multimeter */  	{ USB_DEVICE(0x2626, 0xEA60) }, /* Aruba Networks 7xxx USB Serial Console */  	{ USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */  	{ USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */ diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index 7f3af3ed347d..2c85801ffccd 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c @@ -229,8 +229,10 @@ static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,  	int status;  	buf = kmalloc(1, GFP_KERNEL); -	if (!buf) +	if (!buf) { +		*data = 0;  		return -ENOMEM; +	}  	status = usb_control_msg(usbdev, pipe, request, requesttype, value,  				     index, buf, 1, MOS_WDR_TIMEOUT); diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 7a9b9542882f..8a94c85428d9 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c @@ -126,7 +126,6 @@  #define BANDB_DEVICE_ID_USOPTL4_2P       0xBC02  #define BANDB_DEVICE_ID_USOPTL4_4        0xAC44  #define BANDB_DEVICE_ID_USOPTL4_4P       0xBC03 -#define BANDB_DEVICE_ID_USOPTL2_4        0xAC24  /* This driver also supports   * ATEN UC2324 device using Moschip MCS7840 @@ -207,7 +206,6 @@ static const struct usb_device_id id_table[] = {  	{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P)},  	{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)},  	{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P)}, -	{USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)},  	{USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)},  	{USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)},  	{USB_DEVICE(USB_VENDOR_ID_MOXA, MOXA_DEVICE_ID_2210)}, diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 02ded56bcbc6..ec8ad931f41e 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -1187,6 +1187,14 @@ static const struct usb_device_id option_ids[] = {  	  .driver_info = NCTRL(0) | RSVD(1) },  	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff),	/* Telit FD980 */  	  .driver_info = NCTRL(2) | RSVD(3) }, +	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1060, 0xff),	/* Telit LN920 (rmnet) */ +	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, +	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1061, 0xff),	/* Telit LN920 (MBIM) */ +	  .driver_info = NCTRL(0) | RSVD(1) }, +	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1062, 0xff),	/* Telit LN920 (RNDIS) */ +	  .driver_info = NCTRL(2) | RSVD(3) }, +	{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1063, 0xff),	/* Telit LN920 (ECM) */ +	  .driver_info = NCTRL(0) | RSVD(1) },  	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),  	  .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },  	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), @@ -1632,7 +1640,6 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) },  	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) },  	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, -	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) },  	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff),  	  .driver_info = RSVD(1) },  	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff), @@ -2052,6 +2059,8 @@ static const struct usb_device_id option_ids[] = {  	  .driver_info = RSVD(0) | RSVD(1) | RSVD(6) },  	{ USB_DEVICE(0x0489, 0xe0b5),						/* Foxconn T77W968 ESIM */  	  .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, +	{ USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff),			/* Foxconn T99W265 MBIM */ +	  .driver_info = RSVD(3) },  	{ USB_DEVICE(0x1508, 0x1001),						/* Fibocom NL668 (IOT version) */  	  .driver_info = RSVD(4) | RSVD(5) | RSVD(6) },  	{ USB_DEVICE(0x2cb7, 0x0104),						/* Fibocom NL678 series */ diff --git a/drivers/video/fbdev/asiliantfb.c b/drivers/video/fbdev/asiliantfb.c index 7e8ddf00ccc2..dbcc6ebaf904 100644 --- a/drivers/video/fbdev/asiliantfb.c +++ b/drivers/video/fbdev/asiliantfb.c @@ -227,6 +227,9 @@ static int asiliantfb_check_var(struct fb_var_screeninfo *var,  {  	unsigned long Ftarget, ratio, remainder; +	if (!var->pixclock) +		return -EINVAL; +  	ratio = 1000000 / var->pixclock;  	remainder = 1000000 % var->pixclock;  	Ftarget = 1000000 * ratio + (1000000 * remainder) / var->pixclock; diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 0a934b84e809..cf533f1fa699 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -32,6 +32,7 @@  #include <linux/device.h>  #include <linux/efi.h>  #include <linux/fb.h> +#include <linux/overflow.h>  #include <asm/fb.h> @@ -981,6 +982,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)  	if ((var->activate & FB_ACTIVATE_FORCE) ||  	    memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) {  		u32 activate = var->activate; +		u32 unused;  		/* When using FOURCC mode, make sure the red, green, blue and  		 * transp fields are set to 0. @@ -1005,6 +1007,11 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)  		if (var->xres < 8 || var->yres < 8)  			return -EINVAL; +		/* Too huge resolution causes multiplication overflow. */ +		if (check_mul_overflow(var->xres, var->yres, &unused) || +		    check_mul_overflow(var->xres_virtual, var->yres_virtual, &unused)) +			return -EINVAL; +  		ret = info->fbops->fb_check_var(var, info);  		if (ret) diff --git a/drivers/video/fbdev/kyro/fbdev.c b/drivers/video/fbdev/kyro/fbdev.c index 5bb01533271e..d98c3f5d80df 100644 --- a/drivers/video/fbdev/kyro/fbdev.c +++ b/drivers/video/fbdev/kyro/fbdev.c @@ -372,6 +372,11 @@ static int kyro_dev_overlay_viewport_set(u32 x, u32 y, u32 ulWidth, u32 ulHeight  		/* probably haven't called CreateOverlay yet */  		return -EINVAL; +	if (ulWidth == 0 || ulWidth == 0xffffffff || +	    ulHeight == 0 || ulHeight == 0xffffffff || +	    (x < 2 && ulWidth + 2 == 0)) +		return -EINVAL; +  	/* Stop Ramdac Output */  	DisableRamdacOutput(deviceInfo.pSTGReg); @@ -394,6 +399,9 @@ static int kyrofb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)  {  	struct kyrofb_info *par = info->par; +	if (!var->pixclock) +		return -EINVAL; +  	if (var->bits_per_pixel != 16 && var->bits_per_pixel != 32) {  		printk(KERN_WARNING "kyrofb: depth not supported: %u\n", var->bits_per_pixel);  		return -EINVAL; diff --git a/drivers/video/fbdev/riva/fbdev.c b/drivers/video/fbdev/riva/fbdev.c index f1ad2747064b..6e5e29fe13db 100644 --- a/drivers/video/fbdev/riva/fbdev.c +++ b/drivers/video/fbdev/riva/fbdev.c @@ -1088,6 +1088,9 @@ static int rivafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)  	int mode_valid = 0;  	NVTRACE_ENTER(); +	if (!var->pixclock) +		return -EINVAL; +  	switch (var->bits_per_pixel) {  	case 1 ... 8:  		var->red.offset = var->green.offset = var->blue.offset = 0; diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index ca30e3670b42..92415b8ac5a3 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -476,7 +476,7 @@ again:  	 * inode has not been flagged as nocompress.  This flag can  	 * change at any time if we discover bad compression ratios.  	 */ -	if (nr_pages > 1 && inode_need_compress(inode)) { +	if (inode_need_compress(inode)) {  		WARN_ON(pages);  		pages = kcalloc(nr_pages, sizeof(struct page *), GFP_NOFS);  		if (!pages) { diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 9d74cd37b395..154c47282a34 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -1545,6 +1545,8 @@ static int __mark_caps_flushing(struct inode *inode,   * try to invalidate mapping pages without blocking.   */  static int try_nonblocking_invalidate(struct inode *inode) +	__releases(ci->i_ceph_lock) +	__acquires(ci->i_ceph_lock)  {  	struct ceph_inode_info *ci = ceph_inode(inode);  	u32 invalidating_gen = ci->i_rdcache_gen; diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c index 942874257a09..e5e780145728 100644 --- a/fs/cifs/cifs_unicode.c +++ b/fs/cifs/cifs_unicode.c @@ -367,14 +367,9 @@ cifs_strndup_from_utf16(const char *src, const int maxlen,  		if (!dst)  			return NULL;  		cifs_from_utf16(dst, (__le16 *) src, len, maxlen, codepage, -			       NO_MAP_UNI_RSVD); +				NO_MAP_UNI_RSVD);  	} else { -		len = strnlen(src, maxlen); -		len++; -		dst = kmalloc(len, GFP_KERNEL); -		if (!dst) -			return NULL; -		strlcpy(dst, src, len); +		dst = kstrndup(src, maxlen, GFP_KERNEL);  	}  	return dst; diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 71c9ed70aa68..cda22b312a4c 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -2961,9 +2961,10 @@ cifs_match_super(struct super_block *sb, void *data)  	spin_lock(&cifs_tcp_ses_lock);  	cifs_sb = CIFS_SB(sb);  	tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb)); -	if (IS_ERR(tlink)) { +	if (tlink == NULL) { +		/* can not match superblock if tlink were ever null */  		spin_unlock(&cifs_tcp_ses_lock); -		return rc; +		return 0;  	}  	tcon = tlink_tcon(tlink);  	ses = tcon->ses; diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index 9bc7a29f88d6..2d3918cdcc28 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c @@ -602,7 +602,7 @@ sess_alloc_buffer(struct sess_data *sess_data, int wct)  	return 0;  out_free_smb_buf: -	kfree(smb_buf); +	cifs_small_buf_release(smb_buf);  	sess_data->iov[0].iov_base = NULL;  	sess_data->iov[0].iov_len = 0;  	sess_data->buf0_type = CIFS_NO_BUFFER; diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c index 9f9992b37924..2e4747e0aaf0 100644 --- a/fs/ext2/balloc.c +++ b/fs/ext2/balloc.c @@ -46,10 +46,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,  	struct ext2_sb_info *sbi = EXT2_SB(sb);  	if (block_group >= sbi->s_groups_count) { -		ext2_error (sb, "ext2_get_group_desc", -			    "block_group >= groups_count - " -			    "block_group = %d, groups_count = %lu", -			    block_group, sbi->s_groups_count); +		WARN(1, "block_group >= groups_count - " +		     "block_group = %d, groups_count = %lu", +		     block_group, sbi->s_groups_count);  		return NULL;  	} @@ -57,10 +56,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,  	group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(sb);  	offset = block_group & (EXT2_DESC_PER_BLOCK(sb) - 1);  	if (!sbi->s_group_desc[group_desc]) { -		ext2_error (sb, "ext2_get_group_desc", -			    "Group descriptor not loaded - " -			    "block_group = %d, group_desc = %lu, desc = %lu", -			     block_group, group_desc, offset); +		WARN(1, "Group descriptor not loaded - " +		     "block_group = %d, group_desc = %lu, desc = %lu", +		      block_group, group_desc, offset);  		return NULL;  	} diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 3dc54352c9e7..df7014749be2 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c @@ -524,7 +524,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx)  	struct dir_private_info *info = file->private_data;  	struct inode *inode = file_inode(file);  	struct fname *fname; -	int	ret; +	int ret = 0;  	if (!info) {  		info = ext4_htree_create_dir_info(file, ctx->pos); @@ -572,7 +572,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx)  						   info->curr_minor_hash,  						   &info->next_hash);  			if (ret < 0) -				return ret; +				goto finished;  			if (ret == 0) {  				ctx->pos = ext4_get_htree_eof(file);  				break; @@ -603,7 +603,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx)  	}  finished:  	info->last_pos = ctx->pos; -	return 0; +	return ret < 0 ? ret : 0;  }  static int ext4_dir_open(struct inode * inode, struct file * filp) diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index 1016a8ddd3b0..9f893b6df1cb 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -760,6 +760,12 @@ int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len,  	ext4_write_lock_xattr(inode, &no_expand);  	BUG_ON(!ext4_has_inline_data(inode)); +	/* +	 * ei->i_inline_off may have changed since ext4_write_begin() +	 * called ext4_try_to_write_inline_data() +	 */ +	(void) ext4_find_inline_data_nolock(inode); +  	kaddr = kmap_atomic(page);  	ext4_write_inline_data(inode, &iloc, kaddr, pos, len);  	kunmap_atomic(kaddr); diff --git a/fs/gfs2/lock_dlm.c b/fs/gfs2/lock_dlm.c index 3cbc9147286d..da9f97911852 100644 --- a/fs/gfs2/lock_dlm.c +++ b/fs/gfs2/lock_dlm.c @@ -296,6 +296,11 @@ static void gdlm_put_lock(struct gfs2_glock *gl)  	gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT);  	gfs2_update_request_times(gl); +	/* don't want to call dlm if we've unmounted the lock protocol */ +	if (test_bit(DFL_UNMOUNT, &ls->ls_recover_flags)) { +		gfs2_glock_free(gl); +		return; +	}  	/* don't want to skip dlm_unlock writing the lvb when lock has one */  	if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) && diff --git a/fs/nilfs2/sysfs.c b/fs/nilfs2/sysfs.c index c3b629eec294..49a148ebbcda 100644 --- a/fs/nilfs2/sysfs.c +++ b/fs/nilfs2/sysfs.c @@ -73,11 +73,9 @@ static const struct sysfs_ops nilfs_##name##_attr_ops = { \  #define NILFS_DEV_INT_GROUP_TYPE(name, parent_name) \  static void nilfs_##name##_attr_release(struct kobject *kobj) \  { \ -	struct nilfs_sysfs_##parent_name##_subgroups *subgroups; \ -	struct the_nilfs *nilfs = container_of(kobj->parent, \ -						struct the_nilfs, \ -						ns_##parent_name##_kobj); \ -	subgroups = nilfs->ns_##parent_name##_subgroups; \ +	struct nilfs_sysfs_##parent_name##_subgroups *subgroups = container_of(kobj, \ +						struct nilfs_sysfs_##parent_name##_subgroups, \ +						sg_##name##_kobj); \  	complete(&subgroups->sg_##name##_kobj_unregister); \  } \  static struct kobj_type nilfs_##name##_ktype = { \ @@ -103,12 +101,12 @@ static int nilfs_sysfs_create_##name##_group(struct the_nilfs *nilfs) \  	err = kobject_init_and_add(kobj, &nilfs_##name##_ktype, parent, \  				    #name); \  	if (err) \ -		return err; \ -	return 0; \ +		kobject_put(kobj); \ +	return err; \  } \  static void nilfs_sysfs_delete_##name##_group(struct the_nilfs *nilfs) \  { \ -	kobject_del(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \ +	kobject_put(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \  }  /************************************************************************ @@ -219,14 +217,14 @@ int nilfs_sysfs_create_snapshot_group(struct nilfs_root *root)  	}  	if (err) -		return err; +		kobject_put(&root->snapshot_kobj); -	return 0; +	return err;  }  void nilfs_sysfs_delete_snapshot_group(struct nilfs_root *root)  { -	kobject_del(&root->snapshot_kobj); +	kobject_put(&root->snapshot_kobj);  }  /************************************************************************ @@ -1008,7 +1006,7 @@ int nilfs_sysfs_create_device_group(struct super_block *sb)  	err = kobject_init_and_add(&nilfs->ns_dev_kobj, &nilfs_dev_ktype, NULL,  				    "%s", sb->s_id);  	if (err) -		goto free_dev_subgroups; +		goto cleanup_dev_kobject;  	err = nilfs_sysfs_create_mounted_snapshots_group(nilfs);  	if (err) @@ -1045,9 +1043,7 @@ delete_mounted_snapshots_group:  	nilfs_sysfs_delete_mounted_snapshots_group(nilfs);  cleanup_dev_kobject: -	kobject_del(&nilfs->ns_dev_kobj); - -free_dev_subgroups: +	kobject_put(&nilfs->ns_dev_kobj);  	kfree(nilfs->ns_dev_subgroups);  failed_create_device_group: diff --git a/fs/qnx4/dir.c b/fs/qnx4/dir.c index b218f965817b..613cc38c9efa 100644 --- a/fs/qnx4/dir.c +++ b/fs/qnx4/dir.c @@ -14,13 +14,48 @@  #include <linux/buffer_head.h>  #include "qnx4.h" +/* + * A qnx4 directory entry is an inode entry or link info + * depending on the status field in the last byte. The + * first byte is where the name start either way, and a + * zero means it's empty. + * + * Also, due to a bug in gcc, we don't want to use the + * real (differently sized) name arrays in the inode and + * link entries, but always the 'de_name[]' one in the + * fake struct entry. + * + * See + * + *   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578#c6 + * + * for details, but basically gcc will take the size of the + * 'name' array from one of the used union entries randomly. + * + * This use of 'de_name[]' (48 bytes) avoids the false positive + * warnings that would happen if gcc decides to use 'inode.di_name' + * (16 bytes) even when the pointer and size were to come from + * 'link.dl_name' (48 bytes). + * + * In all cases the actual name pointer itself is the same, it's + * only the gcc internal 'what is the size of this field' logic + * that can get confused. + */ +union qnx4_directory_entry { +	struct { +		const char de_name[48]; +		u8 de_pad[15]; +		u8 de_status; +	}; +	struct qnx4_inode_entry inode; +	struct qnx4_link_info link; +}; +  static int qnx4_readdir(struct file *file, struct dir_context *ctx)  {  	struct inode *inode = file_inode(file);  	unsigned int offset;  	struct buffer_head *bh; -	struct qnx4_inode_entry *de; -	struct qnx4_link_info *le;  	unsigned long blknum;  	int ix, ino;  	int size; @@ -37,27 +72,27 @@ static int qnx4_readdir(struct file *file, struct dir_context *ctx)  		}  		ix = (ctx->pos >> QNX4_DIR_ENTRY_SIZE_BITS) % QNX4_INODES_PER_BLOCK;  		for (; ix < QNX4_INODES_PER_BLOCK; ix++, ctx->pos += QNX4_DIR_ENTRY_SIZE) { +			union qnx4_directory_entry *de; +  			offset = ix * QNX4_DIR_ENTRY_SIZE; -			de = (struct qnx4_inode_entry *) (bh->b_data + offset); -			if (!de->di_fname[0]) +			de = (union qnx4_directory_entry *) (bh->b_data + offset); + +			if (!de->de_name[0])  				continue; -			if (!(de->di_status & (QNX4_FILE_USED|QNX4_FILE_LINK))) +			if (!(de->de_status & (QNX4_FILE_USED|QNX4_FILE_LINK)))  				continue; -			if (!(de->di_status & QNX4_FILE_LINK)) -				size = QNX4_SHORT_NAME_MAX; -			else -				size = QNX4_NAME_MAX; -			size = strnlen(de->di_fname, size); -			QNX4DEBUG((KERN_INFO "qnx4_readdir:%.*s\n", size, de->di_fname)); -			if (!(de->di_status & QNX4_FILE_LINK)) +			if (!(de->de_status & QNX4_FILE_LINK)) { +				size = sizeof(de->inode.di_fname);  				ino = blknum * QNX4_INODES_PER_BLOCK + ix - 1; -			else { -				le  = (struct qnx4_link_info*)de; -				ino = ( le32_to_cpu(le->dl_inode_blk) - 1 ) * +			} else { +				size = sizeof(de->link.dl_fname); +				ino = ( le32_to_cpu(de->link.dl_inode_blk) - 1 ) *  					QNX4_INODES_PER_BLOCK + -					le->dl_inode_ndx; +					de->link.dl_inode_ndx;  			} -			if (!dir_emit(ctx, de->di_fname, size, ino, DT_UNKNOWN)) { +			size = strnlen(de->de_name, size); +			QNX4DEBUG((KERN_INFO "qnx4_readdir:%.*s\n", size, name)); +			if (!dir_emit(ctx, de->de_name, size, ino, DT_UNKNOWN)) {  				brelse(bh);  				return 0;  			} diff --git a/fs/udf/misc.c b/fs/udf/misc.c index 71d1c25f360d..8c7f9ea251e5 100644 --- a/fs/udf/misc.c +++ b/fs/udf/misc.c @@ -175,13 +175,22 @@ struct genericFormat *udf_get_extendedattr(struct inode *inode, uint32_t type,  		else  			offset = le32_to_cpu(eahd->appAttrLocation); -		while (offset < iinfo->i_lenEAttr) { +		while (offset + sizeof(*gaf) < iinfo->i_lenEAttr) { +			uint32_t attrLength; +  			gaf = (struct genericFormat *)&ea[offset]; +			attrLength = le32_to_cpu(gaf->attrLength); + +			/* Detect undersized elements and buffer overflows */ +			if ((attrLength < sizeof(*gaf)) || +			    (attrLength > (iinfo->i_lenEAttr - offset))) +				break; +  			if (le32_to_cpu(gaf->attrType) == type &&  					gaf->attrSubtype == subtype)  				return gaf;  			else -				offset += le32_to_cpu(gaf->attrLength); +				offset += attrLength;  		}  	} diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 7cabe0cc8665..bc8077e5e688 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -208,6 +208,8 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);      (typeof(ptr)) (__ptr + (off)); })  #endif +#define absolute_pointer(val)	RELOC_HIDE((void *)(val), 0) +  #ifndef OPTIMIZER_HIDE_VAR  #define OPTIMIZER_HIDE_VAR(var) barrier()  #endif diff --git a/include/linux/cred.h b/include/linux/cred.h index d2db1da3036c..ee2b36cdb80d 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h @@ -243,7 +243,7 @@ static inline struct cred *get_new_cred(struct cred *cred)   * @cred: The credentials to reference   *   * Get a reference on the specified set of credentials.  The caller must - * release the reference. + * release the reference.  If %NULL is passed, it is returned with no action.   *   * This is used to deal with a committed set of credentials.  Although the   * pointer is const, this will temporarily discard the const and increment the @@ -254,6 +254,8 @@ static inline struct cred *get_new_cred(struct cred *cred)  static inline const struct cred *get_cred(const struct cred *cred)  {  	struct cred *nonconst_cred = (struct cred *) cred; +	if (!cred) +		return cred;  	validate_creds(cred);  	nonconst_cred->non_rcu = 0;  	return get_new_cred(nonconst_cred); @@ -264,7 +266,7 @@ static inline const struct cred *get_cred(const struct cred *cred)   * @cred: The credentials to release   *   * Release a reference to a set of credentials, deleting them when the last ref - * is released. + * is released.  If %NULL is passed, nothing is done.   *   * This takes a const pointer to a set of credentials because the credentials   * on task_struct are attached by const pointers to prevent accidental @@ -274,9 +276,11 @@ static inline void put_cred(const struct cred *_cred)  {  	struct cred *cred = (struct cred *) _cred; -	validate_creds(cred); -	if (atomic_dec_and_test(&(cred)->usage)) -		__put_cred(cred); +	if (cred) { +		validate_creds(cred); +		if (atomic_dec_and_test(&(cred)->usage)) +			__put_cred(cred); +	}  }  /** diff --git a/include/linux/libata.h b/include/linux/libata.h index ec49344f7555..ae4a5a1ae381 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -437,6 +437,7 @@ enum {  	ATA_HORKAGE_NO_NCQ_LOG	= (1 << 23),	/* don't use NCQ for log read */  	ATA_HORKAGE_NOTRIM	= (1 << 24),	/* don't use TRIM */  	ATA_HORKAGE_MAX_SEC_1024 = (1 << 25),	/* Limit max sects to 1024 */ +	ATA_HORKAGE_NO_NCQ_ON_ATI = (1 << 27),	/* Disable NCQ on ATI chipset */  	 /* DMA mask for user DMA control: User visible values; DO NOT  	    renumber */ diff --git a/include/linux/pci.h b/include/linux/pci.h index 5f37614f2451..c871b19cc915 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1442,8 +1442,9 @@ static inline int pci_set_dma_seg_boundary(struct pci_dev *dev,  { return -EIO; }  static inline int pci_assign_resource(struct pci_dev *dev, int i)  { return -EBUSY; } -static inline int __pci_register_driver(struct pci_driver *drv, -					struct module *owner) +static inline int __must_check __pci_register_driver(struct pci_driver *drv, +						     struct module *owner, +						     const char *mod_name)  { return 0; }  static inline int pci_register_driver(struct pci_driver *drv)  { return 0; } diff --git a/include/linux/power/max17042_battery.h b/include/linux/power/max17042_battery.h index 522757ac9cd4..890f53881fad 100644 --- a/include/linux/power/max17042_battery.h +++ b/include/linux/power/max17042_battery.h @@ -75,7 +75,7 @@ enum max17042_register {  	MAX17042_RelaxCFG	= 0x2A,  	MAX17042_MiscCFG	= 0x2B,  	MAX17042_TGAIN		= 0x2C, -	MAx17042_TOFF		= 0x2D, +	MAX17042_TOFF		= 0x2D,  	MAX17042_CGAIN		= 0x2E,  	MAX17042_COFF		= 0x2F, diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 334534474828..0c849313bc42 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -1507,7 +1507,7 @@ static inline void __skb_insert(struct sk_buff *newsk,  	newsk->next = next;  	newsk->prev = prev;  	next->prev  = prev->next = newsk; -	list->qlen++; +	WRITE_ONCE(list->qlen, list->qlen + 1);  }  static inline void __skb_queue_splice(const struct sk_buff_head *list, diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index eea9bdeecba2..1d24da658f43 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h @@ -469,7 +469,7 @@ struct sctp_af {  					 int saddr);  	void		(*from_sk)	(union sctp_addr *,  					 struct sock *sk); -	void		(*from_addr_param) (union sctp_addr *, +	bool		(*from_addr_param) (union sctp_addr *,  					    union sctp_addr_param *,  					    __be16 port, int iif);  	int		(*to_addr_param) (const union sctp_addr *, diff --git a/include/net/sock.h b/include/net/sock.h index ac74a2aaa0d6..693711fead9c 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -429,8 +429,10 @@ struct sock {  #if IS_ENABLED(CONFIG_CGROUP_NET_PRIO)  	__u32			sk_cgrp_prioidx;  #endif +	spinlock_t		sk_peer_lock;  	struct pid		*sk_peer_pid;  	const struct cred	*sk_peer_cred; +  	long			sk_rcvtimeo;  	long			sk_sndtimeo;  	struct timer_list	sk_timer; diff --git a/include/uapi/linux/serial_reg.h b/include/uapi/linux/serial_reg.h index 1e5ac4e776da..5bcc637cee46 100644 --- a/include/uapi/linux/serial_reg.h +++ b/include/uapi/linux/serial_reg.h @@ -61,6 +61,7 @@   * ST16C654:	 8  16  56  60		 8  16  32  56	PORT_16654   * TI16C750:	 1  16  32  56		xx  xx  xx  xx	PORT_16750   * TI16C752:	 8  16  56  60		 8  16  32  56 + * OX16C950:	16  32 112 120		16  32  64 112	PORT_16C950   * Tegra:	 1   4   8  14		16   8   4   1	PORT_TEGRA   */  #define UART_FCR_R_TRIG_00	0x00 diff --git a/kernel/profile.c b/kernel/profile.c index 9cd8e18e6f18..927a0345e259 100644 --- a/kernel/profile.c +++ b/kernel/profile.c @@ -38,7 +38,8 @@ struct profile_hit {  #define NR_PROFILE_GRP		(NR_PROFILE_HIT/PROFILE_GRPSZ)  static atomic_t *prof_buffer; -static unsigned long prof_len, prof_shift; +static unsigned long prof_len; +static unsigned short int prof_shift;  int prof_on __read_mostly;  EXPORT_SYMBOL_GPL(prof_on); @@ -63,8 +64,8 @@ int profile_setup(char *str)  		if (str[strlen(sleepstr)] == ',')  			str += strlen(sleepstr) + 1;  		if (get_option(&str, &par)) -			prof_shift = par; -		pr_info("kernel sleep profiling enabled (shift: %ld)\n", +			prof_shift = clamp(par, 0, BITS_PER_LONG - 1); +		pr_info("kernel sleep profiling enabled (shift: %u)\n",  			prof_shift);  #else  		pr_warn("kernel sleep profiling requires CONFIG_SCHEDSTATS\n"); @@ -74,21 +75,21 @@ int profile_setup(char *str)  		if (str[strlen(schedstr)] == ',')  			str += strlen(schedstr) + 1;  		if (get_option(&str, &par)) -			prof_shift = par; -		pr_info("kernel schedule profiling enabled (shift: %ld)\n", +			prof_shift = clamp(par, 0, BITS_PER_LONG - 1); +		pr_info("kernel schedule profiling enabled (shift: %u)\n",  			prof_shift);  	} else if (!strncmp(str, kvmstr, strlen(kvmstr))) {  		prof_on = KVM_PROFILING;  		if (str[strlen(kvmstr)] == ',')  			str += strlen(kvmstr) + 1;  		if (get_option(&str, &par)) -			prof_shift = par; -		pr_info("kernel KVM profiling enabled (shift: %ld)\n", +			prof_shift = clamp(par, 0, BITS_PER_LONG - 1); +		pr_info("kernel KVM profiling enabled (shift: %u)\n",  			prof_shift);  	} else if (get_option(&str, &par)) { -		prof_shift = par; +		prof_shift = clamp(par, 0, BITS_PER_LONG - 1);  		prof_on = CPU_PROFILING; -		pr_info("kernel profiling enabled (shift: %ld)\n", +		pr_info("kernel profiling enabled (shift: %u)\n",  			prof_shift);  	}  	return 1; @@ -475,7 +476,7 @@ read_profile(struct file *file, char __user *buf, size_t count, loff_t *ppos)  	unsigned long p = *ppos;  	ssize_t read;  	char *pnt; -	unsigned int sample_step = 1 << prof_shift; +	unsigned long sample_step = 1UL << prof_shift;  	profile_flip_buffers();  	if (p >= (prof_len+1)*sizeof(unsigned int)) diff --git a/kernel/sys.c b/kernel/sys.c index 5a40f5c07054..d5ea3360038c 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1777,13 +1777,6 @@ static int validate_prctl_map(struct prctl_mm_map *prctl_map)  	error = -EINVAL;  	/* -	 * @brk should be after @end_data in traditional maps. -	 */ -	if (prctl_map->start_brk <= prctl_map->end_data || -	    prctl_map->brk <= prctl_map->end_data) -		goto out; - -	/*  	 * Neither we should allow to override limits if they set.  	 */  	if (check_data_rlimit(rlimit(RLIMIT_DATA), prctl_map->brk, diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 267def89a2db..baa82e3ab2c0 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -1633,6 +1633,14 @@ static int blk_trace_remove_queue(struct request_queue *q)  	if (bt == NULL)  		return -EINVAL; +	if (bt->trace_state == Blktrace_running) { +		bt->trace_state = Blktrace_stopped; +		spin_lock_irq(&running_trace_lock); +		list_del_init(&bt->running_list); +		spin_unlock_irq(&running_trace_lock); +		relay_flush(bt->rchan); +	} +  	put_probe_ref();  	synchronize_rcu();  	blk_trace_free(bt); diff --git a/lib/test_bpf.c b/lib/test_bpf.c index b1495f586f29..cf2880d2ce3f 100644 --- a/lib/test_bpf.c +++ b/lib/test_bpf.c @@ -3983,8 +3983,8 @@ static struct bpf_test tests[] = {  		.u.insns_int = {  			BPF_LD_IMM64(R0, 0),  			BPF_LD_IMM64(R1, 0xffffffffffffffffLL), -			BPF_STX_MEM(BPF_W, R10, R1, -40), -			BPF_LDX_MEM(BPF_W, R0, R10, -40), +			BPF_STX_MEM(BPF_DW, R10, R1, -40), +			BPF_LDX_MEM(BPF_DW, R0, R10, -40),  			BPF_EXIT_INSN(),  		},  		INTERNAL, @@ -5399,7 +5399,14 @@ static int run_one(const struct bpf_prog *fp, struct bpf_test *test)  		u64 duration;  		u32 ret; -		if (test->test[i].data_size == 0 && +		/* +		 * NOTE: Several sub-tests may be present, in which case +		 * a zero {data_size, result} tuple indicates the end of +		 * the sub-test array. The first test is always run, +		 * even if both data_size and result happen to be zero. +		 */ +		if (i > 0 && +		    test->test[i].data_size == 0 &&  		    test->test[i].result == 0)  			break; diff --git a/mm/kmemleak.c b/mm/kmemleak.c index ff0390823e04..d68679106731 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -1403,7 +1403,7 @@ static void kmemleak_scan(void)  			if (page_count(page) == 0)  				continue;  			scan_block(page, page + 1, NULL); -			if (!(pfn % (MAX_SCAN_SIZE / sizeof(*page)))) +			if (!(pfn & 63))  				cond_resched();  		}  	} diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 1dcb8ff0e681..bd0c4bc00941 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -724,7 +724,7 @@ static inline void __free_one_page(struct page *page,  	struct page *buddy;  	unsigned int max_order; -	max_order = min_t(unsigned int, MAX_ORDER, pageblock_order + 1); +	max_order = min_t(unsigned int, MAX_ORDER - 1, pageblock_order);  	VM_BUG_ON(!zone_is_initialized(zone));  	VM_BUG_ON_PAGE(page->flags & PAGE_FLAGS_CHECK_AT_PREP, page); @@ -739,7 +739,7 @@ static inline void __free_one_page(struct page *page,  	VM_BUG_ON_PAGE(bad_range(zone, page), page);  continue_merging: -	while (order < max_order - 1) { +	while (order < max_order) {  		buddy_idx = __find_buddy_index(page_idx, order);  		buddy = page + (buddy_idx - page_idx);  		if (!page_is_buddy(page, buddy, order)) @@ -760,7 +760,7 @@ continue_merging:  		page_idx = combined_idx;  		order++;  	} -	if (max_order < MAX_ORDER) { +	if (order < MAX_ORDER - 1) {  		/* If we are here, it means order is >= pageblock_order.  		 * We want to prevent merge between freepages on isolate  		 * pageblock and normal pageblock. Without this, pageblock @@ -781,7 +781,7 @@ continue_merging:  						is_migrate_isolate(buddy_mt)))  				goto done_merging;  		} -		max_order++; +		max_order = order + 1;  		goto continue_merging;  	} diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index 5892bd1457d4..252a4c22898e 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c @@ -605,7 +605,7 @@ static int p9_virtio_probe(struct virtio_device *vdev)  	chan->vc_wq = kmalloc(sizeof(wait_queue_head_t), GFP_KERNEL);  	if (!chan->vc_wq) {  		err = -ENOMEM; -		goto out_free_tag; +		goto out_remove_file;  	}  	init_waitqueue_head(chan->vc_wq);  	chan->ring_bufs_avail = 1; @@ -623,6 +623,8 @@ static int p9_virtio_probe(struct virtio_device *vdev)  	return 0; +out_remove_file: +	sysfs_remove_file(&vdev->dev.kobj, &dev_attr_mount_tag.attr);  out_free_tag:  	kfree(tag);  out_free_vq: diff --git a/net/bluetooth/cmtp/cmtp.h b/net/bluetooth/cmtp/cmtp.h index c32638dddbf9..f6b9dc4e408f 100644 --- a/net/bluetooth/cmtp/cmtp.h +++ b/net/bluetooth/cmtp/cmtp.h @@ -26,7 +26,7 @@  #include <linux/types.h>  #include <net/bluetooth/bluetooth.h> -#define BTNAMSIZ 18 +#define BTNAMSIZ 21  /* CMTP ioctl defines */  #define CMTPCONNADD	_IOW('C', 200, int) diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 36d0e4bc592c..305d6fdb1b9e 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -1357,6 +1357,12 @@ int hci_inquiry(void __user *arg)  		goto done;  	} +	/* Restrict maximum inquiry length to 60 seconds */ +	if (ir.length > 60) { +		err = -EINVAL; +		goto done; +	} +  	hci_dev_lock(hdev);  	if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||  	    inquiry_cache_empty(hdev) || ir.flags & IREQ_CACHE_FLUSH) { @@ -1679,6 +1685,14 @@ int hci_dev_do_close(struct hci_dev *hdev)  	hci_req_cancel(hdev, ENODEV);  	hci_req_lock(hdev); +	if (!hci_dev_test_flag(hdev, HCI_UNREGISTER) && +	    !hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && +	    test_bit(HCI_UP, &hdev->flags)) { +		/* Execute vendor specific shutdown routine */ +		if (hdev->shutdown) +			hdev->shutdown(hdev); +	} +  	if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {  		cancel_delayed_work_sync(&hdev->cmd_timer);  		hci_req_unlock(hdev); diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 024950688c09..618fa399f32d 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -3747,6 +3747,21 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev,  	switch (ev->status) {  	case 0x00: +		/* The synchronous connection complete event should only be +		 * sent once per new connection. Receiving a successful +		 * complete event when the connection status is already +		 * BT_CONNECTED means that the device is misbehaving and sent +		 * multiple complete event packets for the same new connection. +		 * +		 * Registering the device more than once can corrupt kernel +		 * memory, hence upon detecting this invalid event, we report +		 * an error and ignore the packet. +		 */ +		if (conn->state == BT_CONNECTED) { +			bt_dev_err(hdev, "Ignoring connect complete event for existing connection"); +			goto unlock; +		} +  		conn->handle = __le16_to_cpu(ev->handle);  		conn->state  = BT_CONNECTED;  		conn->type   = ev->link_type; diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 46c3f086a261..bff7b88050d8 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -83,7 +83,6 @@ static void sco_sock_timeout(unsigned long arg)  	sk->sk_state_change(sk);  	bh_unlock_sock(sk); -	sco_sock_kill(sk);  	sock_put(sk);  } @@ -175,7 +174,6 @@ static void sco_conn_del(struct hci_conn *hcon, int err)  		sco_sock_clear_timer(sk);  		sco_chan_del(sk, err);  		bh_unlock_sock(sk); -		sco_sock_kill(sk);  		sock_put(sk);  	} @@ -392,8 +390,7 @@ static void sco_sock_cleanup_listen(struct sock *parent)   */  static void sco_sock_kill(struct sock *sk)  { -	if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket || -	    sock_flag(sk, SOCK_DEAD)) +	if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)  		return;  	BT_DBG("sk %pK state %d", sk, sk->sk_state); @@ -445,7 +442,6 @@ static void sco_sock_close(struct sock *sk)  	lock_sock(sk);  	__sco_sock_close(sk);  	release_sock(sk); -	sco_sock_kill(sk);  }  static void sco_sock_init(struct sock *sk, struct sock *parent) @@ -763,6 +759,11 @@ static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting)  			cp.max_latency = cpu_to_le16(0xffff);  			cp.retrans_effort = 0xff;  			break; +		default: +			/* use CVSD settings as fallback */ +			cp.max_latency = cpu_to_le16(0xffff); +			cp.retrans_effort = 0xff; +			break;  		}  		hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c index 67a4a36febd1..40f032f62029 100644 --- a/net/caif/chnl_net.c +++ b/net/caif/chnl_net.c @@ -56,20 +56,6 @@ struct chnl_net {  	enum caif_states state;  }; -static void robust_list_del(struct list_head *delete_node) -{ -	struct list_head *list_node; -	struct list_head *n; -	ASSERT_RTNL(); -	list_for_each_safe(list_node, n, &chnl_net_list) { -		if (list_node == delete_node) { -			list_del(list_node); -			return; -		} -	} -	WARN_ON(1); -} -  static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt)  {  	struct sk_buff *skb; @@ -371,6 +357,7 @@ static int chnl_net_init(struct net_device *dev)  	ASSERT_RTNL();  	priv = netdev_priv(dev);  	strncpy(priv->name, dev->name, sizeof(priv->name)); +	INIT_LIST_HEAD(&priv->list_field);  	return 0;  } @@ -379,7 +366,7 @@ static void chnl_net_uninit(struct net_device *dev)  	struct chnl_net *priv;  	ASSERT_RTNL();  	priv = netdev_priv(dev); -	robust_list_del(&priv->list_field); +	list_del_init(&priv->list_field);  }  static const struct net_device_ops netdev_ops = { @@ -542,7 +529,7 @@ static void __exit chnl_exit_module(void)  	rtnl_lock();  	list_for_each_safe(list_node, _tmp, &chnl_net_list) {  		dev = list_entry(list_node, struct chnl_net, list_field); -		list_del(list_node); +		list_del_init(list_node);  		delete_device(dev);  	}  	rtnl_unlock(); diff --git a/net/core/sock.c b/net/core/sock.c index cdf2ca201a4f..ffa103957631 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1014,7 +1014,6 @@ set_rcvbuf:  }  EXPORT_SYMBOL(sock_setsockopt); -  static void cred_to_ucred(struct pid *pid, const struct cred *cred,  			  struct ucred *ucred)  { @@ -1174,7 +1173,11 @@ int sock_getsockopt(struct socket *sock, int level, int optname,  		struct ucred peercred;  		if (len > sizeof(peercred))  			len = sizeof(peercred); + +		spin_lock(&sk->sk_peer_lock);  		cred_to_ucred(sk->sk_peer_pid, sk->sk_peer_cred, &peercred); +		spin_unlock(&sk->sk_peer_lock); +  		if (copy_to_user(optval, &peercred, len))  			return -EFAULT;  		goto lenout; @@ -1471,9 +1474,10 @@ static void __sk_destruct(struct rcu_head *head)  		sk->sk_frag.page = NULL;  	} -	if (sk->sk_peer_cred) -		put_cred(sk->sk_peer_cred); +	/* We do not need to acquire sk->sk_peer_lock, we are the last user. */ +	put_cred(sk->sk_peer_cred);  	put_pid(sk->sk_peer_pid); +  	if (likely(sk->sk_net_refcnt))  		put_net(sock_net(sk));  	sk_prot_free(sk->sk_prot_creator, sk); @@ -2457,6 +2461,8 @@ void sock_init_data(struct socket *sock, struct sock *sk)  	sk->sk_peer_pid 	=	NULL;  	sk->sk_peer_cred	=	NULL; +	spin_lock_init(&sk->sk_peer_lock); +  	sk->sk_write_pending	=	0;  	sk->sk_rcvlowat		=	1;  	sk->sk_rcvtimeo		=	MAX_SCHEDULE_TIMEOUT; diff --git a/net/dccp/minisocks.c b/net/dccp/minisocks.c index 68eed344b471..1f03a590288d 100644 --- a/net/dccp/minisocks.c +++ b/net/dccp/minisocks.c @@ -92,6 +92,8 @@ struct sock *dccp_create_openreq_child(const struct sock *sk,  		newdp->dccps_role	    = DCCP_ROLE_SERVER;  		newdp->dccps_hc_rx_ackvec   = NULL;  		newdp->dccps_service_list   = NULL; +		newdp->dccps_hc_rx_ccid     = NULL; +		newdp->dccps_hc_tx_ccid     = NULL;  		newdp->dccps_service	    = dreq->dreq_service;  		newdp->dccps_timestamp_echo = dreq->dreq_timestamp_echo;  		newdp->dccps_timestamp_time = dreq->dreq_timestamp_time; diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index d3685fa18246..358d9dabda1d 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c @@ -461,6 +461,23 @@ static int icmp_multipath_hash_skb(const struct sk_buff *skb)  #endif +/* + * The device used for looking up which routing table to use for sending an ICMP + * error is preferably the source whenever it is set, which should ensure the + * icmp error can be sent to the source host, else lookup using the routing + * table of the destination device, else use the main routing table (index 0). + */ +static struct net_device *icmp_get_route_lookup_dev(struct sk_buff *skb) +{ +	struct net_device *route_lookup_dev = NULL; + +	if (skb->dev) +		route_lookup_dev = skb->dev; +	else if (skb_dst(skb)) +		route_lookup_dev = skb_dst(skb)->dev; +	return route_lookup_dev; +} +  static struct rtable *icmp_route_lookup(struct net *net,  					struct flowi4 *fl4,  					struct sk_buff *skb_in, @@ -469,6 +486,7 @@ static struct rtable *icmp_route_lookup(struct net *net,  					int type, int code,  					struct icmp_bxm *param)  { +	struct net_device *route_lookup_dev;  	struct rtable *rt, *rt2;  	struct flowi4 fl4_dec;  	int err; @@ -483,7 +501,8 @@ static struct rtable *icmp_route_lookup(struct net *net,  	fl4->flowi4_proto = IPPROTO_ICMP;  	fl4->fl4_icmp_type = type;  	fl4->fl4_icmp_code = code; -	fl4->flowi4_oif = l3mdev_master_ifindex(skb_dst(skb_in)->dev); +	route_lookup_dev = icmp_get_route_lookup_dev(skb_in); +	fl4->flowi4_oif = l3mdev_master_ifindex(route_lookup_dev);  	security_skb_classify_flow(skb_in, flowi4_to_flowi(fl4));  	rt = __ip_route_output_key_hash(net, fl4, @@ -508,7 +527,7 @@ static struct rtable *icmp_route_lookup(struct net *net,  	if (err)  		goto relookup_failed; -	if (inet_addr_type_dev_table(net, skb_dst(skb_in)->dev, +	if (inet_addr_type_dev_table(net, route_lookup_dev,  				     fl4_dec.saddr) == RTN_LOCAL) {  		rt2 = __ip_route_output_key(net, &fl4_dec);  		if (IS_ERR(rt2)) diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index c67efa3e79dd..7b0bbda676b3 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c @@ -2631,6 +2631,7 @@ int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u  		rv = 1;  	} else if (im) {  		if (src_addr) { +			spin_lock_bh(&im->lock);  			for (psf = im->sources; psf; psf = psf->sf_next) {  				if (psf->sf_inaddr == src_addr)  					break; @@ -2641,6 +2642,7 @@ int ip_check_mc_rcu(struct in_device *in_dev, __be32 mc_addr, __be32 src_addr, u  					im->sfcount[MCAST_EXCLUDE];  			else  				rv = im->sfcount[MCAST_EXCLUDE] != 0; +			spin_unlock_bh(&im->lock);  		} else  			rv = 1; /* unspecified source; tentatively allow */  	} diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 411badb5bbb5..aad369b767f9 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -376,8 +376,9 @@ static void ip_copy_addrs(struct iphdr *iph, const struct flowi4 *fl4)  {  	BUILD_BUG_ON(offsetof(typeof(*fl4), daddr) !=  		     offsetof(typeof(*fl4), saddr) + sizeof(fl4->saddr)); -	memcpy(&iph->saddr, &fl4->saddr, -	       sizeof(fl4->saddr) + sizeof(fl4->daddr)); + +	iph->saddr = fl4->saddr; +	iph->daddr = fl4->daddr;  }  /* Note: skb->sk can be different from sk, in case of tunnels */ diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 83e1914693f3..f79f9a6dd046 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -600,18 +600,25 @@ static void fnhe_flush_routes(struct fib_nh_exception *fnhe)  	}  } -static struct fib_nh_exception *fnhe_oldest(struct fnhe_hash_bucket *hash) +static void fnhe_remove_oldest(struct fnhe_hash_bucket *hash)  { -	struct fib_nh_exception *fnhe, *oldest; +	struct fib_nh_exception __rcu **fnhe_p, **oldest_p; +	struct fib_nh_exception *fnhe, *oldest = NULL; -	oldest = rcu_dereference(hash->chain); -	for (fnhe = rcu_dereference(oldest->fnhe_next); fnhe; -	     fnhe = rcu_dereference(fnhe->fnhe_next)) { -		if (time_before(fnhe->fnhe_stamp, oldest->fnhe_stamp)) +	for (fnhe_p = &hash->chain; ; fnhe_p = &fnhe->fnhe_next) { +		fnhe = rcu_dereference_protected(*fnhe_p, +						 lockdep_is_held(&fnhe_lock)); +		if (!fnhe) +			break; +		if (!oldest || +		    time_before(fnhe->fnhe_stamp, oldest->fnhe_stamp)) {  			oldest = fnhe; +			oldest_p = fnhe_p; +		}  	}  	fnhe_flush_routes(oldest); -	return oldest; +	*oldest_p = oldest->fnhe_next; +	kfree_rcu(oldest, rcu);  }  static inline u32 fnhe_hashfun(__be32 daddr) @@ -688,16 +695,21 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw,  		if (rt)  			fill_route_from_fnhe(rt, fnhe);  	} else { -		if (depth > FNHE_RECLAIM_DEPTH) -			fnhe = fnhe_oldest(hash); -		else { -			fnhe = kzalloc(sizeof(*fnhe), GFP_ATOMIC); -			if (!fnhe) -				goto out_unlock; - -			fnhe->fnhe_next = hash->chain; -			rcu_assign_pointer(hash->chain, fnhe); +		/* Randomize max depth to avoid some side channels attacks. */ +		int max_depth = FNHE_RECLAIM_DEPTH + +				prandom_u32_max(FNHE_RECLAIM_DEPTH); + +		while (depth > max_depth) { +			fnhe_remove_oldest(hash); +			depth--;  		} + +		fnhe = kzalloc(sizeof(*fnhe), GFP_ATOMIC); +		if (!fnhe) +			goto out_unlock; + +		fnhe->fnhe_next = hash->chain; +  		fnhe->fnhe_genid = genid;  		fnhe->fnhe_daddr = daddr;  		fnhe->fnhe_gw = gw; @@ -705,6 +717,8 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw,  		fnhe->fnhe_mtu_locked = lock;  		fnhe->fnhe_expires = expires; +		rcu_assign_pointer(hash->chain, fnhe); +  		/* Exception created; mark the cached routes for the nexthop  		 * stale, so anyone caching it rechecks if this exception  		 * applies to them. diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index ae5e978724b2..e373dcdab5e2 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -2044,6 +2044,7 @@ static void *tcp_get_idx(struct seq_file *seq, loff_t pos)  static void *tcp_seek_last_pos(struct seq_file *seq)  {  	struct tcp_iter_state *st = seq->private; +	int bucket = st->bucket;  	int offset = st->offset;  	int orig_num = st->num;  	void *rc = NULL; @@ -2054,7 +2055,7 @@ static void *tcp_seek_last_pos(struct seq_file *seq)  			break;  		st->state = TCP_SEQ_STATE_LISTENING;  		rc = listening_get_next(seq, NULL); -		while (offset-- && rc) +		while (offset-- && rc && bucket == st->bucket)  			rc = listening_get_next(seq, rc);  		if (rc)  			break; @@ -2065,7 +2066,7 @@ static void *tcp_seek_last_pos(struct seq_file *seq)  		if (st->bucket > tcp_hashinfo.ehash_mask)  			break;  		rc = established_get_first(seq); -		while (offset-- && rc) +		while (offset-- && rc && bucket == st->bucket)  			rc = established_get_next(seq, rc);  	} diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c index 653892ea8f14..9a85b0133991 100644 --- a/net/l2tp/l2tp_core.c +++ b/net/l2tp/l2tp_core.c @@ -990,8 +990,10 @@ static int l2tp_udp_recv_core(struct l2tp_tunnel *tunnel, struct sk_buff *skb,  	}  	if (tunnel->version == L2TP_HDR_VER_3 && -	    l2tp_v3_ensure_opt_in_linear(session, skb, &ptr, &optr)) +	    l2tp_v3_ensure_opt_in_linear(session, skb, &ptr, &optr)) { +		l2tp_session_dec_refcount(session);  		goto error; +	}  	l2tp_recv_common(session, skb, ptr, optr, hdrflags, length, payload_hook);  	l2tp_session_dec_refcount(session); diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c index 921115327ec8..3884bb1a59dd 100644 --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c @@ -519,6 +519,9 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,  			return RX_DROP_UNUSABLE;  	} +	/* reload hdr - skb might have been reallocated */ +	hdr = (void *)rx->skb->data; +  	data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - mic_len;  	if (!rx->sta || data_len < 0)  		return RX_DROP_UNUSABLE; @@ -751,6 +754,9 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)  			return RX_DROP_UNUSABLE;  	} +	/* reload hdr - skb might have been reallocated */ +	hdr = (void *)rx->skb->data; +  	data_len = skb->len - hdrlen - IEEE80211_GCMP_HDR_LEN - mic_len;  	if (!rx->sta || data_len < 0)  		return RX_DROP_UNUSABLE; diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h index da0aa720da6f..7b69d1ad8f3e 100644 --- a/net/netfilter/ipset/ip_set_hash_gen.h +++ b/net/netfilter/ipset/ip_set_hash_gen.h @@ -102,11 +102,11 @@ htable_size(u8 hbits)  {  	size_t hsize; -	/* We must fit both into u32 in jhash and size_t */ +	/* We must fit both into u32 in jhash and INT_MAX in kvmalloc_node() */  	if (hbits > 31)  		return 0;  	hsize = jhash_size(hbits); -	if ((((size_t)-1) - sizeof(struct htable)) / sizeof(struct hbucket *) +	if ((INT_MAX - sizeof(struct htable)) / sizeof(struct hbucket *)  	    < hsize)  		return 0; diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c index 85ca189bdc3d..de196dd95dcd 100644 --- a/net/netfilter/ipvs/ip_vs_conn.c +++ b/net/netfilter/ipvs/ip_vs_conn.c @@ -1368,6 +1368,10 @@ int __init ip_vs_conn_init(void)  	int idx;  	/* Compute size and mask */ +	if (ip_vs_conn_tab_bits < 8 || ip_vs_conn_tab_bits > 20) { +		pr_info("conn_tab_bits not in [8, 20]. Using default value\n"); +		ip_vs_conn_tab_bits = CONFIG_IP_VS_TAB_BITS; +	}  	ip_vs_conn_tab_size = 1 << ip_vs_conn_tab_bits;  	ip_vs_conn_tab_mask = ip_vs_conn_tab_size - 1; diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c index 7fd1104ba900..422fac2a4a3c 100644 --- a/net/netlabel/netlabel_cipso_v4.c +++ b/net/netlabel/netlabel_cipso_v4.c @@ -163,8 +163,8 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,  		return -ENOMEM;  	doi_def->map.std = kzalloc(sizeof(*doi_def->map.std), GFP_KERNEL);  	if (doi_def->map.std == NULL) { -		ret_val = -ENOMEM; -		goto add_std_failure; +		kfree(doi_def); +		return -ENOMEM;  	}  	doi_def->type = CIPSO_V4_MAP_TRANS; @@ -205,14 +205,14 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,  		}  	doi_def->map.std->lvl.local = kcalloc(doi_def->map.std->lvl.local_size,  					      sizeof(u32), -					      GFP_KERNEL); +					      GFP_KERNEL | __GFP_NOWARN);  	if (doi_def->map.std->lvl.local == NULL) {  		ret_val = -ENOMEM;  		goto add_std_failure;  	}  	doi_def->map.std->lvl.cipso = kcalloc(doi_def->map.std->lvl.cipso_size,  					      sizeof(u32), -					      GFP_KERNEL); +					      GFP_KERNEL | __GFP_NOWARN);  	if (doi_def->map.std->lvl.cipso == NULL) {  		ret_val = -ENOMEM;  		goto add_std_failure; @@ -279,7 +279,7 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,  		doi_def->map.std->cat.local = kcalloc(  					      doi_def->map.std->cat.local_size,  					      sizeof(u32), -					      GFP_KERNEL); +					      GFP_KERNEL | __GFP_NOWARN);  		if (doi_def->map.std->cat.local == NULL) {  			ret_val = -ENOMEM;  			goto add_std_failure; @@ -287,7 +287,7 @@ static int netlbl_cipsov4_add_std(struct genl_info *info,  		doi_def->map.std->cat.cipso = kcalloc(  					      doi_def->map.std->cat.cipso_size,  					      sizeof(u32), -					      GFP_KERNEL); +					      GFP_KERNEL | __GFP_NOWARN);  		if (doi_def->map.std->cat.cipso == NULL) {  			ret_val = -ENOMEM;  			goto add_std_failure; diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 1d79550f8024..8014479bdd8f 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -2385,13 +2385,15 @@ int nlmsg_notify(struct sock *sk, struct sk_buff *skb, u32 portid,  		/* errors reported via destination sk->sk_err, but propagate  		 * delivery errors if NETLINK_BROADCAST_ERROR flag is set */  		err = nlmsg_multicast(sk, skb, exclude_portid, group, flags); +		if (err == -ESRCH) +			err = 0;  	}  	if (report) {  		int err2;  		err2 = nlmsg_unicast(sk, skb, portid); -		if (!err || err == -ESRCH) +		if (!err)  			err = err2;  	} diff --git a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c index 664215448d09..40fd399a1035 100644 --- a/net/sctp/bind_addr.c +++ b/net/sctp/bind_addr.c @@ -284,19 +284,15 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list,  		rawaddr = (union sctp_addr_param *)raw_addr_list;  		af = sctp_get_af_specific(param_type2af(param->type)); -		if (unlikely(!af)) { +		if (unlikely(!af) || +		    !af->from_addr_param(&addr, rawaddr, htons(port), 0)) {  			retval = -EINVAL; -			sctp_bind_addr_clean(bp); -			break; +			goto out_err;  		} -		af->from_addr_param(&addr, rawaddr, htons(port), 0);  		retval = sctp_add_bind_addr(bp, &addr, SCTP_ADDR_SRC, gfp); -		if (retval) { -			/* Can't finish building the list, clean up. */ -			sctp_bind_addr_clean(bp); -			break; -		} +		if (retval) +			goto out_err;  		len = ntohs(param->length);  		addrs_len -= len; @@ -304,6 +300,12 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list,  	}  	return retval; + +out_err: +	if (retval) +		sctp_bind_addr_clean(bp); + +	return retval;  }  /******************************************************************** diff --git a/net/sctp/input.c b/net/sctp/input.c index 9dcc18db9918..3f0b8aafc21a 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -972,7 +972,8 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct net *net,  		if (!af)  			continue; -		af->from_addr_param(paddr, params.addr, sh->source, 0); +		if (!af->from_addr_param(paddr, params.addr, sh->source, 0)) +			continue;  		asoc = __sctp_lookup_association(net, laddr, paddr, &transport);  		if (asoc) @@ -1008,6 +1009,9 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(  	union sctp_addr_param *param;  	union sctp_addr paddr; +	if (ntohs(ch->length) < sizeof(*asconf) + sizeof(struct sctp_paramhdr)) +		return NULL; +  	/* Skip over the ADDIP header and find the Address parameter */  	param = (union sctp_addr_param *)(asconf + 1); @@ -1015,7 +1019,8 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(  	if (unlikely(!af))  		return NULL; -	af->from_addr_param(&paddr, param, peer_port, 0); +	if (af->from_addr_param(&paddr, param, peer_port, 0)) +		return NULL;  	return __sctp_lookup_association(net, laddr, &paddr, transportp);  } diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index 1a6849add0e3..62c729402a04 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c @@ -488,15 +488,20 @@ static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk)  }  /* Initialize a sctp_addr from an address parameter. */ -static void sctp_v6_from_addr_param(union sctp_addr *addr, +static bool sctp_v6_from_addr_param(union sctp_addr *addr,  				    union sctp_addr_param *param,  				    __be16 port, int iif)  { +	if (ntohs(param->v6.param_hdr.length) < sizeof(struct sctp_ipv6addr_param)) +		return false; +  	addr->v6.sin6_family = AF_INET6;  	addr->v6.sin6_port = port;  	addr->v6.sin6_flowinfo = 0; /* BUG */  	addr->v6.sin6_addr = param->v6.addr;  	addr->v6.sin6_scope_id = iif; + +	return true;  }  /* Initialize an address parameter from a sctp_addr and return the length diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 8c62792658b6..510b805aab2d 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -272,14 +272,19 @@ static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk)  }  /* Initialize a sctp_addr from an address parameter. */ -static void sctp_v4_from_addr_param(union sctp_addr *addr, +static bool sctp_v4_from_addr_param(union sctp_addr *addr,  				    union sctp_addr_param *param,  				    __be16 port, int iif)  { +	if (ntohs(param->v4.param_hdr.length) < sizeof(struct sctp_ipv4addr_param)) +		return false; +  	addr->v4.sin_family = AF_INET;  	addr->v4.sin_port = port;  	addr->v4.sin_addr.s_addr = param->v4.addr.s_addr;  	memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero)); + +	return true;  }  /* Initialize an address parameter from a sctp_addr and return the length diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index 9de03d2e5da9..d31e0d6c641b 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c @@ -2146,9 +2146,16 @@ static sctp_ierror_t sctp_verify_param(struct net *net,  		break;  	case SCTP_PARAM_SET_PRIMARY: -		if (net->sctp.addip_enable) -			break; -		goto fallthrough; +		if (!net->sctp.addip_enable) +			goto fallthrough; + +		if (ntohs(param.p->length) < sizeof(struct sctp_addip_param) + +					     sizeof(struct sctp_paramhdr)) { +			sctp_process_inv_paramlength(asoc, param.p, +						     chunk, err_chunk); +			retval = SCTP_IERROR_ABORT; +		} +		break;  	case SCTP_PARAM_HOST_NAME_ADDRESS:  		/* Tell the peer, we won't support this param.  */ @@ -2326,11 +2333,13 @@ int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,  	/* Process the initialization parameters.  */  	sctp_walk_params(param, peer_init, init_hdr.params) { -		if (!src_match && (param.p->type == SCTP_PARAM_IPV4_ADDRESS || -		    param.p->type == SCTP_PARAM_IPV6_ADDRESS)) { +		if (!src_match && +		    (param.p->type == SCTP_PARAM_IPV4_ADDRESS || +		     param.p->type == SCTP_PARAM_IPV6_ADDRESS)) {  			af = sctp_get_af_specific(param_type2af(param.p->type)); -			af->from_addr_param(&addr, param.addr, -					    chunk->sctp_hdr->source, 0); +			if (!af->from_addr_param(&addr, param.addr, +						 chunk->sctp_hdr->source, 0)) +				continue;  			if (sctp_cmp_addr_exact(sctp_source(chunk), &addr))  				src_match = 1;  		} @@ -2524,7 +2533,8 @@ static int sctp_process_param(struct sctp_association *asoc,  			break;  do_addr_param:  		af = sctp_get_af_specific(param_type2af(param.p->type)); -		af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0); +		if (!af->from_addr_param(&addr, param.addr, htons(asoc->peer.port), 0)) +			break;  		scope = sctp_scope(peer_addr);  		if (sctp_in_scope(net, &addr, scope))  			if (!sctp_assoc_add_peer(asoc, &addr, gfp, SCTP_UNCONFIRMED)) @@ -2617,15 +2627,13 @@ do_addr_param:  		addr_param = param.v + sizeof(sctp_addip_param_t);  		af = sctp_get_af_specific(param_type2af(addr_param->p.type)); -		if (af == NULL) +		if (!af)  			break; -		af->from_addr_param(&addr, addr_param, -				    htons(asoc->peer.port), 0); +		if (!af->from_addr_param(&addr, addr_param, +					 htons(asoc->peer.port), 0)) +			break; -		/* if the address is invalid, we can't process it. -		 * XXX: see spec for what to do. -		 */  		if (!af->addr_valid(&addr, NULL, NULL))  			break; @@ -3035,7 +3043,8 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,  	if (unlikely(!af))  		return SCTP_ERROR_DNS_FAILED; -	af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0); +	if (!af->from_addr_param(&addr, addr_param, htons(asoc->peer.port), 0)) +		return SCTP_ERROR_DNS_FAILED;  	/* ADDIP 4.2.1  This parameter MUST NOT contain a broadcast  	 * or multicast address. @@ -3301,7 +3310,8 @@ static void sctp_asconf_param_success(struct sctp_association *asoc,  	/* We have checked the packet before, so we do not check again.	*/  	af = sctp_get_af_specific(param_type2af(addr_param->p.type)); -	af->from_addr_param(&addr, addr_param, htons(bp->port), 0); +	if (!af->from_addr_param(&addr, addr_param, htons(bp->port), 0)) +		return;  	switch (asconf_param->param_hdr.type) {  	case SCTP_PARAM_ADD_IP: diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index bb8b0ef5de82..daf0c1ea3917 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c @@ -1845,7 +1845,7 @@ gss_svc_init_net(struct net *net)  		goto out2;  	return 0;  out2: -	destroy_use_gss_proxy_proc_entry(net); +	rsi_cache_destroy_net(net);  out1:  	rsc_cache_destroy_net(net);  	return rv; diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 9d15bb865eea..9d380d55ea1c 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -1757,7 +1757,7 @@ static int tipc_backlog_rcv(struct sock *sk, struct sk_buff *skb)  static void tipc_sk_enqueue(struct sk_buff_head *inputq, struct sock *sk,  			    u32 dport, struct sk_buff_head *xmitq)  { -	unsigned long time_limit = jiffies + 2; +	unsigned long time_limit = jiffies + usecs_to_jiffies(20000);  	struct sk_buff *skb;  	unsigned int lim;  	atomic_t *dcnt; diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 79687d5a95ac..2c09eadfa90c 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -594,20 +594,42 @@ static void unix_release_sock(struct sock *sk, int embrion)  static void init_peercred(struct sock *sk)  { -	put_pid(sk->sk_peer_pid); -	if (sk->sk_peer_cred) -		put_cred(sk->sk_peer_cred); +	const struct cred *old_cred; +	struct pid *old_pid; + +	spin_lock(&sk->sk_peer_lock); +	old_pid = sk->sk_peer_pid; +	old_cred = sk->sk_peer_cred;  	sk->sk_peer_pid  = get_pid(task_tgid(current));  	sk->sk_peer_cred = get_current_cred(); +	spin_unlock(&sk->sk_peer_lock); + +	put_pid(old_pid); +	put_cred(old_cred);  }  static void copy_peercred(struct sock *sk, struct sock *peersk)  { -	put_pid(sk->sk_peer_pid); -	if (sk->sk_peer_cred) -		put_cred(sk->sk_peer_cred); +	const struct cred *old_cred; +	struct pid *old_pid; + +	if (sk < peersk) { +		spin_lock(&sk->sk_peer_lock); +		spin_lock_nested(&peersk->sk_peer_lock, SINGLE_DEPTH_NESTING); +	} else { +		spin_lock(&peersk->sk_peer_lock); +		spin_lock_nested(&sk->sk_peer_lock, SINGLE_DEPTH_NESTING); +	} +	old_pid = sk->sk_peer_pid; +	old_cred = sk->sk_peer_cred;  	sk->sk_peer_pid  = get_pid(peersk->sk_peer_pid);  	sk->sk_peer_cred = get_cred(peersk->sk_peer_cred); + +	spin_unlock(&sk->sk_peer_lock); +	spin_unlock(&peersk->sk_peer_lock); + +	put_pid(old_pid); +	put_cred(old_cred);  }  static int unix_listen(struct socket *sock, int backlog) @@ -2700,7 +2722,7 @@ static unsigned int unix_dgram_poll(struct file *file, struct socket *sock,  		other = unix_peer(sk);  		if (other && unix_peer(other) != sk && -		    unix_recvq_full(other) && +		    unix_recvq_full_lockless(other) &&  		    unix_dgram_peer_wake_me(sk, other))  			writable = 0; diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c index 0df316c62005..84f38b694242 100644 --- a/security/smack/smack_access.c +++ b/security/smack/smack_access.c @@ -90,23 +90,22 @@ int log_policy = SMACK_AUDIT_DENIED;  int smk_access_entry(char *subject_label, char *object_label,  			struct list_head *rule_list)  { -	int may = -ENOENT;  	struct smack_rule *srp;  	list_for_each_entry_rcu(srp, rule_list, list) {  		if (srp->smk_object->smk_known == object_label &&  		    srp->smk_subject->smk_known == subject_label) { -			may = srp->smk_access; -			break; +			int may = srp->smk_access; +			/* +			 * MAY_WRITE implies MAY_LOCK. +			 */ +			if ((may & MAY_WRITE) == MAY_WRITE) +				may |= MAY_LOCK; +			return may;  		}  	} -	/* -	 * MAY_WRITE implies MAY_LOCK. -	 */ -	if ((may & MAY_WRITE) == MAY_WRITE) -		may |= MAY_LOCK; -	return may; +	return -ENOENT;  }  /** diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index ef5743af33de..dfb0e496a5b0 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -1845,7 +1845,7 @@ static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream,  		channels = params_channels(params);  		frame_size = snd_pcm_format_size(format, channels);  		if (frame_size > 0) -			params->fifo_size /= (unsigned)frame_size; +			params->fifo_size /= frame_size;  	}  	return 0;  } diff --git a/tools/usb/testusb.c b/tools/usb/testusb.c index 0692d99b6d8f..18c895654e76 100644 --- a/tools/usb/testusb.c +++ b/tools/usb/testusb.c @@ -278,12 +278,6 @@ nomem:  	}  	entry->ifnum = ifnum; - -	/* FIXME update USBDEVFS_CONNECTINFO so it tells about high speed etc */ - -	fprintf(stderr, "%s speed\t%s\t%u\n", -		speed(entry->speed), entry->name, entry->ifnum); -  	entry->next = testdevs;  	testdevs = entry;  	return 0; @@ -312,6 +306,14 @@ static void *handle_testdev (void *arg)  		return 0;  	} +	status  =  ioctl(fd, USBDEVFS_GET_SPEED, NULL); +	if (status < 0) +		fprintf(stderr, "USBDEVFS_GET_SPEED failed %d\n", status); +	else +		dev->speed = status; +	fprintf(stderr, "%s speed\t%s\t%u\n", +			speed(dev->speed), dev->name, dev->ifnum); +  restart:  	for (i = 0; i < TEST_CASES; i++) {  		if (dev->test != -1 && dev->test != i) | 
