diff -druNp --no-dereference linux-libre-4.4.157-gnu/arch/arm/mach-exynos/suspend.c linux-libre-4.4.158-gnu/arch/arm/mach-exynos/suspend.c
--- linux-libre-4.4.157-gnu/arch/arm/mach-exynos/suspend.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/arch/arm/mach-exynos/suspend.c	2018-09-26 02:35:10.000000000 -0400
@@ -260,6 +260,7 @@ static int __init exynos_pmu_irq_init(st
 					  NULL);
 	if (!domain) {
 		iounmap(pmu_base_addr);
+		pmu_base_addr = NULL;
 		return -ENOMEM;
 	}
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/arch/arm/mach-hisi/hotplug.c linux-libre-4.4.158-gnu/arch/arm/mach-hisi/hotplug.c
--- linux-libre-4.4.157-gnu/arch/arm/mach-hisi/hotplug.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/arch/arm/mach-hisi/hotplug.c	2018-09-26 02:35:10.000000000 -0400
@@ -148,13 +148,20 @@ static int hi3xxx_hotplug_init(void)
 	struct device_node *node;
 
 	node = of_find_compatible_node(NULL, NULL, "hisilicon,sysctrl");
-	if (node) {
-		ctrl_base = of_iomap(node, 0);
-		id = HI3620_CTRL;
-		return 0;
+	if (!node) {
+		id = ERROR_CTRL;
+		return -ENOENT;
 	}
-	id = ERROR_CTRL;
-	return -ENOENT;
+
+	ctrl_base = of_iomap(node, 0);
+	of_node_put(node);
+	if (!ctrl_base) {
+		id = ERROR_CTRL;
+		return -ENOMEM;
+	}
+
+	id = HI3620_CTRL;
+	return 0;
 }
 
 void hi3xxx_set_cpu(int cpu, bool enable)
@@ -173,11 +180,15 @@ static bool hix5hd2_hotplug_init(void)
 	struct device_node *np;
 
 	np = of_find_compatible_node(NULL, NULL, "hisilicon,cpuctrl");
-	if (np) {
-		ctrl_base = of_iomap(np, 0);
-		return true;
-	}
-	return false;
+	if (!np)
+		return false;
+
+	ctrl_base = of_iomap(np, 0);
+	of_node_put(np);
+	if (!ctrl_base)
+		return false;
+
+	return true;
 }
 
 void hix5hd2_set_cpu(int cpu, bool enable)
@@ -219,10 +230,10 @@ void hip01_set_cpu(int cpu, bool enable)
 
 	if (!ctrl_base) {
 		np = of_find_compatible_node(NULL, NULL, "hisilicon,hip01-sysctrl");
-		if (np)
-			ctrl_base = of_iomap(np, 0);
-		else
-			BUG();
+		BUG_ON(!np);
+		ctrl_base = of_iomap(np, 0);
+		of_node_put(np);
+		BUG_ON(!ctrl_base);
 	}
 
 	if (enable) {
diff -druNp --no-dereference linux-libre-4.4.157-gnu/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi linux-libre-4.4.158-gnu/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi
--- linux-libre-4.4.157-gnu/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi	2018-09-26 02:35:10.000000000 -0400
@@ -105,7 +105,7 @@
 			led@6 {
 				label = "apq8016-sbc:blue:bt";
 				gpios = <&pm8916_mpps 3 GPIO_ACTIVE_HIGH>;
-				linux,default-trigger = "bt";
+				linux,default-trigger = "bluetooth-power";
 				default-state = "off";
 			};
 		};
