commit: aa5cdd5184de37f8b72ce9d2356392a943ec26f7 Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> AuthorDate: Wed Oct 15 11:36:08 2014 +0000 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> CommitDate: Wed Oct 15 11:36:08 2014 +0000 URL: http://sources.gentoo.org/gitweb/?p=proj/linux-patches.git;a=commit;h=aa5cdd51
Linux patch 3.17.1 --- 0000_README | 4 + 1000_linux-3.17.1.patch | 1137 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1141 insertions(+) diff --git a/0000_README b/0000_README index 6d04d36..82731ea 100644 --- a/0000_README +++ b/0000_README @@ -43,6 +43,10 @@ EXPERIMENTAL Individual Patch Descriptions: -------------------------------------------------------------------------- +Patch: 1000_linux-3.17.1.patch +From: http://www.kernel.org +Desc: Linux 3.17.1 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1000_linux-3.17.1.patch b/1000_linux-3.17.1.patch new file mode 100644 index 0000000..bee4add --- /dev/null +++ b/1000_linux-3.17.1.patch @@ -0,0 +1,1137 @@ +diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt +index 10d51c2f10d7..1edd5fdc629d 100644 +--- a/Documentation/kernel-parameters.txt ++++ b/Documentation/kernel-parameters.txt +@@ -3522,6 +3522,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. + READ_DISC_INFO command); + e = NO_READ_CAPACITY_16 (don't use + READ_CAPACITY_16 command); ++ f = NO_REPORT_OPCODES (don't use report opcodes ++ command, uas only); + h = CAPACITY_HEURISTICS (decrease the + reported device capacity by one + sector if the number is odd); +@@ -3541,6 +3543,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. + bogus residue values); + s = SINGLE_LUN (the device has only one + Logical Unit); ++ t = NO_ATA_1X (don't allow ATA(12) and ATA(16) ++ commands, uas only); + u = IGNORE_UAS (don't bind to the uas driver); + w = NO_WP_DETECT (don't test whether the + medium is write-protected). +diff --git a/Makefile b/Makefile +index b77de27e58fc..46694098725d 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,6 +1,6 @@ + VERSION = 3 + PATCHLEVEL = 17 +-SUBLEVEL = 0 ++SUBLEVEL = 1 + EXTRAVERSION = + NAME = Shuffling Zombie Juror + +diff --git a/arch/alpha/include/asm/Kbuild b/arch/alpha/include/asm/Kbuild +index e858aa0ad8af..a52cbf178c3a 100644 +--- a/arch/alpha/include/asm/Kbuild ++++ b/arch/alpha/include/asm/Kbuild +@@ -4,6 +4,7 @@ generic-y += clkdev.h + generic-y += cputime.h + generic-y += exec.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += mcs_spinlock.h + generic-y += preempt.h + generic-y += scatterlist.h +diff --git a/arch/arc/include/asm/Kbuild b/arch/arc/include/asm/Kbuild +index e76fd79f32b0..b8fffc1a2ac2 100644 +--- a/arch/arc/include/asm/Kbuild ++++ b/arch/arc/include/asm/Kbuild +@@ -18,6 +18,7 @@ generic-y += ioctl.h + generic-y += ioctls.h + generic-y += ipcbuf.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kmap_types.h + generic-y += kvm_para.h + generic-y += local.h +diff --git a/arch/arm/include/asm/irq_work.h b/arch/arm/include/asm/irq_work.h +new file mode 100644 +index 000000000000..712d03e5973a +--- /dev/null ++++ b/arch/arm/include/asm/irq_work.h +@@ -0,0 +1,11 @@ ++#ifndef __ASM_ARM_IRQ_WORK_H ++#define __ASM_ARM_IRQ_WORK_H ++ ++#include <asm/smp_plat.h> ++ ++static inline bool arch_irq_work_has_interrupt(void) ++{ ++ return is_smp(); ++} ++ ++#endif /* _ASM_ARM_IRQ_WORK_H */ +diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c +index 9388a3d479e1..bbe22fcb78f6 100644 +--- a/arch/arm/kernel/smp.c ++++ b/arch/arm/kernel/smp.c +@@ -503,7 +503,7 @@ void arch_send_call_function_single_ipi(int cpu) + #ifdef CONFIG_IRQ_WORK + void arch_irq_work_raise(void) + { +- if (is_smp()) ++ if (arch_irq_work_has_interrupt()) + smp_cross_call(cpumask_of(smp_processor_id()), IPI_IRQ_WORK); + } + #endif +diff --git a/arch/arm64/include/asm/Kbuild b/arch/arm64/include/asm/Kbuild +index 0b3fcf86e6ba..c1968475cc4e 100644 +--- a/arch/arm64/include/asm/Kbuild ++++ b/arch/arm64/include/asm/Kbuild +@@ -9,8 +9,8 @@ generic-y += current.h + generic-y += delay.h + generic-y += div64.h + generic-y += dma.h +-generic-y += emergency-restart.h + generic-y += early_ioremap.h ++generic-y += emergency-restart.h + generic-y += errno.h + generic-y += ftrace.h + generic-y += hash.h +diff --git a/arch/arm64/include/asm/irq_work.h b/arch/arm64/include/asm/irq_work.h +new file mode 100644 +index 000000000000..8e24ef3f7c82 +--- /dev/null ++++ b/arch/arm64/include/asm/irq_work.h +@@ -0,0 +1,11 @@ ++#ifndef __ASM_IRQ_WORK_H ++#define __ASM_IRQ_WORK_H ++ ++#include <asm/smp.h> ++ ++static inline bool arch_irq_work_has_interrupt(void) ++{ ++ return !!__smp_cross_call; ++} ++ ++#endif /* __ASM_IRQ_WORK_H */ +diff --git a/arch/arm64/include/asm/smp.h b/arch/arm64/include/asm/smp.h +index a498f2cd2c2a..780f82c827b6 100644 +--- a/arch/arm64/include/asm/smp.h ++++ b/arch/arm64/include/asm/smp.h +@@ -48,6 +48,8 @@ extern void smp_init_cpus(void); + */ + extern void set_smp_cross_call(void (*)(const struct cpumask *, unsigned int)); + ++extern void (*__smp_cross_call)(const struct cpumask *, unsigned int); ++ + /* + * Called from the secondary holding pen, this is the secondary CPU entry point. + */ +diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c +index 474339718105..b06d1d90ee8c 100644 +--- a/arch/arm64/kernel/smp.c ++++ b/arch/arm64/kernel/smp.c +@@ -470,7 +470,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) + } + } + +-static void (*__smp_cross_call)(const struct cpumask *, unsigned int); ++void (*__smp_cross_call)(const struct cpumask *, unsigned int); + + void __init set_smp_cross_call(void (*fn)(const struct cpumask *, unsigned int)) + { +diff --git a/arch/avr32/include/asm/Kbuild b/arch/avr32/include/asm/Kbuild +index 00a0f3ccd6eb..2a71b1cb9848 100644 +--- a/arch/avr32/include/asm/Kbuild ++++ b/arch/avr32/include/asm/Kbuild +@@ -9,6 +9,7 @@ generic-y += exec.h + generic-y += futex.h + generic-y += hash.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += local.h + generic-y += local64.h + generic-y += mcs_spinlock.h +diff --git a/arch/blackfin/include/asm/Kbuild b/arch/blackfin/include/asm/Kbuild +index 0d93b9a79ca9..46ed6bb9c679 100644 +--- a/arch/blackfin/include/asm/Kbuild ++++ b/arch/blackfin/include/asm/Kbuild +@@ -15,6 +15,7 @@ generic-y += hw_irq.h + generic-y += ioctl.h + generic-y += ipcbuf.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kdebug.h + generic-y += kmap_types.h + generic-y += kvm_para.h +diff --git a/arch/c6x/include/asm/Kbuild b/arch/c6x/include/asm/Kbuild +index 8dbdce8421b0..e77e0c1dbe75 100644 +--- a/arch/c6x/include/asm/Kbuild ++++ b/arch/c6x/include/asm/Kbuild +@@ -22,6 +22,7 @@ generic-y += ioctl.h + generic-y += ioctls.h + generic-y += ipcbuf.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kdebug.h + generic-y += kmap_types.h + generic-y += local.h +diff --git a/arch/cris/include/asm/Kbuild b/arch/cris/include/asm/Kbuild +index 31742dfadff9..802b94c4ca86 100644 +--- a/arch/cris/include/asm/Kbuild ++++ b/arch/cris/include/asm/Kbuild +@@ -8,6 +8,7 @@ generic-y += clkdev.h + generic-y += cputime.h + generic-y += exec.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += kvm_para.h + generic-y += linkage.h + generic-y += mcs_spinlock.h +diff --git a/arch/frv/include/asm/Kbuild b/arch/frv/include/asm/Kbuild +index 5b73921b6e9d..3caf05cabfc5 100644 +--- a/arch/frv/include/asm/Kbuild ++++ b/arch/frv/include/asm/Kbuild +@@ -3,6 +3,7 @@ generic-y += clkdev.h + generic-y += cputime.h + generic-y += exec.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += mcs_spinlock.h + generic-y += preempt.h + generic-y += scatterlist.h +diff --git a/arch/hexagon/include/asm/Kbuild b/arch/hexagon/include/asm/Kbuild +index 0e69796b58c7..5f234a5a2320 100644 +--- a/arch/hexagon/include/asm/Kbuild ++++ b/arch/hexagon/include/asm/Kbuild +@@ -23,6 +23,7 @@ generic-y += ioctls.h + generic-y += iomap.h + generic-y += ipcbuf.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kdebug.h + generic-y += kmap_types.h + generic-y += local.h +diff --git a/arch/ia64/include/asm/Kbuild b/arch/ia64/include/asm/Kbuild +index e8317d2d6c8d..747320be9d0e 100644 +--- a/arch/ia64/include/asm/Kbuild ++++ b/arch/ia64/include/asm/Kbuild +@@ -2,6 +2,7 @@ + generic-y += clkdev.h + generic-y += exec.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += kvm_para.h + generic-y += mcs_spinlock.h + generic-y += preempt.h +diff --git a/arch/m32r/include/asm/Kbuild b/arch/m32r/include/asm/Kbuild +index accc10a3dc78..e02448b0648b 100644 +--- a/arch/m32r/include/asm/Kbuild ++++ b/arch/m32r/include/asm/Kbuild +@@ -3,6 +3,7 @@ generic-y += clkdev.h + generic-y += cputime.h + generic-y += exec.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += mcs_spinlock.h + generic-y += module.h + generic-y += preempt.h +diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild +index c67c94a2d672..dbaf9f3065e8 100644 +--- a/arch/m68k/include/asm/Kbuild ++++ b/arch/m68k/include/asm/Kbuild +@@ -11,6 +11,7 @@ generic-y += hw_irq.h + generic-y += ioctl.h + generic-y += ipcbuf.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kdebug.h + generic-y += kmap_types.h + generic-y += kvm_para.h +diff --git a/arch/metag/include/asm/Kbuild b/arch/metag/include/asm/Kbuild +index c29ead89a317..7b8111c8f937 100644 +--- a/arch/metag/include/asm/Kbuild ++++ b/arch/metag/include/asm/Kbuild +@@ -19,6 +19,7 @@ generic-y += ioctl.h + generic-y += ioctls.h + generic-y += ipcbuf.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kdebug.h + generic-y += kmap_types.h + generic-y += kvm_para.h +diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild +index 27a3acda6c19..448143b8cabd 100644 +--- a/arch/microblaze/include/asm/Kbuild ++++ b/arch/microblaze/include/asm/Kbuild +@@ -5,6 +5,7 @@ generic-y += cputime.h + generic-y += device.h + generic-y += exec.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += mcs_spinlock.h + generic-y += preempt.h + generic-y += scatterlist.h +diff --git a/arch/mips/include/asm/Kbuild b/arch/mips/include/asm/Kbuild +index 335e5290ec75..57012ef1f51e 100644 +--- a/arch/mips/include/asm/Kbuild ++++ b/arch/mips/include/asm/Kbuild +@@ -3,6 +3,7 @@ generic-y += cputime.h + generic-y += current.h + generic-y += emergency-restart.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += mutex.h +diff --git a/arch/mn10300/include/asm/Kbuild b/arch/mn10300/include/asm/Kbuild +index ecbd6676bd33..77eb1a68d13b 100644 +--- a/arch/mn10300/include/asm/Kbuild ++++ b/arch/mn10300/include/asm/Kbuild +@@ -4,6 +4,7 @@ generic-y += clkdev.h + generic-y += cputime.h + generic-y += exec.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += mcs_spinlock.h + generic-y += preempt.h + generic-y += scatterlist.h +diff --git a/arch/openrisc/include/asm/Kbuild b/arch/openrisc/include/asm/Kbuild +index 480af0d9c2f5..89b61d7dc790 100644 +--- a/arch/openrisc/include/asm/Kbuild ++++ b/arch/openrisc/include/asm/Kbuild +@@ -31,6 +31,7 @@ generic-y += ioctl.h + generic-y += ioctls.h + generic-y += ipcbuf.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kdebug.h + generic-y += kmap_types.h + generic-y += kvm_para.h +diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild +index ecf25e6678ad..ffb024b8423f 100644 +--- a/arch/parisc/include/asm/Kbuild ++++ b/arch/parisc/include/asm/Kbuild +@@ -10,6 +10,7 @@ generic-y += exec.h + generic-y += hash.h + generic-y += hw_irq.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kdebug.h + generic-y += kvm_para.h + generic-y += local.h +diff --git a/arch/powerpc/include/asm/Kbuild b/arch/powerpc/include/asm/Kbuild +index 7f23f162ce9c..31e8f59aff38 100644 +--- a/arch/powerpc/include/asm/Kbuild ++++ b/arch/powerpc/include/asm/Kbuild +@@ -1,6 +1,7 @@ + + generic-y += clkdev.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += mcs_spinlock.h + generic-y += preempt.h + generic-y += rwsem.h +diff --git a/arch/s390/include/asm/Kbuild b/arch/s390/include/asm/Kbuild +index b3fea0722ff1..773f86676588 100644 +--- a/arch/s390/include/asm/Kbuild ++++ b/arch/s390/include/asm/Kbuild +@@ -2,6 +2,7 @@ + + generic-y += clkdev.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += mcs_spinlock.h + generic-y += preempt.h + generic-y += scatterlist.h +diff --git a/arch/score/include/asm/Kbuild b/arch/score/include/asm/Kbuild +index aad209199f7e..1909d2a5b82f 100644 +--- a/arch/score/include/asm/Kbuild ++++ b/arch/score/include/asm/Kbuild +@@ -6,6 +6,7 @@ generic-y += barrier.h + generic-y += clkdev.h + generic-y += cputime.h + generic-y += hash.h ++generic-y += irq_work.h + generic-y += mcs_spinlock.h + generic-y += preempt.h + generic-y += scatterlist.h +diff --git a/arch/sh/include/asm/Kbuild b/arch/sh/include/asm/Kbuild +index c19e47dacb31..5a6c9acff0d2 100644 +--- a/arch/sh/include/asm/Kbuild ++++ b/arch/sh/include/asm/Kbuild +@@ -12,6 +12,7 @@ generic-y += hash.h + generic-y += ioctl.h + generic-y += ipcbuf.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kvm_para.h + generic-y += local.h + generic-y += local64.h +diff --git a/arch/sparc/include/asm/Kbuild b/arch/sparc/include/asm/Kbuild +index cdd1b447bb6c..f5f94ce1692c 100644 +--- a/arch/sparc/include/asm/Kbuild ++++ b/arch/sparc/include/asm/Kbuild +@@ -8,6 +8,7 @@ generic-y += emergency-restart.h + generic-y += exec.h + generic-y += hash.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += linkage.h + generic-y += local.h + generic-y += local64.h +diff --git a/arch/tile/include/asm/Kbuild b/arch/tile/include/asm/Kbuild +index 0aa5675e7025..e6462b8a6284 100644 +--- a/arch/tile/include/asm/Kbuild ++++ b/arch/tile/include/asm/Kbuild +@@ -17,6 +17,7 @@ generic-y += ioctl.h + generic-y += ioctls.h + generic-y += ipcbuf.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += local.h + generic-y += local64.h + generic-y += mcs_spinlock.h +diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild +index 7bd64aa2e94a..244b12c8cb39 100644 +--- a/arch/um/include/asm/Kbuild ++++ b/arch/um/include/asm/Kbuild +@@ -14,6 +14,7 @@ generic-y += hash.h + generic-y += hw_irq.h + generic-y += io.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kdebug.h + generic-y += mcs_spinlock.h + generic-y += mutex.h +diff --git a/arch/unicore32/include/asm/Kbuild b/arch/unicore32/include/asm/Kbuild +index 1e5fb872a4aa..5a2bb53faa42 100644 +--- a/arch/unicore32/include/asm/Kbuild ++++ b/arch/unicore32/include/asm/Kbuild +@@ -22,6 +22,7 @@ generic-y += ioctl.h + generic-y += ioctls.h + generic-y += ipcbuf.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kdebug.h + generic-y += kmap_types.h + generic-y += local.h +diff --git a/arch/x86/include/asm/irq_work.h b/arch/x86/include/asm/irq_work.h +new file mode 100644 +index 000000000000..78162f8e248b +--- /dev/null ++++ b/arch/x86/include/asm/irq_work.h +@@ -0,0 +1,11 @@ ++#ifndef _ASM_IRQ_WORK_H ++#define _ASM_IRQ_WORK_H ++ ++#include <asm/processor.h> ++ ++static inline bool arch_irq_work_has_interrupt(void) ++{ ++ return cpu_has_apic; ++} ++ ++#endif /* _ASM_IRQ_WORK_H */ +diff --git a/arch/x86/kernel/irq_work.c b/arch/x86/kernel/irq_work.c +index 1de84e3ab4e0..15d741ddfeeb 100644 +--- a/arch/x86/kernel/irq_work.c ++++ b/arch/x86/kernel/irq_work.c +@@ -41,7 +41,7 @@ __visible void smp_trace_irq_work_interrupt(struct pt_regs *regs) + void arch_irq_work_raise(void) + { + #ifdef CONFIG_X86_LOCAL_APIC +- if (!cpu_has_apic) ++ if (!arch_irq_work_has_interrupt()) + return; + + apic->send_IPI_self(IRQ_WORK_VECTOR); +diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild +index c3d20ba6eb86..105d38922c44 100644 +--- a/arch/xtensa/include/asm/Kbuild ++++ b/arch/xtensa/include/asm/Kbuild +@@ -12,6 +12,7 @@ generic-y += hardirq.h + generic-y += hash.h + generic-y += ioctl.h + generic-y += irq_regs.h ++generic-y += irq_work.h + generic-y += kdebug.h + generic-y += kmap_types.h + generic-y += kvm_para.h +diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c +index f3e7b9f894cd..6f674906c64c 100644 +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -4261,10 +4261,10 @@ static unsigned long ata_dev_blacklisted(const struct ata_device *dev) + ata_id_c_string(dev->id, model_rev, ATA_ID_FW_REV, sizeof(model_rev)); + + while (ad->model_num) { +- if (glob_match(model_num, ad->model_num)) { ++ if (glob_match(ad->model_num, model_num)) { + if (ad->model_rev == NULL) + return ad->horkage; +- if (glob_match(model_rev, ad->model_rev)) ++ if (glob_match(ad->model_rev, model_rev)) + return ad->horkage; + } + ad++; +diff --git a/drivers/base/node.c b/drivers/base/node.c +index c6d3ae05f1ca..d51c49c9bafa 100644 +--- a/drivers/base/node.c ++++ b/drivers/base/node.c +@@ -603,7 +603,6 @@ void unregister_one_node(int nid) + return; + + unregister_node(node_devices[nid]); +- kfree(node_devices[nid]); + node_devices[nid] = NULL; + } + +diff --git a/drivers/crypto/caam/caamhash.c b/drivers/crypto/caam/caamhash.c +index b464d03ebf40..e9cc753d5095 100644 +--- a/drivers/crypto/caam/caamhash.c ++++ b/drivers/crypto/caam/caamhash.c +@@ -1413,9 +1413,9 @@ static int ahash_update_first(struct ahash_request *req) + struct device *jrdev = ctx->jrdev; + gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG | + CRYPTO_TFM_REQ_MAY_SLEEP)) ? GFP_KERNEL : GFP_ATOMIC; +- u8 *next_buf = state->buf_0 + state->current_buf * +- CAAM_MAX_HASH_BLOCK_SIZE; +- int *next_buflen = &state->buflen_0 + state->current_buf; ++ u8 *next_buf = state->current_buf ? state->buf_1 : state->buf_0; ++ int *next_buflen = state->current_buf ? ++ &state->buflen_1 : &state->buflen_0; + int to_hash; + u32 *sh_desc = ctx->sh_desc_update_first, *desc; + dma_addr_t ptr = ctx->sh_desc_update_first_dma; +diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c +index 8ca49f04acec..0a3108b3c267 100644 +--- a/drivers/net/ethernet/3com/3c59x.c ++++ b/drivers/net/ethernet/3com/3c59x.c +@@ -2214,7 +2214,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev) + } + } + #else +- dma_addr = cpu_to_le32(pci_map_single(VORTEX_PCI(vp), skb->data, skb->len, PCI_DMA_TODEVICE)); ++ dma_addr = pci_map_single(VORTEX_PCI(vp), skb->data, skb->len, PCI_DMA_TODEVICE); + if (dma_mapping_error(&VORTEX_PCI(vp)->dev, dma_addr)) + goto out_dma_err; + vp->tx_ring[entry].addr = cpu_to_le32(dma_addr); +diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c +index d9b9170ed2fc..71068d7d930d 100644 +--- a/drivers/net/ethernet/broadcom/bcmsysport.c ++++ b/drivers/net/ethernet/broadcom/bcmsysport.c +@@ -848,7 +848,8 @@ static irqreturn_t bcm_sysport_wol_isr(int irq, void *dev_id) + return IRQ_HANDLED; + } + +-static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev) ++static struct sk_buff *bcm_sysport_insert_tsb(struct sk_buff *skb, ++ struct net_device *dev) + { + struct sk_buff *nskb; + struct bcm_tsb *tsb; +@@ -864,7 +865,7 @@ static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev) + if (!nskb) { + dev->stats.tx_errors++; + dev->stats.tx_dropped++; +- return -ENOMEM; ++ return NULL; + } + skb = nskb; + } +@@ -883,7 +884,7 @@ static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev) + ip_proto = ipv6_hdr(skb)->nexthdr; + break; + default: +- return 0; ++ return skb; + } + + /* Get the checksum offset and the L4 (transport) offset */ +@@ -902,7 +903,7 @@ static int bcm_sysport_insert_tsb(struct sk_buff *skb, struct net_device *dev) + tsb->l4_ptr_dest_map = csum_info; + } + +- return 0; ++ return skb; + } + + static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb, +@@ -936,8 +937,8 @@ static netdev_tx_t bcm_sysport_xmit(struct sk_buff *skb, + + /* Insert TSB and checksum infos */ + if (priv->tsb_en) { +- ret = bcm_sysport_insert_tsb(skb, dev); +- if (ret) { ++ skb = bcm_sysport_insert_tsb(skb, dev); ++ if (!skb) { + ret = NETDEV_TX_OK; + goto out; + } +diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c +index 66979cf7fca6..da2d34688370 100644 +--- a/drivers/net/hyperv/netvsc.c ++++ b/drivers/net/hyperv/netvsc.c +@@ -705,6 +705,7 @@ int netvsc_send(struct hv_device *device, + unsigned int section_index = NETVSC_INVALID_INDEX; + u32 msg_size = 0; + struct sk_buff *skb; ++ u16 q_idx = packet->q_idx; + + + net_device = get_outbound_net_device(device); +@@ -769,24 +770,24 @@ int netvsc_send(struct hv_device *device, + + if (ret == 0) { + atomic_inc(&net_device->num_outstanding_sends); +- atomic_inc(&net_device->queue_sends[packet->q_idx]); ++ atomic_inc(&net_device->queue_sends[q_idx]); + + if (hv_ringbuf_avail_percent(&out_channel->outbound) < + RING_AVAIL_PERCENT_LOWATER) { + netif_tx_stop_queue(netdev_get_tx_queue( +- ndev, packet->q_idx)); ++ ndev, q_idx)); + + if (atomic_read(&net_device-> +- queue_sends[packet->q_idx]) < 1) ++ queue_sends[q_idx]) < 1) + netif_tx_wake_queue(netdev_get_tx_queue( +- ndev, packet->q_idx)); ++ ndev, q_idx)); + } + } else if (ret == -EAGAIN) { + netif_tx_stop_queue(netdev_get_tx_queue( +- ndev, packet->q_idx)); +- if (atomic_read(&net_device->queue_sends[packet->q_idx]) < 1) { ++ ndev, q_idx)); ++ if (atomic_read(&net_device->queue_sends[q_idx]) < 1) { + netif_tx_wake_queue(netdev_get_tx_queue( +- ndev, packet->q_idx)); ++ ndev, q_idx)); + ret = -ENOSPC; + } + } else { +diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c +index ef10302ec936..1f76c2ea53f2 100644 +--- a/drivers/net/team/team.c ++++ b/drivers/net/team/team.c +@@ -647,7 +647,7 @@ static void team_notify_peers(struct team *team) + { + if (!team->notify_peers.count || !netif_running(team->dev)) + return; +- atomic_set(&team->notify_peers.count_pending, team->notify_peers.count); ++ atomic_add(team->notify_peers.count, &team->notify_peers.count_pending); + schedule_delayed_work(&team->notify_peers.dw, 0); + } + +@@ -687,7 +687,7 @@ static void team_mcast_rejoin(struct team *team) + { + if (!team->mcast_rejoin.count || !netif_running(team->dev)) + return; +- atomic_set(&team->mcast_rejoin.count_pending, team->mcast_rejoin.count); ++ atomic_add(team->mcast_rejoin.count, &team->mcast_rejoin.count_pending); + schedule_delayed_work(&team->mcast_rejoin.dw, 0); + } + +diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c +index 2a412fa3b338..af91077d3513 100644 +--- a/drivers/pci/hotplug/pciehp_hpc.c ++++ b/drivers/pci/hotplug/pciehp_hpc.c +@@ -173,7 +173,7 @@ static void pcie_wait_cmd(struct controller *ctrl) + if (!rc) + ctrl_info(ctrl, "Timeout on hotplug command %#010x (issued %u msec ago)\n", + ctrl->slot_ctrl, +- jiffies_to_msecs(now - ctrl->cmd_started)); ++ jiffies_to_msecs(jiffies - ctrl->cmd_started)); + } + + /** +diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c +index 61830b1792eb..14d3e6be8800 100644 +--- a/drivers/tty/serial/8250/8250_pci.c ++++ b/drivers/tty/serial/8250/8250_pci.c +@@ -1788,6 +1788,7 @@ pci_wch_ch353_setup(struct serial_private *priv, + #define PCI_DEVICE_ID_COMMTECH_4222PCIE 0x0022 + #define PCI_DEVICE_ID_BROADCOM_TRUMANAGE 0x160a + #define PCI_DEVICE_ID_AMCC_ADDIDATA_APCI7800 0x818e ++#define PCI_DEVICE_ID_INTEL_QRK_UART 0x0936 + + #define PCI_VENDOR_ID_SUNIX 0x1fd4 + #define PCI_DEVICE_ID_SUNIX_1999 0x1999 +@@ -1898,6 +1899,13 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { + .subdevice = PCI_ANY_ID, + .setup = byt_serial_setup, + }, ++ { ++ .vendor = PCI_VENDOR_ID_INTEL, ++ .device = PCI_DEVICE_ID_INTEL_QRK_UART, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .setup = pci_default_setup, ++ }, + /* + * ITE + */ +@@ -2740,6 +2748,7 @@ enum pci_board_num_t { + pbn_ADDIDATA_PCIe_8_3906250, + pbn_ce4100_1_115200, + pbn_byt, ++ pbn_qrk, + pbn_omegapci, + pbn_NETMOS9900_2s_115200, + pbn_brcm_trumanage, +@@ -3490,6 +3499,12 @@ static struct pciserial_board pci_boards[] = { + .uart_offset = 0x80, + .reg_shift = 2, + }, ++ [pbn_qrk] = { ++ .flags = FL_BASE0, ++ .num_ports = 1, ++ .base_baud = 2764800, ++ .reg_shift = 2, ++ }, + [pbn_omegapci] = { + .flags = FL_BASE0, + .num_ports = 8, +@@ -5192,6 +5207,12 @@ static struct pci_device_id serial_pci_tbl[] = { + pbn_byt }, + + /* ++ * Intel Quark x1000 ++ */ ++ { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_QRK_UART, ++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, ++ pbn_qrk }, ++ /* + * Cronyx Omega PCI + */ + { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_CRONYX_OMEGA, +diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c +index d481c99a20d7..dc849154f9de 100644 +--- a/drivers/usb/core/hub.c ++++ b/drivers/usb/core/hub.c +@@ -1983,8 +1983,10 @@ void usb_set_device_state(struct usb_device *udev, + || new_state == USB_STATE_SUSPENDED) + ; /* No change to wakeup settings */ + else if (new_state == USB_STATE_CONFIGURED) +- wakeup = udev->actconfig->desc.bmAttributes +- & USB_CONFIG_ATT_WAKEUP; ++ wakeup = (udev->quirks & ++ USB_QUIRK_IGNORE_REMOTE_WAKEUP) ? 0 : ++ udev->actconfig->desc.bmAttributes & ++ USB_CONFIG_ATT_WAKEUP; + else + wakeup = 0; + } +diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c +index bae636e2a1a3..814e712655e4 100644 +--- a/drivers/usb/core/quirks.c ++++ b/drivers/usb/core/quirks.c +@@ -159,6 +159,10 @@ static const struct usb_device_id usb_quirk_list[] = { + /* USB3503 */ + { USB_DEVICE(0x0424, 0x3503), .driver_info = USB_QUIRK_RESET_RESUME }, + ++ /* ASUS Base Station(T100) */ ++ { USB_DEVICE(0x0b05, 0x17e0), .driver_info = ++ USB_QUIRK_IGNORE_REMOTE_WAKEUP }, ++ + { } /* terminating entry must be last */ + }; + +diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c +index 6935a822ce2b..f80151932053 100644 +--- a/drivers/usb/gadget/composite.c ++++ b/drivers/usb/gadget/composite.c +@@ -1956,7 +1956,6 @@ void composite_dev_cleanup(struct usb_composite_dev *cdev) + } + if (cdev->req) { + kfree(cdev->req->buf); +- usb_ep_dequeue(cdev->gadget->ep0, cdev->req); + usb_ep_free_request(cdev->gadget->ep0, cdev->req); + } + cdev->next_string_id = 0; +diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c +index 0dc3552d1360..7ad7137ba39a 100644 +--- a/drivers/usb/gadget/function/f_fs.c ++++ b/drivers/usb/gadget/function/f_fs.c +@@ -2393,7 +2393,8 @@ static int __ffs_func_bind_do_descs(enum ffs_entity_type type, u8 *valuep, + struct usb_endpoint_descriptor *ds = (void *)desc; + struct ffs_function *func = priv; + struct ffs_ep *ffs_ep; +- unsigned ep_desc_id, idx; ++ unsigned ep_desc_id; ++ int idx; + static const char *speed_names[] = { "full", "high", "super" }; + + if (type != FFS_DESCRIPTOR) +diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c +index c791ba5da91a..154bcf1b5dfa 100644 +--- a/drivers/usb/musb/musb_dsps.c ++++ b/drivers/usb/musb/musb_dsps.c +@@ -870,6 +870,7 @@ static int dsps_suspend(struct device *dev) + struct musb *musb = platform_get_drvdata(glue->musb); + void __iomem *mbase = musb->ctrl_base; + ++ del_timer_sync(&glue->timer); + glue->context.control = dsps_readl(mbase, wrp->control); + glue->context.epintr = dsps_readl(mbase, wrp->epintr_set); + glue->context.coreintr = dsps_readl(mbase, wrp->coreintr_set); +@@ -895,6 +896,7 @@ static int dsps_resume(struct device *dev) + dsps_writel(mbase, wrp->mode, glue->context.mode); + dsps_writel(mbase, wrp->tx_mode, glue->context.tx_mode); + dsps_writel(mbase, wrp->rx_mode, glue->context.rx_mode); ++ setup_timer(&glue->timer, otg_timer, (unsigned long) musb); + + return 0; + } +diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c +index e4bb62225cb9..eca1747ca8c7 100644 +--- a/drivers/usb/serial/cp210x.c ++++ b/drivers/usb/serial/cp210x.c +@@ -122,6 +122,7 @@ static const struct usb_device_id id_table[] = { + { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ + { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ + { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ ++ { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ + { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ + { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ + { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ +@@ -155,6 +156,7 @@ static const struct usb_device_id id_table[] = { + { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ + { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */ + { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ ++ { USB_DEVICE(0x1D6F, 0x0010) }, /* Seluxit ApS RF Dongle */ + { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ + { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */ + { USB_DEVICE(0x1FB9, 0x0100) }, /* Lake Shore Model 121 Current Source */ +diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c +index 9bfa7252f7f9..98ff609f968b 100644 +--- a/drivers/usb/storage/uas.c ++++ b/drivers/usb/storage/uas.c +@@ -28,6 +28,7 @@ + #include <scsi/scsi_tcq.h> + + #include "uas-detect.h" ++#include "scsiglue.h" + + /* + * The r00-r01c specs define this version of the SENSE IU data structure. +@@ -49,6 +50,7 @@ struct uas_dev_info { + struct usb_anchor cmd_urbs; + struct usb_anchor sense_urbs; + struct usb_anchor data_urbs; ++ unsigned long flags; + int qdepth, resetting; + struct response_iu response; + unsigned cmd_pipe, status_pipe, data_in_pipe, data_out_pipe; +@@ -714,6 +716,15 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd, + + BUILD_BUG_ON(sizeof(struct uas_cmd_info) > sizeof(struct scsi_pointer)); + ++ if ((devinfo->flags & US_FL_NO_ATA_1X) && ++ (cmnd->cmnd[0] == ATA_12 || cmnd->cmnd[0] == ATA_16)) { ++ memcpy(cmnd->sense_buffer, usb_stor_sense_invalidCDB, ++ sizeof(usb_stor_sense_invalidCDB)); ++ cmnd->result = SAM_STAT_CHECK_CONDITION; ++ cmnd->scsi_done(cmnd); ++ return 0; ++ } ++ + spin_lock_irqsave(&devinfo->lock, flags); + + if (devinfo->resetting) { +@@ -950,6 +961,10 @@ static int uas_slave_alloc(struct scsi_device *sdev) + static int uas_slave_configure(struct scsi_device *sdev) + { + struct uas_dev_info *devinfo = sdev->hostdata; ++ ++ if (devinfo->flags & US_FL_NO_REPORT_OPCODES) ++ sdev->no_report_opcodes = 1; ++ + scsi_set_tag_type(sdev, MSG_ORDERED_TAG); + scsi_activate_tcq(sdev, devinfo->qdepth - 2); + return 0; +@@ -1087,6 +1102,8 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id) + devinfo->resetting = 0; + devinfo->running_task = 0; + devinfo->shutdown = 0; ++ devinfo->flags = id->driver_info; ++ usb_stor_adjust_quirks(udev, &devinfo->flags); + init_usb_anchor(&devinfo->cmd_urbs); + init_usb_anchor(&devinfo->sense_urbs); + init_usb_anchor(&devinfo->data_urbs); +diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h +index 7244444df8ee..8511b54a65d9 100644 +--- a/drivers/usb/storage/unusual_uas.h ++++ b/drivers/usb/storage/unusual_uas.h +@@ -40,13 +40,38 @@ + * and don't forget to CC: the USB development list <linux-...@vger.kernel.org> + */ + +-/* +- * This is an example entry for the US_FL_IGNORE_UAS flag. Once we have an +- * actual entry using US_FL_IGNORE_UAS this entry should be removed. +- * +- * UNUSUAL_DEV( 0xabcd, 0x1234, 0x0100, 0x0100, +- * "Example", +- * "Storage with broken UAS", +- * USB_SC_DEVICE, USB_PR_DEVICE, NULL, +- * US_FL_IGNORE_UAS), +- */ ++/* https://bugzilla.kernel.org/show_bug.cgi?id=79511 */ ++UNUSUAL_DEV(0x0bc2, 0x2312, 0x0000, 0x9999, ++ "Seagate", ++ "Expansion Desk", ++ USB_SC_DEVICE, USB_PR_DEVICE, NULL, ++ US_FL_NO_ATA_1X), ++ ++/* https://bbs.archlinux.org/viewtopic.php?id=183190 */ ++UNUSUAL_DEV(0x0bc2, 0x3312, 0x0000, 0x9999, ++ "Seagate", ++ "Expansion Desk", ++ USB_SC_DEVICE, USB_PR_DEVICE, NULL, ++ US_FL_NO_ATA_1X), ++ ++/* https://bbs.archlinux.org/viewtopic.php?id=183190 */ ++UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999, ++ "Seagate", ++ "Backup+ BK", ++ USB_SC_DEVICE, USB_PR_DEVICE, NULL, ++ US_FL_NO_ATA_1X), ++ ++/* Reported-by: Claudio Bizzarri <claudio.bizza...@gmail.com> */ ++UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999, ++ "JMicron", ++ "JMS567", ++ USB_SC_DEVICE, USB_PR_DEVICE, NULL, ++ US_FL_NO_REPORT_OPCODES), ++ ++/* Most ASM1051 based devices have issues with uas, blacklist them all */ ++/* Reported-by: Hans de Goede <hdego...@redhat.com> */ ++UNUSUAL_DEV(0x174c, 0x5106, 0x0000, 0x9999, ++ "ASMedia", ++ "ASM1051", ++ USB_SC_DEVICE, USB_PR_DEVICE, NULL, ++ US_FL_IGNORE_UAS), +diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c +index cedb29252a92..f60e7d463636 100644 +--- a/drivers/usb/storage/usb.c ++++ b/drivers/usb/storage/usb.c +@@ -478,7 +478,8 @@ void usb_stor_adjust_quirks(struct usb_device *udev, unsigned long *fflags) + US_FL_CAPACITY_OK | US_FL_IGNORE_RESIDUE | + US_FL_SINGLE_LUN | US_FL_NO_WP_DETECT | + US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16 | +- US_FL_INITIAL_READ10 | US_FL_WRITE_CACHE); ++ US_FL_INITIAL_READ10 | US_FL_WRITE_CACHE | ++ US_FL_NO_ATA_1X | US_FL_NO_REPORT_OPCODES); + + p = quirks; + while (*p) { +@@ -516,6 +517,9 @@ void usb_stor_adjust_quirks(struct usb_device *udev, unsigned long *fflags) + case 'e': + f |= US_FL_NO_READ_CAPACITY_16; + break; ++ case 'f': ++ f |= US_FL_NO_REPORT_OPCODES; ++ break; + case 'h': + f |= US_FL_CAPACITY_HEURISTICS; + break; +@@ -543,6 +547,9 @@ void usb_stor_adjust_quirks(struct usb_device *udev, unsigned long *fflags) + case 's': + f |= US_FL_SINGLE_LUN; + break; ++ case 't': ++ f |= US_FL_NO_ATA_1X; ++ break; + case 'u': + f |= US_FL_IGNORE_UAS; + break; +diff --git a/include/asm-generic/irq_work.h b/include/asm-generic/irq_work.h +new file mode 100644 +index 000000000000..a44f452c6590 +--- /dev/null ++++ b/include/asm-generic/irq_work.h +@@ -0,0 +1,10 @@ ++#ifndef __ASM_IRQ_WORK_H ++#define __ASM_IRQ_WORK_H ++ ++static inline bool arch_irq_work_has_interrupt(void) ++{ ++ return false; ++} ++ ++#endif /* __ASM_IRQ_WORK_H */ ++ +diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h +index bf9422c3aefe..bf3fe719c7ce 100644 +--- a/include/linux/irq_work.h ++++ b/include/linux/irq_work.h +@@ -39,9 +39,12 @@ bool irq_work_queue_on(struct irq_work *work, int cpu); + #endif + + void irq_work_run(void); ++void irq_work_tick(void); + void irq_work_sync(struct irq_work *work); + + #ifdef CONFIG_IRQ_WORK ++#include <asm/irq_work.h> ++ + bool irq_work_needs_cpu(void); + #else + static inline bool irq_work_needs_cpu(void) { return false; } +diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h +index 55a17b188daa..32e0f5c04e72 100644 +--- a/include/linux/usb/quirks.h ++++ b/include/linux/usb/quirks.h +@@ -41,4 +41,7 @@ + */ + #define USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL 0x00000080 + ++/* device generates spurious wakeup, ignore remote wakeup capability */ ++#define USB_QUIRK_IGNORE_REMOTE_WAKEUP 0x00000200 ++ + #endif /* __LINUX_USB_QUIRKS_H */ +diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h +index 9b7de1b46437..a7f2604c5f25 100644 +--- a/include/linux/usb_usual.h ++++ b/include/linux/usb_usual.h +@@ -73,6 +73,10 @@ + /* Device advertises UAS but it is broken */ \ + US_FLAG(BROKEN_FUA, 0x01000000) \ + /* Cannot handle FUA in WRITE or READ CDBs */ \ ++ US_FLAG(NO_ATA_1X, 0x02000000) \ ++ /* Cannot handle ATA_12 or ATA_16 CDBs */ \ ++ US_FLAG(NO_REPORT_OPCODES, 0x04000000) \ ++ /* Cannot handle MI_REPORT_SUPPORTED_OPERATION_CODES */ \ + + #define US_FLAG(name, value) US_FL_##name = value , + enum { US_DO_ALL_FLAGS }; +diff --git a/include/net/sctp/command.h b/include/net/sctp/command.h +index f22538e68245..d4a20d00461c 100644 +--- a/include/net/sctp/command.h ++++ b/include/net/sctp/command.h +@@ -115,7 +115,7 @@ typedef enum { + * analysis of the state functions, but in reality just taken from + * thin air in the hopes othat we don't trigger a kernel panic. + */ +-#define SCTP_MAX_NUM_COMMANDS 14 ++#define SCTP_MAX_NUM_COMMANDS 20 + + typedef union { + void *zero_all; /* Set to NULL to clear the entire union */ +diff --git a/kernel/irq_work.c b/kernel/irq_work.c +index e6bcbe756663..385b85aded19 100644 +--- a/kernel/irq_work.c ++++ b/kernel/irq_work.c +@@ -115,8 +115,10 @@ bool irq_work_needs_cpu(void) + + raised = &__get_cpu_var(raised_list); + lazy = &__get_cpu_var(lazy_list); +- if (llist_empty(raised) && llist_empty(lazy)) +- return false; ++ ++ if (llist_empty(raised) || arch_irq_work_has_interrupt()) ++ if (llist_empty(lazy)) ++ return false; + + /* All work should have been flushed before going offline */ + WARN_ON_ONCE(cpu_is_offline(smp_processor_id())); +@@ -171,6 +173,15 @@ void irq_work_run(void) + } + EXPORT_SYMBOL_GPL(irq_work_run); + ++void irq_work_tick(void) ++{ ++ struct llist_head *raised = &__get_cpu_var(raised_list); ++ ++ if (!llist_empty(raised) && !arch_irq_work_has_interrupt()) ++ irq_work_run_list(raised); ++ irq_work_run_list(&__get_cpu_var(lazy_list)); ++} ++ + /* + * Synchronize against the irq_work @entry, ensures the entry is not + * currently in use. +diff --git a/kernel/time/timer.c b/kernel/time/timer.c +index aca5dfe2fa3d..9bbb8344ed3b 100644 +--- a/kernel/time/timer.c ++++ b/kernel/time/timer.c +@@ -1385,7 +1385,7 @@ void update_process_times(int user_tick) + rcu_check_callbacks(cpu, user_tick); + #ifdef CONFIG_IRQ_WORK + if (in_irq()) +- irq_work_run(); ++ irq_work_tick(); + #endif + scheduler_tick(); + run_posix_cpu_timers(p); +diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c +index f304471477dc..97299d76c1b0 100644 +--- a/net/ipv6/ip6_gre.c ++++ b/net/ipv6/ip6_gre.c +@@ -782,7 +782,7 @@ static inline int ip6gre_xmit_ipv4(struct sk_buff *skb, struct net_device *dev) + encap_limit = t->parms.encap_limit; + + memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); +- fl6.flowi6_proto = IPPROTO_IPIP; ++ fl6.flowi6_proto = IPPROTO_GRE; + + dsfield = ipv4_get_dsfield(iph); + +@@ -832,7 +832,7 @@ static inline int ip6gre_xmit_ipv6(struct sk_buff *skb, struct net_device *dev) + encap_limit = t->parms.encap_limit; + + memcpy(&fl6, &t->fl.u.ip6, sizeof(fl6)); +- fl6.flowi6_proto = IPPROTO_IPV6; ++ fl6.flowi6_proto = IPPROTO_GRE; + + dsfield = ipv6_get_dsfield(ipv6h); + if (t->parms.flags & IP6_TNL_F_USE_ORIG_TCLASS) +diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c +index c28b0d327b12..4f4e08b0e2b7 100644 +--- a/net/sched/cls_api.c ++++ b/net/sched/cls_api.c +@@ -549,6 +549,7 @@ void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst, + tcf_tree_lock(tp); + list_splice_init(&dst->actions, &tmp); + list_splice(&src->actions, &dst->actions); ++ dst->type = src->type; + tcf_tree_unlock(tp); + tcf_action_destroy(&tmp, TCA_ACT_UNBIND); + #endif +diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c +index d3f1ea460c50..c8f606324134 100644 +--- a/net/sctp/sm_statefuns.c ++++ b/net/sctp/sm_statefuns.c +@@ -1775,9 +1775,22 @@ static sctp_disposition_t sctp_sf_do_dupcook_a(struct net *net, + /* Update the content of current association. */ + sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc)); + sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev)); +- sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, +- SCTP_STATE(SCTP_STATE_ESTABLISHED)); +- sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); ++ if (sctp_state(asoc, SHUTDOWN_PENDING) && ++ (sctp_sstate(asoc->base.sk, CLOSING) || ++ sock_flag(asoc->base.sk, SOCK_DEAD))) { ++ /* if were currently in SHUTDOWN_PENDING, but the socket ++ * has been closed by user, don't transition to ESTABLISHED. ++ * Instead trigger SHUTDOWN bundled with COOKIE_ACK. ++ */ ++ sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); ++ return sctp_sf_do_9_2_start_shutdown(net, ep, asoc, ++ SCTP_ST_CHUNK(0), NULL, ++ commands); ++ } else { ++ sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE, ++ SCTP_STATE(SCTP_STATE_ESTABLISHED)); ++ sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(repl)); ++ } + return SCTP_DISPOSITION_CONSUME; + + nomem_ev: