diff -druNp --no-dereference linux-libre-3.18.96-gnu/arch/arm64/kernel/traps.c linux-libre-3.18.97-gnu/arch/arm64/kernel/traps.c
--- linux-libre-3.18.96-gnu/arch/arm64/kernel/traps.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/arch/arm64/kernel/traps.c	2018-02-28 04:16:18.000000000 -0500
@@ -45,7 +45,7 @@ static const char *handler[]= {
 	"Error"
 };
 
-int show_unhandled_signals = 1;
+int show_unhandled_signals = 0;
 
 /*
  * Dump out the contents of some memory nicely...
diff -druNp --no-dereference linux-libre-3.18.96-gnu/arch/x86/oprofile/nmi_int.c linux-libre-3.18.97-gnu/arch/x86/oprofile/nmi_int.c
--- linux-libre-3.18.96-gnu/arch/x86/oprofile/nmi_int.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/arch/x86/oprofile/nmi_int.c	2018-02-28 04:16:18.000000000 -0500
@@ -471,7 +471,7 @@ static int nmi_setup(void)
 		goto fail;
 
 	for_each_possible_cpu(cpu) {
-		if (!cpu)
+		if (!IS_ENABLED(CONFIG_SMP) || !cpu)
 			continue;
 
 		memcpy(per_cpu(cpu_msrs, cpu).counters,
diff -druNp --no-dereference linux-libre-3.18.96-gnu/drivers/iio/imu/adis_trigger.c linux-libre-3.18.97-gnu/drivers/iio/imu/adis_trigger.c
--- linux-libre-3.18.96-gnu/drivers/iio/imu/adis_trigger.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/drivers/iio/imu/adis_trigger.c	2018-02-28 04:16:18.000000000 -0500
@@ -47,6 +47,10 @@ int adis_probe_trigger(struct adis *adis
 	if (adis->trig == NULL)
 		return -ENOMEM;
 
+	adis->trig->dev.parent = &adis->spi->dev;
+	adis->trig->ops = &adis_trigger_ops;
+	iio_trigger_set_drvdata(adis->trig, adis);
+
 	ret = request_irq(adis->spi->irq,
 			  &iio_trigger_generic_data_rdy_poll,
 			  IRQF_TRIGGER_RISING,
@@ -55,9 +59,6 @@ int adis_probe_trigger(struct adis *adis
 	if (ret)
 		goto error_free_trig;
 
-	adis->trig->dev.parent = &adis->spi->dev;
-	adis->trig->ops = &adis_trigger_ops;
-	iio_trigger_set_drvdata(adis->trig, adis);
 	ret = iio_trigger_register(adis->trig);
 
 	indio_dev->trig = iio_trigger_get(adis->trig);
diff -druNp --no-dereference linux-libre-3.18.96-gnu/drivers/iio/industrialio-buffer.c linux-libre-3.18.97-gnu/drivers/iio/industrialio-buffer.c
--- linux-libre-3.18.96-gnu/drivers/iio/industrialio-buffer.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/drivers/iio/industrialio-buffer.c	2018-02-28 04:16:18.000000000 -0500
@@ -92,7 +92,7 @@ unsigned int iio_buffer_poll(struct file
 	struct iio_dev *indio_dev = filp->private_data;
 	struct iio_buffer *rb = indio_dev->buffer;
 
-	if (!indio_dev->info)
+	if (!indio_dev->info || rb == NULL)
 		return 0;
 
 	poll_wait(filp, &rb->pollq, wait);
diff -druNp --no-dereference linux-libre-3.18.96-gnu/drivers/irqchip/irq-gic-v3.c linux-libre-3.18.97-gnu/drivers/irqchip/irq-gic-v3.c
--- linux-libre-3.18.96-gnu/drivers/irqchip/irq-gic-v3.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/drivers/irqchip/irq-gic-v3.c	2018-02-28 04:16:18.000000000 -0500
@@ -503,7 +503,7 @@ static void gic_raise_softirq(const stru
 	 * Ensure that stores to Normal memory are visible to the
 	 * other CPUs before issuing the IPI.
 	 */
-	smp_wmb();
+	wmb();
 
 	for_each_cpu_mask(cpu, *mask) {
 		u64 cluster_id = cpu_logical_map(cpu) & ~0xffUL;
diff -druNp --no-dereference linux-libre-3.18.96-gnu/drivers/pci/host/pci-keystone.c linux-libre-3.18.97-gnu/drivers/pci/host/pci-keystone.c
--- linux-libre-3.18.96-gnu/drivers/pci/host/pci-keystone.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/drivers/pci/host/pci-keystone.c	2018-02-28 04:16:18.000000000 -0500
@@ -179,14 +179,16 @@ static int ks_pcie_get_irq_controller_in
 	}
 
 	/* interrupt controller is in a child node */
-	*np_temp = of_find_node_by_name(np_pcie, controller);
+	*np_temp = of_get_child_by_name(np_pcie, controller);
 	if (!(*np_temp)) {
 		dev_err(dev, "Node for %s is absent\n", controller);
 		goto out;
 	}
 	temp = of_irq_count(*np_temp);
-	if (!temp)
+	if (!temp) {
+		of_node_put(*np_temp);
 		goto out;
+	}
 	if (temp > max_host_irqs)
 		dev_warn(dev, "Too many %s interrupts defined %u\n",
 			(legacy ? "legacy" : "MSI"), temp);
@@ -200,6 +202,9 @@ static int ks_pcie_get_irq_controller_in
 		if (host_irqs[temp] < 0)
 			break;
 	}
+
+	of_node_put(*np_temp);
+
 	if (temp) {
 		*num_irqs = temp;
 		ret = 0;
diff -druNp --no-dereference linux-libre-3.18.96-gnu/drivers/scsi/ibmvscsi/ibmvfc.h linux-libre-3.18.97-gnu/drivers/scsi/ibmvscsi/ibmvfc.h
--- linux-libre-3.18.96-gnu/drivers/scsi/ibmvscsi/ibmvfc.h	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/drivers/scsi/ibmvscsi/ibmvfc.h	2018-02-28 04:16:18.000000000 -0500
@@ -366,7 +366,7 @@ enum ibmvfc_fcp_rsp_info_codes {
 };
 
 struct ibmvfc_fcp_rsp_info {
-	__be16 reserved;
+	u8 reserved[3];
 	u8 rsp_code;
 	u8 reserved2[4];
 }__attribute__((packed, aligned (2)));
diff -druNp --no-dereference linux-libre-3.18.96-gnu/drivers/usb/dwc3/gadget.c linux-libre-3.18.97-gnu/drivers/usb/dwc3/gadget.c
--- linux-libre-3.18.96-gnu/drivers/usb/dwc3/gadget.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/drivers/usb/dwc3/gadget.c	2018-02-28 04:16:18.000000000 -0500
@@ -2345,6 +2345,8 @@ static void dwc3_gadget_conndone_interru
 		break;
 	}
 