diff -druNp --no-dereference linux-libre-4.4.157-gnu/arch/mips/ath79/setup.c linux-libre-4.4.158-gnu/arch/mips/ath79/setup.c
--- linux-libre-4.4.157-gnu/arch/mips/ath79/setup.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/arch/mips/ath79/setup.c	2018-09-26 02:35:10.000000000 -0400
@@ -44,6 +44,7 @@ static char ath79_sys_type[ATH79_SYS_TYP
 
 static void ath79_restart(char *command)
 {
+	local_irq_disable();
 	ath79_device_reset_set(AR71XX_RESET_FULL_CHIP);
 	for (;;)
 		if (cpu_wait)
diff -druNp --no-dereference linux-libre-4.4.157-gnu/arch/mips/include/asm/mach-ath79/ath79.h linux-libre-4.4.158-gnu/arch/mips/include/asm/mach-ath79/ath79.h
--- linux-libre-4.4.157-gnu/arch/mips/include/asm/mach-ath79/ath79.h	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/arch/mips/include/asm/mach-ath79/ath79.h	2018-09-26 02:35:10.000000000 -0400
@@ -133,6 +133,7 @@ static inline u32 ath79_pll_rr(unsigned
 static inline void ath79_reset_wr(unsigned reg, u32 val)
 {
 	__raw_writel(val, ath79_reset_base + reg);
+	(void) __raw_readl(ath79_reset_base + reg); /* flush */
 }
 
 static inline u32 ath79_reset_rr(unsigned reg)
diff -druNp --no-dereference linux-libre-4.4.157-gnu/arch/mips/jz4740/Platform linux-libre-4.4.158-gnu/arch/mips/jz4740/Platform
--- linux-libre-4.4.157-gnu/arch/mips/jz4740/Platform	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/arch/mips/jz4740/Platform	2018-09-26 02:35:10.000000000 -0400
@@ -1,4 +1,4 @@
 platform-$(CONFIG_MACH_INGENIC)	+= jz4740/
 cflags-$(CONFIG_MACH_INGENIC)	+= -I$(srctree)/arch/mips/include/asm/mach-jz4740
 load-$(CONFIG_MACH_INGENIC)	+= 0xffffffff80010000
-zload-$(CONFIG_MACH_INGENIC)	+= 0xffffffff80600000
+zload-$(CONFIG_MACH_INGENIC)	+= 0xffffffff81000000
diff -druNp --no-dereference linux-libre-4.4.157-gnu/arch/mips/kernel/vdso.c linux-libre-4.4.158-gnu/arch/mips/kernel/vdso.c
--- linux-libre-4.4.157-gnu/arch/mips/kernel/vdso.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/arch/mips/kernel/vdso.c	2018-09-26 02:35:10.000000000 -0400
@@ -14,12 +14,14 @@
 #include <linux/init.h>
 #include <linux/ioport.h>
 #include <linux/irqchip/mips-gic.h>
+#include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/timekeeper_internal.h>
 
 #include <asm/abi.h>
+#include <asm/page.h>
 #include <asm/vdso.h>
 
 /* Kernel-provided data used by the VDSO. */
@@ -118,12 +120,30 @@ int arch_setup_additional_pages(struct l
 	vvar_size = gic_size + PAGE_SIZE;
 	size = vvar_size + image->size;
 
+	/*
+	 * Find a region that's large enough for us to perform the
+	 * colour-matching alignment below.
+	 */
+	if (cpu_has_dc_aliases)
+		size += shm_align_mask + 1;
+
 	base = get_unmapped_area(NULL, 0, size, 0, 0);
 	if (IS_ERR_VALUE(base)) {
 		ret = base;
 		goto out;
 	}
 
+	/*
+	 * If we suffer from dcache aliasing, ensure that the VDSO data page
+	 * mapping is coloured the same as the kernel's mapping of that memory.
+	 * This ensures that when the kernel updates the VDSO data userland
+	 * will observe it without requiring cache invalidations.
+	 */
+	if (cpu_has_dc_aliases) {
+		base = __ALIGN_MASK(base, shm_align_mask);
+		base += ((unsigned long)&vdso_data - gic_size) & shm_align_mask;
+	}
+
 	data_addr = base + gic_size;
 	vdso_addr = data_addr + PAGE_SIZE;
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/arch/mips/loongson64/common/cs5536/cs5536_ohci.c linux-libre-4.4.158-gnu/arch/mips/loongson64/common/cs5536/cs5536_ohci.c
--- linux-libre-4.4.157-gnu/arch/mips/loongson64/common/cs5536/cs5536_ohci.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/arch/mips/loongson64/common/cs5536/cs5536_ohci.c	2018-09-26 02:35:10.000000000 -0400
@@ -138,7 +138,7 @@ u32 pci_ohci_read_reg(int reg)
 		break;
 	case PCI_OHCI_INT_REG:
 		_rdmsr(DIVIL_MSR_REG(PIC_YSEL_LOW), &hi, &lo);
-		if ((lo & 0x00000f00) == CS5536_USB_INTR)
+		if (((lo >> PIC_YSEL_LOW_USB_SHIFT) & 0xf) == CS5536_USB_INTR)
 			conf_data = 1;
 		break;
 	default:
diff -druNp --no-dereference linux-libre-4.4.157-gnu/arch/powerpc/platforms/powernv/opal.c linux-libre-4.4.158-gnu/arch/powerpc/platforms/powernv/opal.c
--- linux-libre-4.4.157-gnu/arch/powerpc/platforms/powernv/opal.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/arch/powerpc/platforms/powernv/opal.c	2018-09-26 02:35:10.000000000 -0400
@@ -371,7 +371,7 @@ int opal_put_chars(uint32_t vtermno, con
 		/* Closed or other error drop */
 		if (rc != OPAL_SUCCESS && rc != OPAL_BUSY &&
 		    rc != OPAL_BUSY_EVENT) {
-			written = total_len;
+			written += total_len;
 			break;
 		}
 		if (rc == OPAL_SUCCESS) {
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/clk/imx/clk-imx6ul.c linux-libre-4.4.158-gnu/drivers/clk/imx/clk-imx6ul.c
--- linux-libre-4.4.157-gnu/drivers/clk/imx/clk-imx6ul.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/clk/imx/clk-imx6ul.c	2018-09-26 02:35:10.000000000 -0400
@@ -120,6 +120,7 @@ static void __init imx6ul_clocks_init(st
 
 	np = of_find_compatible_node(NULL, NULL, "fsl,imx6ul-anatop");
 	base = of_iomap(np, 0);
+	of_node_put(np);
 	WARN_ON(!base);
 
 	clks[IMX6UL_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/crypto/sahara.c linux-libre-4.4.158-gnu/drivers/crypto/sahara.c
--- linux-libre-4.4.157-gnu/drivers/crypto/sahara.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/crypto/sahara.c	2018-09-26 02:35:10.000000000 -0400
@@ -1363,7 +1363,7 @@ err_sha_v4_algs:
 
 err_sha_v3_algs:
 	for (j = 0; j < k; j++)
-		crypto_unregister_ahash(&sha_v4_algs[j]);
+		crypto_unregister_ahash(&sha_v3_algs[j]);
 
 err_aes_algs:
 	for (j = 0; j < i; j++)
@@ -1379,7 +1379,7 @@ static void sahara_unregister_algs(struc
 	for (i = 0; i < ARRAY_SIZE(aes_algs); i++)
 		crypto_unregister_alg(&aes_algs[i]);
 
-	for (i = 0; i < ARRAY_SIZE(sha_v4_algs); i++)
+	for (i = 0; i < ARRAY_SIZE(sha_v3_algs); i++)
 		crypto_unregister_ahash(&sha_v3_algs[i]);
 
 	if (dev->version > SAHARA_VERSION_3)
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/dma/pl330.c linux-libre-4.4.158-gnu/drivers/dma/pl330.c
--- linux-libre-4.4.157-gnu/drivers/dma/pl330.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/dma/pl330.c	2018-09-26 02:35:10.000000000 -0400
@@ -2132,13 +2132,14 @@ static int pl330_terminate_all(struct dm
 
 	pm_runtime_get_sync(pl330->ddma.dev);
 	spin_lock_irqsave(&pch->lock, flags);
+
 	spin_lock(&pl330->lock);
 	_stop(pch->thread);
-	spin_unlock(&pl330->lock);
-
 	pch->thread->req[0].desc = NULL;
 	pch->thread->req[1].desc = NULL;
 	pch->thread->req_running = -1;
+	spin_unlock(&pl330->lock);
+
 	power_down = pch->active;
 	pch->active = false;
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/gpio/gpiolib.h linux-libre-4.4.158-gnu/drivers/gpio/gpiolib.h
--- linux-libre-4.4.157-gnu/drivers/gpio/gpiolib.h	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/gpio/gpiolib.h	2018-09-26 02:35:10.000000000 -0400
@@ -30,7 +30,7 @@ struct acpi_gpio_info {
 };
 
 /* gpio suffixes used for ACPI and device tree lookup */
-static const char * const gpio_suffixes[] = { "gpios", "gpio" };
+static __maybe_unused const char * const gpio_suffixes[] = { "gpios", "gpio" };
 
 #ifdef CONFIG_ACPI
 void acpi_gpiochip_add(struct gpio_chip *chip);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/gpu/drm/amd/amdkfd/kfd_process.c linux-libre-4.4.158-gnu/drivers/gpu/drm/amd/amdkfd/kfd_process.c
--- linux-libre-4.4.157-gnu/drivers/gpu/drm/amd/amdkfd/kfd_process.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/gpu/drm/amd/amdkfd/kfd_process.c	2018-09-26 02:35:10.000000000 -0400
@@ -125,6 +125,8 @@ struct kfd_process *kfd_get_process(cons
 		return ERR_PTR(-EINVAL);
 
 	process = find_process(thread);
+	if (!process)
+		return ERR_PTR(-EINVAL);
 
 	return process;
 }
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c linux-libre-4.4.158-gnu/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
--- linux-libre-4.4.157-gnu/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c	2018-09-26 02:35:10.000000000 -0400
@@ -23,6 +23,10 @@
 #ifdef CONFIG_NOUVEAU_PLATFORM_DRIVER
 #include "priv.h"
 
+#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
+#include <asm/dma-iommu.h>
+#endif
+
 static int
 nvkm_device_tegra_power_up(struct nvkm_device_tegra *tdev)
 {
@@ -85,6 +89,15 @@ nvkm_device_tegra_probe_iommu(struct nvk
 	unsigned long pgsize_bitmap;
 	int ret;
 
+#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
+	if (dev->archdata.mapping) {
+		struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
+
+		arm_iommu_detach_device(dev);
+		arm_iommu_release_mapping(mapping);
+	}
+#endif
+
 	if (!tdev->func->iommu_bit)
 		return;
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c linux-libre-4.4.158-gnu/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c
--- linux-libre-4.4.157-gnu/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/gpu/drm/panel/panel-samsung-s6e8aa0.c	2018-09-26 02:35:10.000000000 -0400
@@ -823,7 +823,7 @@ static void s6e8aa0_read_mtp_id(struct s
 	int ret, i;
 
 	ret = s6e8aa0_dcs_read(ctx, 0xd1, id, ARRAY_SIZE(id));
-	if (ret < ARRAY_SIZE(id) || id[0] == 0x00) {
+	if (ret < 0 || ret < ARRAY_SIZE(id) || id[0] == 0x00) {
 		dev_err(ctx->dev, "read id failed\n");
 		ctx->error = -EIO;
 		return;
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/hwtracing/coresight/coresight.c linux-libre-4.4.158-gnu/drivers/hwtracing/coresight/coresight.c
--- linux-libre-4.4.157-gnu/drivers/hwtracing/coresight/coresight.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/hwtracing/coresight/coresight.c	2018-09-26 02:35:10.000000000 -0400
@@ -86,7 +86,7 @@ static int coresight_find_link_inport(st
 	dev_err(&csdev->dev, "couldn't find inport, parent: %s, child: %s\n",
 		dev_name(&parent->dev), dev_name(&csdev->dev));
 
-	return 0;
+	return -ENODEV;
 }
 
 static int coresight_find_link_outport(struct coresight_device *csdev)
@@ -107,7 +107,7 @@ static int coresight_find_link_outport(s
 	dev_err(&csdev->dev, "couldn't find outport, parent: %s, child: %s\n",
 		dev_name(&csdev->dev), dev_name(&child->dev));
 
-	return 0;
+	return -ENODEV;
 }
 
 static int coresight_enable_sink(struct coresight_device *csdev)
@@ -155,6 +155,9 @@ static int coresight_enable_link(struct
 	else
 		refport = 0;
 
+	if (refport < 0)
+		return refport;
+
 	if (atomic_inc_return(&csdev->refcnt[refport]) == 1) {
 		if (link_ops(csdev)->enable) {
 			ret = link_ops(csdev)->enable(csdev, inport, outport);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/hwtracing/coresight/coresight-tpiu.c linux-libre-4.4.158-gnu/drivers/hwtracing/coresight/coresight-tpiu.c
--- linux-libre-4.4.157-gnu/drivers/hwtracing/coresight/coresight-tpiu.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/hwtracing/coresight/coresight-tpiu.c	2018-09-26 02:35:10.000000000 -0400
@@ -46,8 +46,9 @@
 
 /** register definition **/
 /* FFSR - 0x300 */
-#define FFSR_FT_STOPPED		BIT(1)
+#define FFSR_FT_STOPPED_BIT	1
 /* FFCR - 0x304 */
+#define FFCR_FON_MAN_BIT	6
 #define FFCR_FON_MAN		BIT(6)
 #define FFCR_STOP_FI		BIT(12)
 
@@ -93,9 +94,9 @@ static void tpiu_disable_hw(struct tpiu_
 	/* Generate manual flush */
 	writel_relaxed(FFCR_STOP_FI | FFCR_FON_MAN, drvdata->base + TPIU_FFCR);
 	/* Wait for flush to complete */
-	coresight_timeout(drvdata->base, TPIU_FFCR, FFCR_FON_MAN, 0);
+	coresight_timeout(drvdata->base, TPIU_FFCR, FFCR_FON_MAN_BIT, 0);
 	/* Wait for formatter to stop */
-	coresight_timeout(drvdata->base, TPIU_FFSR, FFSR_FT_STOPPED, 1);
+	coresight_timeout(drvdata->base, TPIU_FFSR, FFSR_FT_STOPPED_BIT, 1);
 
 	CS_LOCK(drvdata->base);
 }
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/infiniband/core/cma.c linux-libre-4.4.158-gnu/drivers/infiniband/core/cma.c
--- linux-libre-4.4.157-gnu/drivers/infiniband/core/cma.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/infiniband/core/cma.c	2018-09-26 02:35:10.000000000 -0400
@@ -544,6 +544,7 @@ static int cma_resolve_ib_dev(struct rdm
 	dgid = (union ib_gid *) &addr->sib_addr;
 	pkey = ntohs(addr->sib_pkey);
 
+	mutex_lock(&lock);
 	list_for_each_entry(cur_dev, &dev_list, list) {
 		for (p = 1; p <= cur_dev->device->phys_port_cnt; ++p) {
 			if (!rdma_cap_af_ib(cur_dev->device, p))
@@ -567,18 +568,19 @@ static int cma_resolve_ib_dev(struct rdm
 					cma_dev = cur_dev;
 					sgid = gid;
 					id_priv->id.port_num = p;
+					goto found;
 				}
 			}
 		}
 	}
-
-	if (!cma_dev)
-		return -ENODEV;
+	mutex_unlock(&lock);
+	return -ENODEV;
 
 found:
 	cma_attach_to_dev(id_priv, cma_dev);
-	addr = (struct sockaddr_ib *) cma_src_addr(id_priv);
-	memcpy(&addr->sib_addr, &sgid, sizeof sgid);
+	mutex_unlock(&lock);
+	addr = (struct sockaddr_ib *)cma_src_addr(id_priv);
+	memcpy(&addr->sib_addr, &sgid, sizeof(sgid));
 	cma_translate_ib(addr, &id_priv->id.route.addr.dev_addr);
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/infiniband/ulp/ipoib/ipoib_cm.c linux-libre-4.4.158-gnu/drivers/infiniband/ulp/ipoib/ipoib_cm.c
--- linux-libre-4.4.157-gnu/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2018-09-26 02:35:10.000000000 -0400
@@ -992,12 +992,14 @@ static int ipoib_cm_rep_handler(struct i
 
 	skb_queue_head_init(&skqueue);
 
+	netif_tx_lock_bh(p->dev);
 	spin_lock_irq(&priv->lock);
 	set_bit(IPOIB_FLAG_OPER_UP, &p->flags);
 	if (p->neigh)
 		while ((skb = __skb_dequeue(&p->neigh->queue)))
 			__skb_queue_tail(&skqueue, skb);
 	spin_unlock_irq(&priv->lock);
+	netif_tx_unlock_bh(p->dev);
 
 	while ((skb = __skb_dequeue(&skqueue))) {
 		skb->dev = p->dev;
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/iommu/arm-smmu-v3.c linux-libre-4.4.158-gnu/drivers/iommu/arm-smmu-v3.c
--- linux-libre-4.4.157-gnu/drivers/iommu/arm-smmu-v3.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/iommu/arm-smmu-v3.c	2018-09-26 02:35:10.000000000 -0400
@@ -1219,6 +1219,7 @@ static irqreturn_t arm_smmu_priq_thread(
 
 	/* Sync our overflow flag, as we believe we're up to speed */
 	q->cons = Q_OVF(q, q->prod) | Q_WRP(q, q->cons) | Q_IDX(q, q->cons);
+	writel(q->cons, q->cons_reg);
 	return IRQ_HANDLED;
 }
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/media/v4l2-core/videobuf2-core.c linux-libre-4.4.158-gnu/drivers/media/v4l2-core/videobuf2-core.c
--- linux-libre-4.4.157-gnu/drivers/media/v4l2-core/videobuf2-core.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/media/v4l2-core/videobuf2-core.c	2018-09-26 02:35:10.000000000 -0400
@@ -1366,6 +1366,11 @@ int vb2_core_qbuf(struct vb2_queue *q, u
 	struct vb2_buffer *vb;
 	int ret;
 
+	if (q->error) {
+		dprintk(1, "fatal error occurred on queue\n");
+		return -EIO;
+	}
+
 	vb = q->bufs[index];
 
 	switch (vb->state) {
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/misc/hmc6352.c linux-libre-4.4.158-gnu/drivers/misc/hmc6352.c
--- linux-libre-4.4.157-gnu/drivers/misc/hmc6352.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/misc/hmc6352.c	2018-09-26 02:35:10.000000000 -0400
@@ -27,6 +27,7 @@
 #include <linux/err.h>
 #include <linux/delay.h>
 #include <linux/sysfs.h>
+#include <linux/nospec.h>
 
 static DEFINE_MUTEX(compass_mutex);
 
@@ -50,6 +51,7 @@ static int compass_store(struct device *
 		return ret;
 	if (val >= strlen(map))
 		return -EINVAL;
+	val = array_index_nospec(val, strlen(map));
 	mutex_lock(&compass_mutex);
 	ret = compass_command(c, map[val]);
 	mutex_unlock(&compass_mutex);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/misc/mei/bus-fixup.c linux-libre-4.4.158-gnu/drivers/misc/mei/bus-fixup.c
--- linux-libre-4.4.157-gnu/drivers/misc/mei/bus-fixup.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/misc/mei/bus-fixup.c	2018-09-26 02:35:10.000000000 -0400
@@ -151,7 +151,7 @@ static int mei_nfc_if_version(struct mei
 
 	ret = 0;
 	bytes_recv = __mei_cl_recv(cl, (u8 *)reply, if_version_length);
-	if (bytes_recv < if_version_length) {
+	if (bytes_recv < 0 || bytes_recv < if_version_length) {
 		dev_err(bus->dev, "Could not read IF version\n");
 		ret = -EIO;
 		goto err;
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/mtd/maps/solutionengine.c linux-libre-4.4.158-gnu/drivers/mtd/maps/solutionengine.c
--- linux-libre-4.4.157-gnu/drivers/mtd/maps/solutionengine.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/mtd/maps/solutionengine.c	2018-09-26 02:35:10.000000000 -0400
@@ -59,9 +59,9 @@ static int __init init_soleng_maps(void)
 			return -ENXIO;
 		}
 	}
-	printk(KERN_NOTICE "Solution Engine: Flash at 0x%08lx, EPROM at 0x%08lx\n",
-	       soleng_flash_map.phys & 0x1fffffff,
-	       soleng_eprom_map.phys & 0x1fffffff);
+	printk(KERN_NOTICE "Solution Engine: Flash at 0x%pap, EPROM at 0x%pap\n",
+	       &soleng_flash_map.phys,
+	       &soleng_eprom_map.phys);
 	flash_mtd->owner = THIS_MODULE;
 
 	eprom_mtd = do_map_probe("map_rom", &soleng_eprom_map);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/mtd/mtdchar.c linux-libre-4.4.158-gnu/drivers/mtd/mtdchar.c
--- linux-libre-4.4.157-gnu/drivers/mtd/mtdchar.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/mtd/mtdchar.c	2018-09-26 02:35:10.000000000 -0400
@@ -160,8 +160,12 @@ static ssize_t mtdchar_read(struct file
 
 	pr_debug("MTD_read\n");
 
-	if (*ppos + count > mtd->size)
-		count = mtd->size - *ppos;
+	if (*ppos + count > mtd->size) {
+		if (*ppos < mtd->size)
+			count = mtd->size - *ppos;
+		else
+			count = 0;
+	}
 
 	if (!count)
 		return 0;
@@ -246,7 +250,7 @@ static ssize_t mtdchar_write(struct file
 
 	pr_debug("MTD_write\n");
 
-	if (*ppos == mtd->size)
+	if (*ppos >= mtd->size)
 		return -ENOSPC;
 
 	if (*ppos + count > mtd->size)
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/net/ethernet/ti/cpsw.c linux-libre-4.4.158-gnu/drivers/net/ethernet/ti/cpsw.c
--- linux-libre-4.4.157-gnu/drivers/net/ethernet/ti/cpsw.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/net/ethernet/ti/cpsw.c	2018-09-26 02:35:10.000000000 -0400
@@ -1164,25 +1164,34 @@ static void cpsw_slave_open(struct cpsw_
 		cpsw_ale_add_mcast(priv->ale, priv->ndev->broadcast,
 				   1 << slave_port, 0, 0, ALE_MCAST_FWD_2);
 
-	if (slave->data->phy_node)
+	if (slave->data->phy_node) {
 		slave->phy = of_phy_connect(priv->ndev, slave->data->phy_node,
 				 &cpsw_adjust_link, 0, slave->data->phy_if);
-	else
+		if (!slave->phy) {
+			dev_err(priv->dev, "phy \"%s\" not found on slave %d\n",
+				slave->data->phy_node->full_name,
+				slave->slave_num);
+			return;
+		}
+	} else {
 		slave->phy = phy_connect(priv->ndev, slave->data->phy_id,
 				 &cpsw_adjust_link, slave->data->phy_if);
-	if (IS_ERR(slave->phy)) {
-		dev_err(priv->dev, "phy %s not found on slave %d\n",
-			slave->data->phy_id, slave->slave_num);
-		slave->phy = NULL;
-	} else {
-		dev_info(priv->dev, "phy found : id is : 0x%x\n",
-			 slave->phy->phy_id);
-		phy_start(slave->phy);
-
-		/* Configure GMII_SEL register */
-		cpsw_phy_sel(&priv->pdev->dev, slave->phy->interface,
-			     slave->slave_num);
+		if (IS_ERR(slave->phy)) {
+			dev_err(priv->dev,
+				"phy \"%s\" not found on slave %d, err %ld\n",
+				slave->data->phy_id, slave->slave_num,
+				PTR_ERR(slave->phy));
+			slave->phy = NULL;
+			return;
+		}
 	}
+
+	dev_info(priv->dev, "phy found : id is : 0x%x\n", slave->phy->phy_id);
+
+	phy_start(slave->phy);
+
+	/* Configure GMII_SEL register */
+	cpsw_phy_sel(&priv->pdev->dev, slave->phy->interface, slave->slave_num);
 }
 
 static inline void cpsw_add_default_vlan(struct cpsw_priv *priv)
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/net/xen-netfront.c linux-libre-4.4.158-gnu/drivers/net/xen-netfront.c
--- linux-libre-4.4.157-gnu/drivers/net/xen-netfront.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/net/xen-netfront.c	2018-09-26 02:35:10.000000000 -0400
@@ -86,8 +86,7 @@ struct netfront_cb {
 /* IRQ name is queue name with "-tx" or "-rx" appended */
 #define IRQ_NAME_SIZE (QUEUE_NAME_SIZE + 3)
 
-static DECLARE_WAIT_QUEUE_HEAD(module_load_q);
-static DECLARE_WAIT_QUEUE_HEAD(module_unload_q);
+static DECLARE_WAIT_QUEUE_HEAD(module_wq);
 
 struct netfront_stats {
 	u64			packets;
@@ -1336,11 +1335,11 @@ static struct net_device *xennet_create_
 	netif_carrier_off(netdev);
 
 	xenbus_switch_state(dev, XenbusStateInitialising);
-	wait_event(module_load_q,
-			   xenbus_read_driver_state(dev->otherend) !=
-			   XenbusStateClosed &&
-			   xenbus_read_driver_state(dev->otherend) !=
-			   XenbusStateUnknown);
+	wait_event(module_wq,
+		   xenbus_read_driver_state(dev->otherend) !=
+		   XenbusStateClosed &&
+		   xenbus_read_driver_state(dev->otherend) !=
+		   XenbusStateUnknown);
 	return netdev;
 
  exit:
@@ -1608,6 +1607,7 @@ static int xennet_init_queue(struct netf
 {
 	unsigned short i;
 	int err = 0;
+	char *devid;
 
 	spin_lock_init(&queue->tx_lock);
 	spin_lock_init(&queue->rx_lock);
@@ -1615,8 +1615,9 @@ static int xennet_init_queue(struct netf
 	setup_timer(&queue->rx_refill_timer, rx_refill_timeout,
 		    (unsigned long)queue);
 
-	snprintf(queue->name, sizeof(queue->name), "%s-q%u",
-		 queue->info->netdev->name, queue->id);
+	devid = strrchr(queue->info->xbdev->nodename, '/') + 1;
+	snprintf(queue->name, sizeof(queue->name), "vif%s-q%u",
+		 devid, queue->id);
 
 	/* Initialise tx_skbs as a free chain containing every entry. */
 	queue->tx_skb_freelist = 0;
@@ -2023,15 +2024,14 @@ static void netback_changed(struct xenbu
 
 	dev_dbg(&dev->dev, "%s\n", xenbus_strstate(backend_state));
 
+	wake_up_all(&module_wq);
+
 	switch (backend_state) {
 	case XenbusStateInitialising:
 	case XenbusStateInitialised:
 	case XenbusStateReconfiguring:
 	case XenbusStateReconfigured:
-		break;
-
 	case XenbusStateUnknown:
-		wake_up_all(&module_unload_q);
 		break;
 
 	case XenbusStateInitWait:
@@ -2047,12 +2047,10 @@ static void netback_changed(struct xenbu
 		break;
 
 	case XenbusStateClosed:
-		wake_up_all(&module_unload_q);
 		if (dev->state == XenbusStateClosed)
 			break;
 		/* Missed the backend's CLOSING state -- fallthrough */
 	case XenbusStateClosing:
-		wake_up_all(&module_unload_q);
 		xenbus_frontend_closed(dev);
 		break;
 	}
@@ -2160,14 +2158,14 @@ static int xennet_remove(struct xenbus_d
 
 	if (xenbus_read_driver_state(dev->otherend) != XenbusStateClosed) {
 		xenbus_switch_state(dev, XenbusStateClosing);
-		wait_event(module_unload_q,
+		wait_event(module_wq,
 			   xenbus_read_driver_state(dev->otherend) ==
 			   XenbusStateClosing ||
 			   xenbus_read_driver_state(dev->otherend) ==
 			   XenbusStateUnknown);
 
 		xenbus_switch_state(dev, XenbusStateClosed);
-		wait_event(module_unload_q,
+		wait_event(module_wq,
 			   xenbus_read_driver_state(dev->otherend) ==
 			   XenbusStateClosed ||
 			   xenbus_read_driver_state(dev->otherend) ==
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/parport/parport_sunbpp.c linux-libre-4.4.158-gnu/drivers/parport/parport_sunbpp.c
--- linux-libre-4.4.157-gnu/drivers/parport/parport_sunbpp.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/parport/parport_sunbpp.c	2018-09-26 02:35:10.000000000 -0400
@@ -286,12 +286,16 @@ static int bpp_probe(struct platform_dev
 
 	ops = kmemdup(&parport_sunbpp_ops, sizeof(struct parport_operations),
 		      GFP_KERNEL);
-        if (!ops)
+	if (!ops) {
+		err = -ENOMEM;
 		goto out_unmap;
+	}
 
 	dprintk(("register_port\n"));
-	if (!(p = parport_register_port((unsigned long)base, irq, dma, ops)))
+	if (!(p = parport_register_port((unsigned long)base, irq, dma, ops))) {
+		err = -ENOMEM;
 		goto out_free_ops;
+	}
 
 	p->size = size;
 	p->dev = &op->dev;
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c linux-libre-4.4.158-gnu/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c
--- linux-libre-4.4.157-gnu/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c	2018-09-26 02:35:10.000000000 -0400
@@ -291,31 +291,47 @@ static int pmic_gpio_config_get(struct p
 
 	switch (param) {
 	case PIN_CONFIG_DRIVE_PUSH_PULL:
-		arg = pad->buffer_type == PMIC_GPIO_OUT_BUF_CMOS;
+		if (pad->buffer_type != PMIC_GPIO_OUT_BUF_CMOS)
+			return -EINVAL;
+		arg = 1;
 		break;
 	case PIN_CONFIG_DRIVE_OPEN_DRAIN:
-		arg = pad->buffer_type == PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS;
+		if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_NMOS)
+			return -EINVAL;
+		arg = 1;
 		break;
 	case PIN_CONFIG_DRIVE_OPEN_SOURCE:
-		arg = pad->buffer_type == PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS;
+		if (pad->buffer_type != PMIC_GPIO_OUT_BUF_OPEN_DRAIN_PMOS)
+			return -EINVAL;
+		arg = 1;
 		break;
 	case PIN_CONFIG_BIAS_PULL_DOWN:
-		arg = pad->pullup == PMIC_GPIO_PULL_DOWN;
+		if (pad->pullup != PMIC_GPIO_PULL_DOWN)
+			return -EINVAL;
+		arg = 1;
 		break;
 	case PIN_CONFIG_BIAS_DISABLE:
-		arg = pad->pullup = PMIC_GPIO_PULL_DISABLE;
+		if (pad->pullup != PMIC_GPIO_PULL_DISABLE)
+			return -EINVAL;
+		arg = 1;
 		break;
 	case PIN_CONFIG_BIAS_PULL_UP:
-		arg = pad->pullup == PMIC_GPIO_PULL_UP_30;
+		if (pad->pullup != PMIC_GPIO_PULL_UP_30)
+			return -EINVAL;
+		arg = 1;
 		break;
 	case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
-		arg = !pad->is_enabled;
+		if (pad->is_enabled)
+			return -EINVAL;
+		arg = 1;
 		break;
 	case PIN_CONFIG_POWER_SOURCE:
 		arg = pad->power_source;
 		break;
 	case PIN_CONFIG_INPUT_ENABLE:
-		arg = pad->input_enabled;
+		if (!pad->input_enabled)
+			return -EINVAL;
+		arg = 1;
 		break;
 	case PIN_CONFIG_OUTPUT:
 		arg = pad->out_value;
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/platform/x86/toshiba_acpi.c linux-libre-4.4.158-gnu/drivers/platform/x86/toshiba_acpi.c
--- linux-libre-4.4.157-gnu/drivers/platform/x86/toshiba_acpi.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/platform/x86/toshiba_acpi.c	2018-09-26 02:35:10.000000000 -0400
@@ -34,6 +34,7 @@
 #define TOSHIBA_ACPI_VERSION	"0.23"
 #define PROC_INTERFACE_VERSION	1
 
+#include <linux/compiler.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -1472,7 +1473,7 @@ static const struct file_operations keys
 	.write		= keys_proc_write,
 };
 
-static int version_proc_show(struct seq_file *m, void *v)
+static int __maybe_unused version_proc_show(struct seq_file *m, void *v)
 {
 	seq_printf(m, "driver:                  %s\n", TOSHIBA_ACPI_VERSION);
 	seq_printf(m, "proc_interface:          %d\n", PROC_INTERFACE_VERSION);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/rtc/rtc-bq4802.c linux-libre-4.4.158-gnu/drivers/rtc/rtc-bq4802.c
--- linux-libre-4.4.157-gnu/drivers/rtc/rtc-bq4802.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/rtc/rtc-bq4802.c	2018-09-26 02:35:10.000000000 -0400
@@ -164,6 +164,10 @@ static int bq4802_probe(struct platform_
 	} else if (p->r->flags & IORESOURCE_MEM) {
 		p->regs = devm_ioremap(&pdev->dev, p->r->start,
 					resource_size(p->r));
+		if (!p->regs){
+			err = -ENOMEM;
+			goto out;
+		}
 		p->read = bq4802_read_mem;
 		p->write = bq4802_write_mem;
 	} else {
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/s390/net/qeth_core_main.c linux-libre-4.4.158-gnu/drivers/s390/net/qeth_core_main.c
--- linux-libre-4.4.157-gnu/drivers/s390/net/qeth_core_main.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/s390/net/qeth_core_main.c	2018-09-26 02:35:10.000000000 -0400
@@ -3505,13 +3505,14 @@ static void qeth_flush_buffers(struct qe
 	qdio_flags = QDIO_FLAG_SYNC_OUTPUT;
 	if (atomic_read(&queue->set_pci_flags_count))
 		qdio_flags |= QDIO_FLAG_PCI_OUT;
+	atomic_add(count, &queue->used_buffers);
+
 	rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags,
 		     queue->queue_no, index, count);
 	if (queue->card->options.performance_stats)
 		queue->card->perf_stats.outbound_do_qdio_time +=
 			qeth_get_micros() -
 			queue->card->perf_stats.outbound_do_qdio_start_time;
-	atomic_add(count, &queue->used_buffers);
 	if (rc) {
 		queue->card->stats.tx_errors += count;
 		/* ignore temporary SIGA errors without busy condition */
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/s390/net/qeth_core_sys.c linux-libre-4.4.158-gnu/drivers/s390/net/qeth_core_sys.c
--- linux-libre-4.4.157-gnu/drivers/s390/net/qeth_core_sys.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/s390/net/qeth_core_sys.c	2018-09-26 02:35:10.000000000 -0400
@@ -419,6 +419,7 @@ static ssize_t qeth_dev_layer2_store(str
 	if (card->discipline) {
 		card->discipline->remove(card->gdev);
 		qeth_core_free_discipline(card);
+		card->options.layer2 = -1;
 	}
 
 	rc = qeth_core_load_discipline(card, newdis);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/class/cdc-wdm.c linux-libre-4.4.158-gnu/drivers/usb/class/cdc-wdm.c
--- linux-libre-4.4.157-gnu/drivers/usb/class/cdc-wdm.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/class/cdc-wdm.c	2018-09-26 02:35:10.000000000 -0400
@@ -453,7 +453,7 @@ static int clear_wdm_read_flag(struct wd
 
 	set_bit(WDM_RESPONDING, &desc->flags);
 	spin_unlock_irq(&desc->iuspin);
-	rv = usb_submit_urb(desc->response, GFP_KERNEL);
+	rv = usb_submit_urb(desc->response, GFP_ATOMIC);
 	spin_lock_irq(&desc->iuspin);
 	if (rv) {
 		dev_err(&desc->intf->dev,
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/core/hcd-pci.c linux-libre-4.4.158-gnu/drivers/usb/core/hcd-pci.c
--- linux-libre-4.4.157-gnu/drivers/usb/core/hcd-pci.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/core/hcd-pci.c	2018-09-26 02:35:10.000000000 -0400
@@ -529,8 +529,6 @@ static int resume_common(struct device *
 				event == PM_EVENT_RESTORE);
 		if (retval) {
 			dev_err(dev, "PCI post-resume error %d!\n", retval);
-			if (hcd->shared_hcd)
-				usb_hc_died(hcd->shared_hcd);
 			usb_hc_died(hcd);
 		}
 	}
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/core/message.c linux-libre-4.4.158-gnu/drivers/usb/core/message.c
--- linux-libre-4.4.157-gnu/drivers/usb/core/message.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/core/message.c	2018-09-26 02:35:10.000000000 -0400
@@ -1282,6 +1282,11 @@ void usb_enable_interface(struct usb_dev
  * is submitted that needs that bandwidth.  Some other operating systems
  * allocate bandwidth early, when a configuration is chosen.
  *
+ * xHCI reserves bandwidth and configures the alternate setting in
+ * usb_hcd_alloc_bandwidth(). If it fails the original interface altsetting
+ * may be disabled. Drivers cannot rely on any particular alternate
+ * setting being in effect after a failure.
+ *
  * This call is synchronous, and may not be used in an interrupt context.
  * Also, drivers must not change altsettings while urbs are scheduled for
  * endpoints in that interface; all such urbs must first be completed
@@ -1317,6 +1322,12 @@ int usb_set_interface(struct usb_device
 			 alternate);
 		return -EINVAL;
 	}
+	/*
+	 * usb3 hosts configure the interface in usb_hcd_alloc_bandwidth,
+	 * including freeing dropped endpoint ring buffers.
+	 * Make sure the interface endpoints are flushed before that
+	 */
+	usb_disable_interface(dev, iface, false);
 
 	/* Make sure we have enough bandwidth for this alternate interface.
 	 * Remove the current alt setting and add the new alt setting.
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/core/quirks.c linux-libre-4.4.158-gnu/drivers/usb/core/quirks.c
--- linux-libre-4.4.157-gnu/drivers/usb/core/quirks.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/core/quirks.c	2018-09-26 02:35:10.000000000 -0400
@@ -37,6 +37,10 @@ static const struct usb_device_id usb_qu
 	/* CBM - Flash disk */
 	{ USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME },
 
+	/* WORLDE Controller KS49 or Prodipe MIDI 49C USB controller */
+	{ USB_DEVICE(0x0218, 0x0201), .driver_info =
+			USB_QUIRK_CONFIG_INTF_STRINGS },
+
 	/* WORLDE easy key (easykey.25) MIDI controller  */
 	{ USB_DEVICE(0x0218, 0x0401), .driver_info =
 			USB_QUIRK_CONFIG_INTF_STRINGS },
@@ -259,6 +263,9 @@ static const struct usb_device_id usb_qu
 	{ USB_DEVICE(0x2040, 0x7200), .driver_info =
 			USB_QUIRK_CONFIG_INTF_STRINGS },
 
+	/* DJI CineSSD */
+	{ USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
+
 	/* INTEL VALUE SSD */
 	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/gadget/udc/net2280.c linux-libre-4.4.158-gnu/drivers/usb/gadget/udc/net2280.c
--- linux-libre-4.4.157-gnu/drivers/usb/gadget/udc/net2280.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/gadget/udc/net2280.c	2018-09-26 02:35:10.000000000 -0400
@@ -1542,11 +1542,14 @@ static int net2280_pullup(struct usb_gad
 		writel(tmp | BIT(USB_DETECT_ENABLE), &dev->usb->usbctl);
 	} else {
 		writel(tmp & ~BIT(USB_DETECT_ENABLE), &dev->usb->usbctl);
-		stop_activity(dev, dev->driver);
+		stop_activity(dev, NULL);
 	}
 
 	spin_unlock_irqrestore(&dev->lock, flags);
 
+	if (!is_on && dev->driver)
+		dev->driver->disconnect(&dev->gadget);
+
 	return 0;
 }
 
@@ -2425,8 +2428,11 @@ static void stop_activity(struct net2280
 		nuke(&dev->ep[i]);
 
 	/* report disconnect; the driver is already quiesced */
-	if (driver)
+	if (driver) {
+		spin_unlock(&dev->lock);
 		driver->disconnect(&dev->gadget);
+		spin_lock(&dev->lock);
+	}
 
 	usb_reinit(dev);
 }
@@ -3272,6 +3278,8 @@ next_endpoints:
 		BIT(PCI_RETRY_ABORT_INTERRUPT))
 
 static void handle_stat1_irqs(struct net2280 *dev, u32 stat)
+__releases(dev->lock)
+__acquires(dev->lock)
 {
 	struct net2280_ep	*ep;
 	u32			tmp, num, mask, scratch;
@@ -3312,12 +3320,14 @@ static void handle_stat1_irqs(struct net
 			if (disconnect || reset) {
 				stop_activity(dev, dev->driver);
 				ep0_start(dev);
+				spin_unlock(&dev->lock);
 				if (reset)
 					usb_gadget_udc_reset
 						(&dev->gadget, dev->driver);
 				else
 					(dev->driver->disconnect)
 						(&dev->gadget);
+				spin_lock(&dev->lock);
 				return;
 			}
 		}
@@ -3336,6 +3346,7 @@ static void handle_stat1_irqs(struct net
 	tmp = BIT(SUSPEND_REQUEST_CHANGE_INTERRUPT);
 	if (stat & tmp) {
 		writel(tmp, &dev->regs->irqstat1);
+		spin_unlock(&dev->lock);
 		if (stat & BIT(SUSPEND_REQUEST_INTERRUPT)) {
 			if (dev->driver->suspend)
 				dev->driver->suspend(&dev->gadget);
@@ -3346,6 +3357,7 @@ static void handle_stat1_irqs(struct net
 				dev->driver->resume(&dev->gadget);
 			/* at high speed, note erratum 0133 */
 		}
+		spin_lock(&dev->lock);
 		stat &= ~tmp;
 	}
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/host/u132-hcd.c linux-libre-4.4.158-gnu/drivers/usb/host/u132-hcd.c
--- linux-libre-4.4.157-gnu/drivers/usb/host/u132-hcd.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/host/u132-hcd.c	2018-09-26 02:35:10.000000000 -0400
@@ -2565,7 +2565,7 @@ static int u132_get_frame(struct usb_hcd
 	} else {
 		int frame = 0;
 		dev_err(&u132->platform_dev->dev, "TODO: u132_get_frame\n");
-		msleep(100);
+		mdelay(100);
 		return frame;
 	}
 }
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/misc/uss720.c linux-libre-4.4.158-gnu/drivers/usb/misc/uss720.c
--- linux-libre-4.4.157-gnu/drivers/usb/misc/uss720.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/misc/uss720.c	2018-09-26 02:35:10.000000000 -0400
@@ -388,7 +388,7 @@ static unsigned char parport_uss720_frob
 	mask &= 0x0f;
 	val &= 0x0f;
 	d = (priv->reg[1] & (~mask)) ^ val;
-	if (set_1284_register(pp, 2, d, GFP_KERNEL))
+	if (set_1284_register(pp, 2, d, GFP_ATOMIC))
 		return 0;
 	priv->reg[1] = d;
 	return d & 0xf;
@@ -398,7 +398,7 @@ static unsigned char parport_uss720_read
 {
 	unsigned char ret;
 
-	if (get_1284_register(pp, 1, &ret, GFP_KERNEL))
+	if (get_1284_register(pp, 1, &ret, GFP_ATOMIC))
 		return 0;
 	return ret & 0xf8;
 }
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/misc/yurex.c linux-libre-4.4.158-gnu/drivers/usb/misc/yurex.c
--- linux-libre-4.4.157-gnu/drivers/usb/misc/yurex.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/misc/yurex.c	2018-09-26 02:35:10.000000000 -0400
@@ -439,13 +439,13 @@ static ssize_t yurex_write(struct file *
 {
 	struct usb_yurex *dev;
 	int i, set = 0, retval = 0;
-	char buffer[16];
+	char buffer[16 + 1];
 	char *data = buffer;
 	unsigned long long c, c2 = 0;
 	signed long timeout = 0;
 	DEFINE_WAIT(wait);
 
-	count = min(sizeof(buffer), count);
+	count = min(sizeof(buffer) - 1, count);
 	dev = file->private_data;
 
 	/* verify that we actually have some data to write */
@@ -464,6 +464,7 @@ static ssize_t yurex_write(struct file *
 		retval = -EFAULT;
 		goto error;
 	}
+	buffer[count] = 0;
 	memset(dev->cntl_buffer, CMD_PADDING, YUREX_BUF_SIZE);
 
 	switch (buffer[0]) {
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/serial/io_ti.h linux-libre-4.4.158-gnu/drivers/usb/serial/io_ti.h
--- linux-libre-4.4.157-gnu/drivers/usb/serial/io_ti.h	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/serial/io_ti.h	2018-09-26 02:35:10.000000000 -0400
@@ -178,7 +178,7 @@ struct ump_interrupt {
 }  __attribute__((packed));
 
 
-#define TIUMP_GET_PORT_FROM_CODE(c)	(((c) >> 4) - 3)
+#define TIUMP_GET_PORT_FROM_CODE(c)	(((c) >> 6) & 0x01)
 #define TIUMP_GET_FUNC_FROM_CODE(c)	((c) & 0x0f)
 #define TIUMP_INTERRUPT_CODE_LSR	0x03
 #define TIUMP_INTERRUPT_CODE_MSR	0x04
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/serial/ti_usb_3410_5052.h linux-libre-4.4.158-gnu/drivers/usb/serial/ti_usb_3410_5052.h
--- linux-libre-4.4.157-gnu/drivers/usb/serial/ti_usb_3410_5052.h	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/serial/ti_usb_3410_5052.h	2018-09-26 02:35:10.000000000 -0400
@@ -227,7 +227,7 @@ struct ti_interrupt {
 } __attribute__((packed));
 
 /* Interrupt codes */
-#define TI_GET_PORT_FROM_CODE(c)	(((c) >> 4) - 3)
+#define TI_GET_PORT_FROM_CODE(c)	(((c) >> 6) & 0x01)
 #define TI_GET_FUNC_FROM_CODE(c)	((c) & 0x0f)
 #define TI_CODE_HARDWARE_ERROR		0xFF
 #define TI_CODE_DATA_ERROR		0x03
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/storage/scsiglue.c linux-libre-4.4.158-gnu/drivers/usb/storage/scsiglue.c
--- linux-libre-4.4.157-gnu/drivers/usb/storage/scsiglue.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/storage/scsiglue.c	2018-09-26 02:35:10.000000000 -0400
@@ -341,6 +341,15 @@ static int queuecommand_lck(struct scsi_
 		return 0;
 	}
 
+	if ((us->fflags & US_FL_NO_ATA_1X) &&
+			(srb->cmnd[0] == ATA_12 || srb->cmnd[0] == ATA_16)) {
+		memcpy(srb->sense_buffer, usb_stor_sense_invalidCDB,
+		       sizeof(usb_stor_sense_invalidCDB));
+		srb->result = SAM_STAT_CHECK_CONDITION;
+		done(srb);
+		return 0;
+	}
+
 	/* enqueue the command and wake up the control thread */
 	srb->scsi_done = done;
 	us->srb = srb;
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/usb/storage/unusual_devs.h linux-libre-4.4.158-gnu/drivers/usb/storage/unusual_devs.h
--- linux-libre-4.4.157-gnu/drivers/usb/storage/unusual_devs.h	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/usb/storage/unusual_devs.h	2018-09-26 02:35:10.000000000 -0400
@@ -2213,6 +2213,13 @@ UNUSUAL_DEV(  0x4146, 0xba01, 0x0100, 0x
 		"Micro Mini 1GB",
 		USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ),
 
+/* Reported-by: Tim Anderson <tsa@biglakesoftware.com> */
+UNUSUAL_DEV(  0x2ca3, 0x0031, 0x0000, 0x9999,
+		"DJI",
+		"CineSSD",
+		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
+		US_FL_NO_ATA_1X),
+
 /*
  * Nick Bowler <nbowler@elliptictech.com>
  * SCSI stack spams (otherwise harmless) error messages.
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/video/fbdev/core/modedb.c linux-libre-4.4.158-gnu/drivers/video/fbdev/core/modedb.c
--- linux-libre-4.4.157-gnu/drivers/video/fbdev/core/modedb.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/video/fbdev/core/modedb.c	2018-09-26 02:35:10.000000000 -0400
@@ -644,7 +644,7 @@ static int fb_try_mode(struct fb_var_scr
  *
  *     Valid mode specifiers for @mode_option:
  *
- *     <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or
+ *     <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][p][m] or
  *     <name>[-<bpp>][@<refresh>]
  *
  *     with <xres>, <yres>, <bpp> and <refresh> decimal numbers and
@@ -653,10 +653,10 @@ static int fb_try_mode(struct fb_var_scr
  *      If 'M' is present after yres (and before refresh/bpp if present),
  *      the function will compute the timings using VESA(tm) Coordinated
  *      Video Timings (CVT).  If 'R' is present after 'M', will compute with
- *      reduced blanking (for flatpanels).  If 'i' is present, compute
- *      interlaced mode.  If 'm' is present, add margins equal to 1.8%
- *      of xres rounded down to 8 pixels, and 1.8% of yres. The char
- *      'i' and 'm' must be after 'M' and 'R'. Example:
+ *      reduced blanking (for flatpanels).  If 'i' or 'p' are present, compute
+ *      interlaced or progressive mode.  If 'm' is present, add margins equal
+ *      to 1.8% of xres rounded down to 8 pixels, and 1.8% of yres. The chars
+ *      'i', 'p' and 'm' must be after 'M' and 'R'. Example:
  *
  *      1024x768MR-8@60m - Reduced blank with margins at 60Hz.
  *
@@ -697,7 +697,8 @@ int fb_find_mode(struct fb_var_screeninf
 		unsigned int namelen = strlen(name);
 		int res_specified = 0, bpp_specified = 0, refresh_specified = 0;
 		unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0;
-		int yres_specified = 0, cvt = 0, rb = 0, interlace = 0;
+		int yres_specified = 0, cvt = 0, rb = 0;
+		int interlace_specified = 0, interlace = 0;
 		int margins = 0;
 		u32 best, diff, tdiff;
 
@@ -748,9 +749,17 @@ int fb_find_mode(struct fb_var_screeninf
 				if (!cvt)
 					margins = 1;
 				break;
+			case 'p':
+				if (!cvt) {
+					interlace = 0;
+					interlace_specified = 1;
+				}
+				break;
 			case 'i':
-				if (!cvt)
+				if (!cvt) {
 					interlace = 1;
+					interlace_specified = 1;
+				}
 				break;
 			default:
 				goto done;
@@ -819,11 +828,21 @@ done:
 			if ((name_matches(db[i], name, namelen) ||
 			     (res_specified && res_matches(db[i], xres, yres))) &&
 			    !fb_try_mode(var, info, &db[i], bpp)) {
-				if (refresh_specified && db[i].refresh == refresh)
-					return 1;
+				const int db_interlace = (db[i].vmode &
+					FB_VMODE_INTERLACED ? 1 : 0);
+				int score = abs(db[i].refresh - refresh);
 
-				if (abs(db[i].refresh - refresh) < diff) {
-					diff = abs(db[i].refresh - refresh);
+				if (interlace_specified)
+					score += abs(db_interlace - interlace);
+
+				if (!interlace_specified ||
+				    db_interlace == interlace)
+					if (refresh_specified &&
+					    db[i].refresh == refresh)
+						return 1;
+
+				if (score < diff) {
+					diff = score;
 					best = i;
 				}
 			}
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/video/fbdev/goldfishfb.c linux-libre-4.4.158-gnu/drivers/video/fbdev/goldfishfb.c
--- linux-libre-4.4.157-gnu/drivers/video/fbdev/goldfishfb.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/video/fbdev/goldfishfb.c	2018-09-26 02:35:10.000000000 -0400
@@ -301,6 +301,7 @@ static int goldfish_fb_remove(struct pla
 	dma_free_coherent(&pdev->dev, framesize, (void *)fb->fb.screen_base,
 						fb->fb.fix.smem_start);
 	iounmap(fb->reg_base);
+	kfree(fb);
 	return 0;
 }
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/video/fbdev/omap/omapfb_main.c linux-libre-4.4.158-gnu/drivers/video/fbdev/omap/omapfb_main.c
--- linux-libre-4.4.157-gnu/drivers/video/fbdev/omap/omapfb_main.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/video/fbdev/omap/omapfb_main.c	2018-09-26 02:35:10.000000000 -0400
@@ -977,7 +977,7 @@ int omapfb_register_client(struct omapfb
 {
 	int r;
 
-	if ((unsigned)omapfb_nb->plane_idx > OMAPFB_PLANE_NUM)
+	if ((unsigned)omapfb_nb->plane_idx >= OMAPFB_PLANE_NUM)
 		return -EINVAL;
 
 	if (!notifier_inited) {
diff -druNp --no-dereference linux-libre-4.4.157-gnu/drivers/video/fbdev/via/viafbdev.c linux-libre-4.4.158-gnu/drivers/video/fbdev/via/viafbdev.c
--- linux-libre-4.4.157-gnu/drivers/video/fbdev/via/viafbdev.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/drivers/video/fbdev/via/viafbdev.c	2018-09-26 02:35:10.000000000 -0400
@@ -19,6 +19,7 @@
  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
+#include <linux/compiler.h>
 #include <linux/module.h>
 #include <linux/seq_file.h>
 #include <linux/slab.h>
@@ -1468,7 +1469,7 @@ static const struct file_operations viaf
 
 #endif /* CONFIG_FB_VIA_DIRECT_PROCFS */
 
-static int viafb_sup_odev_proc_show(struct seq_file *m, void *v)
+static int __maybe_unused viafb_sup_odev_proc_show(struct seq_file *m, void *v)
 {
 	via_odev_to_seq(m, supported_odev_map[
 		viaparinfo->shared->chip_info.gfx_chip_name]);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/fs/binfmt_elf.c linux-libre-4.4.158-gnu/fs/binfmt_elf.c
--- linux-libre-4.4.157-gnu/fs/binfmt_elf.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/fs/binfmt_elf.c	2018-09-26 02:35:10.000000000 -0400
@@ -1707,7 +1707,7 @@ static int fill_thread_core_info(struct
 		const struct user_regset *regset = &view->regsets[i];
 		do_thread_regset_writeback(t->task, regset);
 		if (regset->core_note_type && regset->get &&
-		    (!regset->active || regset->active(t->task, regset))) {
+		    (!regset->active || regset->active(t->task, regset) > 0)) {
 			int ret;
 			size_t size = regset->n * regset->size;
 			void *data = kmalloc(size, GFP_KERNEL);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/fs/cifs/readdir.c linux-libre-4.4.158-gnu/fs/cifs/readdir.c
--- linux-libre-4.4.157-gnu/fs/cifs/readdir.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/fs/cifs/readdir.c	2018-09-26 02:35:10.000000000 -0400
@@ -373,8 +373,15 @@ static char *nxt_dir_entry(char *old_ent
 
 		new_entry = old_entry + sizeof(FIND_FILE_STANDARD_INFO) +
 				pfData->FileNameLength;
-	} else
-		new_entry = old_entry + le32_to_cpu(pDirInfo->NextEntryOffset);
+	} else {
+		u32 next_offset = le32_to_cpu(pDirInfo->NextEntryOffset);
+
+		if (old_entry + next_offset < old_entry) {
+			cifs_dbg(VFS, "invalid offset %u\n", next_offset);
+			return NULL;
+		}
+		new_entry = old_entry + next_offset;
+	}
 	cifs_dbg(FYI, "new entry %p old entry %p\n", new_entry, old_entry);
 	/* validate that new_entry is not past end of SMB */
 	if (new_entry >= end_of_smb) {
diff -druNp --no-dereference linux-libre-4.4.157-gnu/fs/cifs/smb2pdu.c linux-libre-4.4.158-gnu/fs/cifs/smb2pdu.c
--- linux-libre-4.4.157-gnu/fs/cifs/smb2pdu.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/fs/cifs/smb2pdu.c	2018-09-26 02:35:10.000000000 -0400
@@ -2402,33 +2402,38 @@ num_entries(char *bufstart, char *end_of
 	int len;
 	unsigned int entrycount = 0;
 	unsigned int next_offset = 0;
-	FILE_DIRECTORY_INFO *entryptr;
+	char *entryptr;
+	FILE_DIRECTORY_INFO *dir_info;
 
 	if (bufstart == NULL)
 		return 0;
 
-	entryptr = (FILE_DIRECTORY_INFO *)bufstart;
+	entryptr = bufstart;
 
 	while (1) {
-		entryptr = (FILE_DIRECTORY_INFO *)
-					((char *)entryptr + next_offset);
-
-		if ((char *)entryptr + size > end_of_buf) {
+		if (entryptr + next_offset < entryptr ||
+		    entryptr + next_offset > end_of_buf ||
+		    entryptr + next_offset + size > end_of_buf) {
 			cifs_dbg(VFS, "malformed search entry would overflow\n");
 			break;
 		}
 
-		len = le32_to_cpu(entryptr->FileNameLength);
-		if ((char *)entryptr + len + size > end_of_buf) {
+		entryptr = entryptr + next_offset;
+		dir_info = (FILE_DIRECTORY_INFO *)entryptr;
+
+		len = le32_to_cpu(dir_info->FileNameLength);
+		if (entryptr + len < entryptr ||
+		    entryptr + len > end_of_buf ||
+		    entryptr + len + size > end_of_buf) {
 			cifs_dbg(VFS, "directory entry name would overflow frame end of buf %p\n",
 				 end_of_buf);
 			break;
 		}
 
-		*lastentry = (char *)entryptr;
+		*lastentry = entryptr;
 		entrycount++;
 
-		next_offset = le32_to_cpu(entryptr->NextEntryOffset);
+		next_offset = le32_to_cpu(dir_info->NextEntryOffset);
 		if (!next_offset)
 			break;
 	}
diff -druNp --no-dereference linux-libre-4.4.157-gnu/fs/gfs2/bmap.c linux-libre-4.4.158-gnu/fs/gfs2/bmap.c
--- linux-libre-4.4.157-gnu/fs/gfs2/bmap.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/fs/gfs2/bmap.c	2018-09-26 02:35:10.000000000 -0400
@@ -1476,7 +1476,7 @@ int gfs2_write_alloc_required(struct gfs
 	end_of_file = (i_size_read(&ip->i_inode) + sdp->sd_sb.sb_bsize - 1) >> shift;
 	lblock = offset >> shift;
 	lblock_stop = (offset + len + sdp->sd_sb.sb_bsize - 1) >> shift;
-	if (lblock_stop > end_of_file)
+	if (lblock_stop > end_of_file && ip != GFS2_I(sdp->sd_rindex))
 		return 1;
 
 	size = (lblock_stop - lblock) << shift;
diff -druNp --no-dereference linux-libre-4.4.157-gnu/fs/pstore/ram_core.c linux-libre-4.4.158-gnu/fs/pstore/ram_core.c
--- linux-libre-4.4.157-gnu/fs/pstore/ram_core.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/fs/pstore/ram_core.c	2018-09-26 02:35:10.000000000 -0400
@@ -378,7 +378,12 @@ static void *persistent_ram_vmap(phys_ad
 	vaddr = vmap(pages, page_count, VM_MAP, prot);
 	kfree(pages);
 
-	return vaddr;
+	/*
+	 * Since vmap() uses page granularity, we must add the offset
+	 * into the page here, to get the byte granularity address
+	 * into the mapping to represent the actual "start" location.
+	 */
+	return vaddr + offset_in_page(start);
 }
 
 static void *persistent_ram_iomap(phys_addr_t start, size_t size,
@@ -397,6 +402,11 @@ static void *persistent_ram_iomap(phys_a
 	else
 		va = ioremap_wc(start, size);
 
+	/*
+	 * Since request_mem_region() and ioremap() are byte-granularity
+	 * there is no need handle anything special like we do when the
+	 * vmap() case in persistent_ram_vmap() above.
+	 */
 	return va;
 }
 
@@ -417,7 +427,7 @@ static int persistent_ram_buffer_map(phy
 		return -ENOMEM;
 	}
 
-	prz->buffer = prz->vaddr + offset_in_page(start);
+	prz->buffer = prz->vaddr;
 	prz->buffer_size = size - sizeof(struct persistent_ram_buffer);
 
 	return 0;
@@ -464,7 +474,8 @@ void persistent_ram_free(struct persiste
 
 	if (prz->vaddr) {
 		if (pfn_valid(prz->paddr >> PAGE_SHIFT)) {
-			vunmap(prz->vaddr);
+			/* We must vunmap() at page-granularity. */
+			vunmap(prz->vaddr - offset_in_page(prz->paddr));
 		} else {
 			iounmap(prz->vaddr);
 			release_mem_region(prz->paddr, prz->size);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/kernel/audit_watch.c linux-libre-4.4.158-gnu/kernel/audit_watch.c
--- linux-libre-4.4.157-gnu/kernel/audit_watch.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/kernel/audit_watch.c	2018-09-26 02:35:10.000000000 -0400
@@ -419,6 +419,13 @@ int audit_add_watch(struct audit_krule *
 	struct path parent_path;
 	int h, ret = 0;
 
+	/*
+	 * When we will be calling audit_add_to_parent, krule->watch might have
+	 * been updated and watch might have been freed.
+	 * So we need to keep a reference of watch.
+	 */
+	audit_get_watch(watch);
+
 	mutex_unlock(&audit_filter_mutex);
 
 	/* Avoid calling path_lookup under audit_filter_mutex. */
@@ -427,8 +434,10 @@ int audit_add_watch(struct audit_krule *
 	/* caller expects mutex locked */
 	mutex_lock(&audit_filter_mutex);
 
-	if (ret)
+	if (ret) {
+		audit_put_watch(watch);
 		return ret;
+	}
 
 	/* either find an old parent or attach a new one */
 	parent = audit_find_parent(d_backing_inode(parent_path.dentry));
@@ -446,6 +455,7 @@ int audit_add_watch(struct audit_krule *
 	*list = &audit_inode_hash[h];
 error:
 	path_put(&parent_path);
+	audit_put_watch(watch);
 	return ret;
 }
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/Makefile linux-libre-4.4.158-gnu/Makefile
--- linux-libre-4.4.157-gnu/Makefile	2018-09-19 23:06:46.000000000 -0400
+++ linux-libre-4.4.158-gnu/Makefile	2018-09-26 13:20:43.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 4
-SUBLEVEL = 157
+SUBLEVEL = 158
 EXTRAVERSION = -gnu
 NAME = Blurry Fish Butt
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/net/mac80211/cfg.c linux-libre-4.4.158-gnu/net/mac80211/cfg.c
--- linux-libre-4.4.157-gnu/net/mac80211/cfg.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/net/mac80211/cfg.c	2018-09-26 02:35:10.000000000 -0400
@@ -286,7 +286,7 @@ static int ieee80211_del_key(struct wiph
 		goto out_unlock;
 	}
 
-	ieee80211_key_free(key, true);
+	ieee80211_key_free(key, sdata->vif.type == NL80211_IFTYPE_STATION);
 
 	ret = 0;
  out_unlock:
diff -druNp --no-dereference linux-libre-4.4.157-gnu/net/mac80211/key.c linux-libre-4.4.158-gnu/net/mac80211/key.c
--- linux-libre-4.4.157-gnu/net/mac80211/key.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/net/mac80211/key.c	2018-09-26 02:35:10.000000000 -0400
@@ -647,11 +647,15 @@ int ieee80211_key_link(struct ieee80211_
 {
 	struct ieee80211_local *local = sdata->local;
 	struct ieee80211_key *old_key;
-	int idx, ret;
-	bool pairwise;
-
-	pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE;
-	idx = key->conf.keyidx;
+	int idx = key->conf.keyidx;
+	bool pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE;
+	/*
+	 * We want to delay tailroom updates only for station - in that
+	 * case it helps roaming speed, but in other cases it hurts and
+	 * can cause warnings to appear.
+	 */
+	bool delay_tailroom = sdata->vif.type == NL80211_IFTYPE_STATION;
+	int ret;
 
 	mutex_lock(&sdata->local->key_mtx);
 
@@ -679,14 +683,14 @@ int ieee80211_key_link(struct ieee80211_
 	increment_tailroom_need_count(sdata);
 
 	ieee80211_key_replace(sdata, sta, pairwise, old_key, key);
-	ieee80211_key_destroy(old_key, true);
+	ieee80211_key_destroy(old_key, delay_tailroom);
 
 	ieee80211_debugfs_key_add(key);
 
 	if (!local->wowlan) {
 		ret = ieee80211_key_enable_hw_accel(key);
 		if (ret)
-			ieee80211_key_free(key, true);
+			ieee80211_key_free(key, delay_tailroom);
 	} else {
 		ret = 0;
 	}
@@ -874,7 +878,8 @@ void ieee80211_free_sta_keys(struct ieee
 		ieee80211_key_replace(key->sdata, key->sta,
 				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
 				key, NULL);
-		__ieee80211_key_destroy(key, true);
+		__ieee80211_key_destroy(key, key->sdata->vif.type ==
+					NL80211_IFTYPE_STATION);
 	}
 
 	for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
@@ -884,7 +889,8 @@ void ieee80211_free_sta_keys(struct ieee
 		ieee80211_key_replace(key->sdata, key->sta,
 				key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
 				key, NULL);
-		__ieee80211_key_destroy(key, true);
+		__ieee80211_key_destroy(key, key->sdata->vif.type ==
+					NL80211_IFTYPE_STATION);
 	}
 
 	mutex_unlock(&local->key_mtx);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/net/xfrm/xfrm_policy.c linux-libre-4.4.158-gnu/net/xfrm/xfrm_policy.c
--- linux-libre-4.4.157-gnu/net/xfrm/xfrm_policy.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/net/xfrm/xfrm_policy.c	2018-09-26 02:35:10.000000000 -0400
@@ -1845,7 +1845,10 @@ xfrm_resolve_and_create_bundle(struct xf
 	/* Try to instantiate a bundle */
 	err = xfrm_tmpl_resolve(pols, num_pols, fl, xfrm, family);
 	if (err <= 0) {
-		if (err != 0 && err != -EAGAIN)
+		if (err == 0)
+			return NULL;
+
+		if (err != -EAGAIN)
 			XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTPOLERROR);
 		return ERR_PTR(err);
 	}
diff -druNp --no-dereference linux-libre-4.4.157-gnu/scripts/Kbuild.include linux-libre-4.4.158-gnu/scripts/Kbuild.include
--- linux-libre-4.4.157-gnu/scripts/Kbuild.include	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/scripts/Kbuild.include	2018-09-26 02:35:10.000000000 -0400
@@ -359,3 +359,6 @@ endif
 endef
 #
 ###############################################################################
+
+# delete partially updated (i.e. corrupted) files on error
+.DELETE_ON_ERROR:
diff -druNp --no-dereference linux-libre-4.4.157-gnu/sound/core/pcm_lib.c linux-libre-4.4.158-gnu/sound/core/pcm_lib.c
--- linux-libre-4.4.157-gnu/sound/core/pcm_lib.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/sound/core/pcm_lib.c	2018-09-26 02:35:10.000000000 -0400
@@ -648,27 +648,33 @@ EXPORT_SYMBOL(snd_interval_refine);
 
 static int snd_interval_refine_first(struct snd_interval *i)
 {
+	const unsigned int last_max = i->max;
+
 	if (snd_BUG_ON(snd_interval_empty(i)))
 		return -EINVAL;
 	if (snd_interval_single(i))
 		return 0;
 	i->max = i->min;
-	i->openmax = i->openmin;
-	if (i->openmax)
+	if (i->openmin)
 		i->max++;
+	/* only exclude max value if also excluded before refine */
+	i->openmax = (i->openmax && i->max >= last_max);
 	return 1;
 }
 
 static int snd_interval_refine_last(struct snd_interval *i)
 {
+	const unsigned int last_min = i->min;
+
 	if (snd_BUG_ON(snd_interval_empty(i)))
 		return -EINVAL;
 	if (snd_interval_single(i))
 		return 0;
 	i->min = i->max;
-	i->openmin = i->openmax;
-	if (i->openmin)
+	if (i->openmax)
 		i->min--;
+	/* only exclude min value if also excluded before refine */
+	i->openmin = (i->openmin && i->min <= last_min);
 	return 1;
 }
 
diff -druNp --no-dereference linux-libre-4.4.157-gnu/sound/isa/msnd/msnd_pinnacle.c linux-libre-4.4.158-gnu/sound/isa/msnd/msnd_pinnacle.c
--- linux-libre-4.4.157-gnu/sound/isa/msnd/msnd_pinnacle.c	2018-09-19 23:37:50.000000000 -0400
+++ linux-libre-4.4.158-gnu/sound/isa/msnd/msnd_pinnacle.c	2018-09-26 13:49:19.000000000 -0400
@@ -82,10 +82,10 @@
 
 static void set_default_audio_parameters(struct snd_msnd *chip)
 {
-	chip->play_sample_size = DEFSAMPLESIZE;
+	chip->play_sample_size = snd_pcm_format_width(DEFSAMPLESIZE);
 	chip->play_sample_rate = DEFSAMPLERATE;
 	chip->play_channels = DEFCHANNELS;
-	chip->capture_sample_size = DEFSAMPLESIZE;
+	chip->capture_sample_size = snd_pcm_format_width(DEFSAMPLESIZE);
 	chip->capture_sample_rate = DEFSAMPLERATE;
 	chip->capture_channels = DEFCHANNELS;
 }
diff -druNp --no-dereference linux-libre-4.4.157-gnu/sound/usb/quirks-table.h linux-libre-4.4.158-gnu/sound/usb/quirks-table.h
--- linux-libre-4.4.157-gnu/sound/usb/quirks-table.h	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/sound/usb/quirks-table.h	2018-09-26 02:35:10.000000000 -0400
@@ -2875,7 +2875,8 @@ YAMAHA_DEVICE(0x7010, "UB99"),
  */
 
 #define AU0828_DEVICE(vid, pid, vname, pname) { \
-	USB_DEVICE_VENDOR_SPEC(vid, pid), \
+	.idVendor = vid, \
+	.idProduct = pid, \
 	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
 		       USB_DEVICE_ID_MATCH_INT_CLASS | \
 		       USB_DEVICE_ID_MATCH_INT_SUBCLASS, \
diff -druNp --no-dereference linux-libre-4.4.157-gnu/tools/hv/hv_kvp_daemon.c linux-libre-4.4.158-gnu/tools/hv/hv_kvp_daemon.c
--- linux-libre-4.4.157-gnu/tools/hv/hv_kvp_daemon.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/tools/hv/hv_kvp_daemon.c	2018-09-26 02:35:10.000000000 -0400
@@ -286,7 +286,7 @@ static int kvp_key_delete(int pool, cons
 		 * Found a match; just move the remaining
 		 * entries up.
 		 */
-		if (i == num_records) {
+		if (i == (num_records - 1)) {
 			kvp_file_info[pool].num_records--;
 			kvp_update_file(pool);
 			return 0;
diff -druNp --no-dereference linux-libre-4.4.157-gnu/tools/perf/arch/powerpc/util/skip-callchain-idx.c linux-libre-4.4.158-gnu/tools/perf/arch/powerpc/util/skip-callchain-idx.c
--- linux-libre-4.4.157-gnu/tools/perf/arch/powerpc/util/skip-callchain-idx.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/tools/perf/arch/powerpc/util/skip-callchain-idx.c	2018-09-26 02:35:10.000000000 -0400
@@ -58,9 +58,13 @@ static int check_return_reg(int ra_regno
 	}
 
 	/*
-	 * Check if return address is on the stack.
+	 * Check if return address is on the stack. If return address
+	 * is in a register (typically R0), it is yet to be saved on
+	 * the stack.
 	 */
-	if (nops != 0 || ops != NULL)
+	if ((nops != 0 || ops != NULL) &&
+		!(nops == 1 && ops[0].atom == DW_OP_regx &&
+			ops[0].number2 == 0 && ops[0].offset == 0))
 		return 0;
 
 	/*
@@ -246,7 +250,7 @@ int arch_skip_callchain_idx(struct threa
 	if (!chain || chain->nr < 3)
 		return skip_slot;
 
-	ip = chain->ips[2];
+	ip = chain->ips[1];
 
 	thread__find_addr_location(thread, PERF_RECORD_MISC_USER,
 			MAP__FUNCTION, ip, &al);
diff -druNp --no-dereference linux-libre-4.4.157-gnu/tools/testing/selftests/timers/raw_skew.c linux-libre-4.4.158-gnu/tools/testing/selftests/timers/raw_skew.c
--- linux-libre-4.4.157-gnu/tools/testing/selftests/timers/raw_skew.c	2018-09-19 16:49:00.000000000 -0400
+++ linux-libre-4.4.158-gnu/tools/testing/selftests/timers/raw_skew.c	2018-09-26 02:35:10.000000000 -0400
@@ -146,6 +146,11 @@ int main(int argv, char **argc)
 	printf(" %lld.%i(act)", ppm/1000, abs((int)(ppm%1000)));
 
 	if (llabs(eppm - ppm) > 1000) {
+		if (tx1.offset || tx2.offset ||
+		    tx1.freq != tx2.freq || tx1.tick != tx2.tick) {
+			printf("	[SKIP]\n");
+			return ksft_exit_skip("The clock was adjusted externally. Shutdown NTPd or other time sync daemons\n");
+		}
 		printf("	[FAILED]\n");
 		return ksft_exit_fail();
 	}