+	dwc->eps[1]->endpoint.maxpacket = dwc->gadget.ep0->maxpacket;
+
 	/* Enable USB2 LPM Capability */
 
 	if ((dwc->revision > DWC3_REVISION_194A)
diff -druNp --no-dereference linux-libre-3.18.96-gnu/drivers/usb/gadget/function/f_fs.c linux-libre-3.18.97-gnu/drivers/usb/gadget/function/f_fs.c
--- linux-libre-3.18.96-gnu/drivers/usb/gadget/function/f_fs.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/drivers/usb/gadget/function/f_fs.c	2018-02-28 04:16:18.000000000 -0500
@@ -2727,10 +2727,8 @@ static int _ffs_func_bind(struct usb_con
 	struct ffs_data *ffs = func->ffs;
 
 	const int full = !!func->ffs->fs_descs_count;
-	const int high = gadget_is_dualspeed(func->gadget) &&
-		func->ffs->hs_descs_count;
-	const int super = gadget_is_superspeed(func->gadget) &&
-		func->ffs->ss_descs_count;
+	const int high = !!func->ffs->hs_descs_count;
+	const int super = !!func->ffs->ss_descs_count;
 
 	int fs_len, hs_len, ss_len, ret, i;
 
diff -druNp --no-dereference linux-libre-3.18.96-gnu/lib/asn1_decoder.c linux-libre-3.18.97-gnu/lib/asn1_decoder.c
--- linux-libre-3.18.96-gnu/lib/asn1_decoder.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/lib/asn1_decoder.c	2018-02-28 04:16:18.000000000 -0500
@@ -305,38 +305,43 @@ next_op:
 
 	/* Decide how to handle the operation */
 	switch (op) {
-	case ASN1_OP_MATCH_ANY_ACT:
-	case ASN1_OP_COND_MATCH_ANY_ACT:
-		ret = actions[machine[pc + 1]](context, hdr, tag, data + dp, len);
-		if (ret < 0)
-			return ret;
-		goto skip_data;
-
-	case ASN1_OP_MATCH_ACT:
-	case ASN1_OP_MATCH_ACT_OR_SKIP:
-	case ASN1_OP_COND_MATCH_ACT_OR_SKIP:
-		ret = actions[machine[pc + 2]](context, hdr, tag, data + dp, len);
-		if (ret < 0)
-			return ret;
-		goto skip_data;
-
 	case ASN1_OP_MATCH:
 	case ASN1_OP_MATCH_OR_SKIP:
+	case ASN1_OP_MATCH_ACT:
+	case ASN1_OP_MATCH_ACT_OR_SKIP:
 	case ASN1_OP_MATCH_ANY:
+	case ASN1_OP_MATCH_ANY_ACT:
 	case ASN1_OP_COND_MATCH_OR_SKIP:
+	case ASN1_OP_COND_MATCH_ACT_OR_SKIP:
 	case ASN1_OP_COND_MATCH_ANY:
-	skip_data:
+	case ASN1_OP_COND_MATCH_ANY_ACT:
+
 		if (!(flags & FLAG_CONS)) {
 			if (flags & FLAG_INDEFINITE_LENGTH) {
+				size_t tmp = dp;
+
 				ret = asn1_find_indefinite_length(
-					data, datalen, &dp, &len, &errmsg);
+					data, datalen, &tmp, &len, &errmsg);
 				if (ret < 0)
 					goto error;
-			} else {
-				dp += len;
 			}
 			pr_debug("- LEAF: %zu\n", len);
 		}
+
+		if (op & ASN1_OP_MATCH__ACT) {
+			unsigned char act;
+
+			if (op & ASN1_OP_MATCH__ANY)
+				act = machine[pc + 1];
+			else
+				act = machine[pc + 2];
+			ret = actions[act](context, hdr, tag, data + dp, len);
+			if (ret < 0)
+				return ret;
+		}
+
+		if (!(flags & FLAG_CONS))
+			dp += len;
 		pc += asn1_op_lengths[op];
 		goto next_op;
 
diff -druNp --no-dereference linux-libre-3.18.96-gnu/Makefile linux-libre-3.18.97-gnu/Makefile
--- linux-libre-3.18.96-gnu/Makefile	2018-02-25 09:50:02.000000000 -0500
+++ linux-libre-3.18.97-gnu/Makefile	2018-02-28 12:50:32.000000000 -0500
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 18
-SUBLEVEL = 96
+SUBLEVEL = 97
 EXTRAVERSION =-gnu
 NAME = Diseased Newt
 
diff -druNp --no-dereference linux-libre-3.18.96-gnu/net/ipv4/ip_sockglue.c linux-libre-3.18.97-gnu/net/ipv4/ip_sockglue.c
--- linux-libre-3.18.96-gnu/net/ipv4/ip_sockglue.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/net/ipv4/ip_sockglue.c	2018-02-28 04:16:18.000000000 -0500
@@ -1375,10 +1375,7 @@ int ip_getsockopt(struct sock *sk, int l
 		if (get_user(len, optlen))
 			return -EFAULT;
 
-		lock_sock(sk);
-		err = nf_getsockopt(sk, PF_INET, optname, optval,
-				&len);
-		release_sock(sk);
+		err = nf_getsockopt(sk, PF_INET, optname, optval, &len);
 		if (err >= 0)
 			err = put_user(len, optlen);
 		return err;
@@ -1410,9 +1407,7 @@ int compat_ip_getsockopt(struct sock *sk
 		if (get_user(len, optlen))
 			return -EFAULT;
 
-		lock_sock(sk);
 		err = compat_nf_getsockopt(sk, PF_INET, optname, optval, &len);
-		release_sock(sk);
 		if (err >= 0)
 			err = put_user(len, optlen);
 		return err;
diff -druNp --no-dereference linux-libre-3.18.96-gnu/net/ipv6/ipv6_sockglue.c linux-libre-3.18.97-gnu/net/ipv6/ipv6_sockglue.c
--- linux-libre-3.18.96-gnu/net/ipv6/ipv6_sockglue.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/net/ipv6/ipv6_sockglue.c	2018-02-28 04:16:18.000000000 -0500
@@ -1314,10 +1314,7 @@ int ipv6_getsockopt(struct sock *sk, int
 		if (get_user(len, optlen))
 			return -EFAULT;
 
-		lock_sock(sk);
-		err = nf_getsockopt(sk, PF_INET6, optname, optval,
-				&len);
-		release_sock(sk);
+		err = nf_getsockopt(sk, PF_INET6, optname, optval, &len);
 		if (err >= 0)
 			err = put_user(len, optlen);
 	}
@@ -1356,10 +1353,7 @@ int compat_ipv6_getsockopt(struct sock *
 		if (get_user(len, optlen))
 			return -EFAULT;
 
-		lock_sock(sk);
-		err = compat_nf_getsockopt(sk, PF_INET6,
-					   optname, optval, &len);
-		release_sock(sk);
+		err = compat_nf_getsockopt(sk, PF_INET6, optname, optval, &len);
 		if (err >= 0)
 			err = put_user(len, optlen);
 	}
diff -druNp --no-dereference linux-libre-3.18.96-gnu/net/mac80211/cfg.c linux-libre-3.18.97-gnu/net/mac80211/cfg.c
--- linux-libre-3.18.96-gnu/net/mac80211/cfg.c	2018-02-25 05:01:21.000000000 -0500
+++ linux-libre-3.18.97-gnu/net/mac80211/cfg.c	2018-02-28 04:16:18.000000000 -0500
@@ -2769,7 +2769,7 @@ cfg80211_beacon_dup(struct cfg80211_beac
 	}
 	if (beacon->probe_resp_len) {
 		new_beacon->probe_resp_len = beacon->probe_resp_len;
-		beacon->probe_resp = pos;
+		new_beacon->probe_resp = pos;
 		memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
 		pos += beacon->probe_resp_len;
 	}
