diff -druNp --no-dereference linux-libre-3.0.96-gnu1/arch/arm/mach-versatile/pci.c linux-libre-3.0.97-gnu1/arch/arm/mach-versatile/pci.c
--- linux-libre-3.0.96-gnu1/arch/arm/mach-versatile/pci.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/arch/arm/mach-versatile/pci.c	2013-09-26 19:53:10.000000000 -0400
@@ -43,9 +43,9 @@
 #define PCI_IMAP0		__IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x0)
 #define PCI_IMAP1		__IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x4)
 #define PCI_IMAP2		__IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x8)
-#define PCI_SMAP0		__IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x10)
-#define PCI_SMAP1		__IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x14)
-#define PCI_SMAP2		__IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x18)
+#define PCI_SMAP0		__IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x14)
+#define PCI_SMAP1		__IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x18)
+#define PCI_SMAP2		__IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x1c)
 #define PCI_SELFID		__IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0xc)
 
 #define DEVICE_ID_OFFSET		0x00
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/arch/powerpc/kernel/align.c linux-libre-3.0.97-gnu1/arch/powerpc/kernel/align.c
--- linux-libre-3.0.96-gnu1/arch/powerpc/kernel/align.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/arch/powerpc/kernel/align.c	2013-09-26 19:53:10.000000000 -0400
@@ -764,6 +764,16 @@ int fix_alignment(struct pt_regs *regs)
 	nb = aligninfo[instr].len;
 	flags = aligninfo[instr].flags;
 
+	/* ldbrx/stdbrx overlap lfs/stfs in the DSISR unfortunately */
+	if (IS_XFORM(instruction) && ((instruction >> 1) & 0x3ff) == 532) {
+		nb = 8;
+		flags = LD+SW;
+	} else if (IS_XFORM(instruction) &&
+		   ((instruction >> 1) & 0x3ff) == 660) {
+		nb = 8;
+		flags = ST+SW;
+	}
+
 	/* Byteswap little endian loads and stores */
 	swiz = 0;
 	if (regs->msr & MSR_LE) {
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/crypto/api.c linux-libre-3.0.97-gnu1/crypto/api.c
--- linux-libre-3.0.96-gnu1/crypto/api.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/crypto/api.c	2013-09-26 19:53:10.000000000 -0400
@@ -40,6 +40,8 @@ static inline struct crypto_alg *crypto_
 	return alg;
 }
 
+static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg);
+
 struct crypto_alg *crypto_mod_get(struct crypto_alg *alg)
 {
 	return try_module_get(alg->cra_module) ? crypto_alg_get(alg) : NULL;
@@ -150,8 +152,11 @@ static struct crypto_alg *crypto_larval_
 	}
 	up_write(&crypto_alg_sem);
 
-	if (alg != &larval->alg)
+	if (alg != &larval->alg) {
 		kfree(larval);
+		if (crypto_is_larval(alg))
+			alg = crypto_larval_wait(alg);
+	}
 
 	return alg;
 }
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/hid/hid-core.c linux-libre-3.0.97-gnu1/drivers/hid/hid-core.c
--- linux-libre-3.0.96-gnu1/drivers/hid/hid-core.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/hid/hid-core.c	2013-09-26 19:53:10.000000000 -0400
@@ -58,6 +58,8 @@ struct hid_report *hid_register_report(s
 	struct hid_report_enum *report_enum = device->report_enum + type;
 	struct hid_report *report;
 
+	if (id >= HID_MAX_IDS)
+		return NULL;
 	if (report_enum->report_id_hash[id])
 		return report_enum->report_id_hash[id];
 
@@ -379,9 +381,11 @@ static int hid_parser_global(struct hid_
 
 	case HID_GLOBAL_ITEM_TAG_REPORT_ID:
 		parser->global.report_id = item_udata(item);
-		if (parser->global.report_id == 0) {
-			dbg_hid("report_id 0 is invalid\n");
-			return -1;
+		if (parser->global.report_id == 0 ||
+		    parser->global.report_id >= HID_MAX_IDS) {
+			hid_err(parser->device, "report_id %u is invalid\n",
+				parser->global.report_id);
+ 			return -1;
 		}
 		return 0;
 
@@ -551,7 +555,7 @@ static void hid_device_release(struct de
 	for (i = 0; i < HID_REPORT_TYPES; i++) {
 		struct hid_report_enum *report_enum = device->report_enum + i;
 
-		for (j = 0; j < 256; j++) {
+		for (j = 0; j < HID_MAX_IDS; j++) {
 			struct hid_report *report = report_enum->report_id_hash[j];
 			if (report)
 				hid_free_report(report);
@@ -989,7 +993,12 @@ EXPORT_SYMBOL_GPL(hid_output_report);
 
 int hid_set_field(struct hid_field *field, unsigned offset, __s32 value)
 {
-	unsigned size = field->report_size;
+	unsigned size;
+
+	if (!field)
+		return -1;
+
+	size = field->report_size;
 
 	hid_dump_input(field->report->device, field->usage + offset, value);
 
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/hid/hid-ntrig.c linux-libre-3.0.97-gnu1/drivers/hid/hid-ntrig.c
--- linux-libre-3.0.96-gnu1/drivers/hid/hid-ntrig.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/hid/hid-ntrig.c	2013-09-26 19:53:10.000000000 -0400
@@ -115,7 +115,8 @@ static inline int ntrig_get_mode(struct
 	struct hid_report *report = hdev->report_enum[HID_FEATURE_REPORT].
 				    report_id_hash[0x0d];
 
-	if (!report)
+	if (!report || report->maxfield < 1 ||
+	    report->field[0]->report_count < 1)
 		return -EINVAL;
 
 	usbhid_submit_report(hdev, report, USB_DIR_IN);
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/hid/hid-pl.c linux-libre-3.0.97-gnu1/drivers/hid/hid-pl.c
--- linux-libre-3.0.96-gnu1/drivers/hid/hid-pl.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/hid/hid-pl.c	2013-09-26 19:53:10.000000000 -0400
@@ -128,8 +128,14 @@ static int plff_init(struct hid_device *
 			strong = &report->field[0]->value[2];
 			weak = &report->field[0]->value[3];
 			debug("detected single-field device");
-		} else if (report->maxfield >= 4 && report->field[0]->maxusage == 1 &&
-				report->field[0]->usage[0].hid == (HID_UP_LED | 0x43)) {
+		} else if (report->field[0]->maxusage == 1 &&
+			   report->field[0]->usage[0].hid ==
+				(HID_UP_LED | 0x43) &&
+			   report->maxfield >= 4 &&
+			   report->field[0]->report_count >= 1 &&
+			   report->field[1]->report_count >= 1 &&
+			   report->field[2]->report_count >= 1 &&
+			   report->field[3]->report_count >= 1) {
 			report->field[0]->value[0] = 0x00;
 			report->field[1]->value[0] = 0x00;
 			strong = &report->field[2]->value[0];
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/net/wireless/ath/ath9k/ar9003_phy.c linux-libre-3.0.97-gnu1/drivers/net/wireless/ath/ath9k/ar9003_phy.c
--- linux-libre-3.0.96-gnu1/drivers/net/wireless/ath/ath9k/ar9003_phy.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/net/wireless/ath/ath9k/ar9003_phy.c	2013-09-26 19:53:10.000000000 -0400
@@ -1005,6 +1005,10 @@ static bool ar9003_hw_ani_control(struct
 		 * is_on == 0 means MRC CCK is OFF (more noise imm)
 		 */
 		bool is_on = param ? 1 : 0;
+
+		if (ah->caps.rx_chainmask == 1)
+			break;
+
 		REG_RMW_FIELD(ah, AR_PHY_MRC_CCK_CTRL,
 			      AR_PHY_MRC_CCK_ENABLE, is_on);
 		REG_RMW_FIELD(ah, AR_PHY_MRC_CCK_CTRL,
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/net/wireless/ath/ath9k/xmit.c linux-libre-3.0.97-gnu1/drivers/net/wireless/ath/ath9k/xmit.c
--- linux-libre-3.0.96-gnu1/drivers/net/wireless/ath/ath9k/xmit.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/net/wireless/ath/ath9k/xmit.c	2013-09-26 19:53:10.000000000 -0400
@@ -2433,6 +2433,7 @@ void ath_tx_node_init(struct ath_softc *
 	for (acno = 0, ac = &an->ac[acno];
 	     acno < WME_NUM_AC; acno++, ac++) {
 		ac->sched    = false;
+		ac->clear_ps_filter = true;
 		ac->txq = sc->tx.txq_map[acno];
 		INIT_LIST_HEAD(&ac->tid_q);
 	}
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/scsi/sd.c linux-libre-3.0.97-gnu1/drivers/scsi/sd.c
--- linux-libre-3.0.96-gnu1/drivers/scsi/sd.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/scsi/sd.c	2013-09-26 19:53:10.000000000 -0400
@@ -2135,14 +2135,9 @@ sd_read_cache_type(struct scsi_disk *sdk
 			}
 		}
 
-		if (modepage == 0x3F) {
-			sd_printk(KERN_ERR, sdkp, "No Caching mode page "
-				  "present\n");
-			goto defaults;
-		} else if ((buffer[offset] & 0x3f) != modepage) {
-			sd_printk(KERN_ERR, sdkp, "Got wrong page\n");
-			goto defaults;
-		}
+		sd_printk(KERN_ERR, sdkp, "No Caching mode page found\n");
+		goto defaults;
+
 	Page_found:
 		if (modepage == 8) {
 			sdkp->WCE = ((buffer[offset + 2] & 0x04) != 0);
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/staging/comedi/drivers/dt282x.c linux-libre-3.0.97-gnu1/drivers/staging/comedi/drivers/dt282x.c
--- linux-libre-3.0.96-gnu1/drivers/staging/comedi/drivers/dt282x.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/staging/comedi/drivers/dt282x.c	2013-09-26 19:53:10.000000000 -0400
@@ -406,8 +406,9 @@ struct dt282x_private {
 			}					\
 			udelay(5);				\
 		}						\
-		if (_i)						\
+		if (_i) {					\
 			b					\
+		}						\
 	} while (0)
 
 static int dt282x_attach(struct comedi_device *dev,
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/usb/class/cdc-wdm.c linux-libre-3.0.97-gnu1/drivers/usb/class/cdc-wdm.c
--- linux-libre-3.0.96-gnu1/drivers/usb/class/cdc-wdm.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/usb/class/cdc-wdm.c	2013-09-26 19:53:10.000000000 -0400
@@ -171,6 +171,7 @@ skip_error:
 static void wdm_int_callback(struct urb *urb)
 {
 	int rv = 0;
+	int responding;
 	int status = urb->status;
 	struct wdm_device *desc;
 	struct usb_ctrlrequest *req;
@@ -244,8 +245,8 @@ static void wdm_int_callback(struct urb
 	desc->response->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 	spin_lock(&desc->iuspin);
 	clear_bit(WDM_READ, &desc->flags);
-	set_bit(WDM_RESPONDING, &desc->flags);
-	if (!test_bit(WDM_DISCONNECTING, &desc->flags)
+	responding = test_and_set_bit(WDM_RESPONDING, &desc->flags);
+	if (!responding && !test_bit(WDM_DISCONNECTING, &desc->flags)
 		&& !test_bit(WDM_SUSPENDING, &desc->flags)) {
 		rv = usb_submit_urb(desc->response, GFP_ATOMIC);
 		dev_dbg(&desc->intf->dev, "%s: usb_submit_urb %d",
@@ -635,16 +636,20 @@ static void wdm_rxwork(struct work_struc
 {
 	struct wdm_device *desc = container_of(work, struct wdm_device, rxwork);
 	unsigned long flags;
-	int rv;
+	int rv = 0;
+	int responding;
 
 	spin_lock_irqsave(&desc->iuspin, flags);
 	if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
 		spin_unlock_irqrestore(&desc->iuspin, flags);
 	} else {
+		responding = test_and_set_bit(WDM_RESPONDING, &desc->flags);
 		spin_unlock_irqrestore(&desc->iuspin, flags);
-		rv = usb_submit_urb(desc->response, GFP_KERNEL);
+		if (!responding)
+			rv = usb_submit_urb(desc->response, GFP_KERNEL);
 		if (rv < 0 && rv != -EPERM) {
 			spin_lock_irqsave(&desc->iuspin, flags);
+			clear_bit(WDM_RESPONDING, &desc->flags);
 			if (!test_bit(WDM_DISCONNECTING, &desc->flags))
 				schedule_work(&desc->rxwork);
 			spin_unlock_irqrestore(&desc->iuspin, flags);
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/usb/core/config.c linux-libre-3.0.97-gnu1/drivers/usb/core/config.c
--- linux-libre-3.0.96-gnu1/drivers/usb/core/config.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/usb/core/config.c	2013-09-26 19:53:10.000000000 -0400
@@ -424,7 +424,8 @@ static int usb_parse_configuration(struc
 
 	memcpy(&config->desc, buffer, USB_DT_CONFIG_SIZE);
 	if (config->desc.bDescriptorType != USB_DT_CONFIG ||
-	    config->desc.bLength < USB_DT_CONFIG_SIZE) {
+	    config->desc.bLength < USB_DT_CONFIG_SIZE ||
+	    config->desc.bLength > size) {
 		dev_err(ddev, "invalid descriptor for config index %d: "
 		    "type = 0x%X, length = %d\n", cfgidx,
 		    config->desc.bDescriptorType, config->desc.bLength);
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/usb/host/xhci.c linux-libre-3.0.97-gnu1/drivers/usb/host/xhci.c
--- linux-libre-3.0.96-gnu1/drivers/usb/host/xhci.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/usb/host/xhci.c	2013-09-26 19:53:10.000000000 -0400
@@ -2713,10 +2713,21 @@ void xhci_free_dev(struct usb_hcd *hcd,
 {
 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
 	struct xhci_virt_device *virt_dev;
+	struct device *dev = hcd->self.controller;
 	unsigned long flags;
 	u32 state;
 	int i, ret;
 
+#ifndef CONFIG_USB_DEFAULT_PERSIST
+	/*
+	 * We called pm_runtime_get_noresume when the device was attached.
+	 * Decrement the counter here to allow controller to runtime suspend
+	 * if no devices remain.
+	 */
+	if (xhci->quirks & XHCI_RESET_ON_RESUME)
+		pm_runtime_put_noidle(dev);
+#endif
+
 	ret = xhci_check_args(hcd, udev, NULL, 0, true, __func__);
 	/* If the host is halted due to driver unload, we still need to free the
 	 * device.
@@ -2783,6 +2794,7 @@ static int xhci_reserve_host_control_ep_
 int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
 {
 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+	struct device *dev = hcd->self.controller;
 	unsigned long flags;
 	int timeleft;
 	int ret;
@@ -2835,6 +2847,16 @@ int xhci_alloc_dev(struct usb_hcd *hcd,
 		goto disable_slot;
 	}
 	udev->slot_id = xhci->slot_id;
+
+#ifndef CONFIG_USB_DEFAULT_PERSIST
+	/*
+	 * If resetting upon resume, we can't put the controller into runtime
+	 * suspend if there is a device attached.
+	 */
+	if (xhci->quirks & XHCI_RESET_ON_RESUME)
+		pm_runtime_get_noresume(dev);
+#endif
+
 	/* Is this a LS or FS device under a HS hub? */
 	/* Hub or peripherial? */
 	return 1;
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/usb/serial/mos7720.c linux-libre-3.0.97-gnu1/drivers/usb/serial/mos7720.c
--- linux-libre-3.0.96-gnu1/drivers/usb/serial/mos7720.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/usb/serial/mos7720.c	2013-09-26 19:53:10.000000000 -0400
@@ -383,7 +383,7 @@ static int write_parport_reg_nonblock(st
 		kfree(urbtrack);
 		return -ENOMEM;
 	}
-	urbtrack->setup = kmalloc(sizeof(*urbtrack->setup), GFP_KERNEL);
+	urbtrack->setup = kmalloc(sizeof(*urbtrack->setup), GFP_ATOMIC);
 	if (!urbtrack->setup) {
 		usb_free_urb(urbtrack->urb);
 		kfree(urbtrack);
@@ -391,8 +391,8 @@ static int write_parport_reg_nonblock(st
 	}
 	urbtrack->setup->bRequestType = (__u8)0x40;
 	urbtrack->setup->bRequest = (__u8)0x0e;
-	urbtrack->setup->wValue = get_reg_value(reg, dummy);
-	urbtrack->setup->wIndex = get_reg_index(reg);
+	urbtrack->setup->wValue = cpu_to_le16(get_reg_value(reg, dummy));
+	urbtrack->setup->wIndex = cpu_to_le16(get_reg_index(reg));
 	urbtrack->setup->wLength = 0;
 	usb_fill_control_urb(urbtrack->urb, usbdev,
 			     usb_sndctrlpipe(usbdev, 0),
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/drivers/xen/grant-table.c linux-libre-3.0.97-gnu1/drivers/xen/grant-table.c
--- linux-libre-3.0.96-gnu1/drivers/xen/grant-table.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/drivers/xen/grant-table.c	2013-09-26 19:53:10.000000000 -0400
@@ -355,9 +355,18 @@ void gnttab_request_free_callback(struct
 				  void (*fn)(void *), void *arg, u16 count)
 {
 	unsigned long flags;
+	struct gnttab_free_callback *cb;
+
 	spin_lock_irqsave(&gnttab_list_lock, flags);
-	if (callback->next)
-		goto out;
+
+	/* Check if the callback is already on the list */
+	cb = gnttab_free_callback_list;
+	while (cb) {
+		if (cb == callback)
+			goto out;
+		cb = cb->next;
+	}
+
 	callback->fn = fn;
 	callback->arg = arg;
 	callback->count = count;
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/fs/cifs/connect.c linux-libre-3.0.97-gnu1/fs/cifs/connect.c
--- linux-libre-3.0.96-gnu1/fs/cifs/connect.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/fs/cifs/connect.c	2013-09-26 19:53:10.000000000 -0400
@@ -158,6 +158,7 @@ cifs_reconnect(struct TCP_Server_Info *s
 		try_to_freeze();
 
 		/* we should try only the port we connected to before */
+		mutex_lock(&server->srv_mutex);
 		rc = generic_ip_connect(server);
 		if (rc) {
 			cFYI(1, "reconnect error %d", rc);
@@ -169,6 +170,7 @@ cifs_reconnect(struct TCP_Server_Info *s
 				server->tcpStatus = CifsNeedNegotiate;
 			spin_unlock(&GlobalMid_Lock);
 		}
+		mutex_unlock(&server->srv_mutex);
 	} while (server->tcpStatus == CifsNeedReconnect);
 
 	return rc;
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/fs/fuse/dir.c linux-libre-3.0.97-gnu1/fs/fuse/dir.c
--- linux-libre-3.0.96-gnu1/fs/fuse/dir.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/fs/fuse/dir.c	2013-09-26 19:53:10.000000000 -0400
@@ -1439,6 +1439,8 @@ static int fuse_setxattr(struct dentry *
 		fc->no_setxattr = 1;
 		err = -EOPNOTSUPP;
 	}
+	if (!err)
+		fuse_invalidate_attr(inode);
 	return err;
 }
 
@@ -1568,6 +1570,8 @@ static int fuse_removexattr(struct dentr
 		fc->no_removexattr = 1;
 		err = -EOPNOTSUPP;
 	}
+	if (!err)
+		fuse_invalidate_attr(inode);
 	return err;
 }
 
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/fs/fuse/file.c linux-libre-3.0.97-gnu1/fs/fuse/file.c
--- linux-libre-3.0.96-gnu1/fs/fuse/file.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/fs/fuse/file.c	2013-09-26 19:53:10.000000000 -0400
@@ -1298,7 +1298,6 @@ static int fuse_writepage_locked(struct
 
 	inc_bdi_stat(mapping->backing_dev_info, BDI_WRITEBACK);
 	inc_zone_page_state(tmp_page, NR_WRITEBACK_TEMP);
-	end_page_writeback(page);
 
 	spin_lock(&fc->lock);
 	list_add(&req->writepages_entry, &fi->writepages);
@@ -1306,6 +1305,8 @@ static int fuse_writepage_locked(struct
 	fuse_flush_writepages(inode);
 	spin_unlock(&fc->lock);
 
+	end_page_writeback(page);
+
 	return 0;
 
 err_free:
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/fs/isofs/inode.c linux-libre-3.0.97-gnu1/fs/isofs/inode.c
--- linux-libre-3.0.96-gnu1/fs/isofs/inode.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/fs/isofs/inode.c	2013-09-26 19:53:10.000000000 -0400
@@ -119,8 +119,8 @@ static void destroy_inodecache(void)
 
 static int isofs_remount(struct super_block *sb, int *flags, char *data)
 {
-	/* we probably want a lot more here */
-	*flags |= MS_RDONLY;
+	if (!(*flags & MS_RDONLY))
+		return -EROFS;
 	return 0;
 }
 
@@ -769,15 +769,6 @@ root_found:
 	 */
 	s->s_maxbytes = 0x80000000000LL;
 
-	/*
-	 * The CDROM is read-only, has no nodes (devices) on it, and since
-	 * all of the files appear to be owned by root, we really do not want
-	 * to allow suid.  (suid or devices will not show up unless we have
-	 * Rock Ridge extensions)
-	 */
-
-	s->s_flags |= MS_RDONLY /* | MS_NODEV | MS_NOSUID */;
-
 	/* Set this for reference. Its not currently used except on write
 	   which we don't have .. */
 
@@ -1528,6 +1519,9 @@ struct inode *isofs_iget(struct super_bl
 static struct dentry *isofs_mount(struct file_system_type *fs_type,
 	int flags, const char *dev_name, void *data)
 {
+	/* We don't support read-write mounts */
+	if (!(flags & MS_RDONLY))
+		return ERR_PTR(-EACCES);
 	return mount_bdev(fs_type, flags, dev_name, data, isofs_fill_super);
 }
 
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/fs/ocfs2/extent_map.c linux-libre-3.0.97-gnu1/fs/ocfs2/extent_map.c
--- linux-libre-3.0.96-gnu1/fs/ocfs2/extent_map.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/fs/ocfs2/extent_map.c	2013-09-26 19:53:10.000000000 -0400
@@ -782,7 +782,6 @@ int ocfs2_fiemap(struct inode *inode, st
 	cpos = map_start >> osb->s_clustersize_bits;
 	mapping_end = ocfs2_clusters_for_bytes(inode->i_sb,
 					       map_start + map_len);
-	mapping_end -= cpos;
 	is_last = 0;
 	while (cpos < mapping_end && !is_last) {
 		u32 fe_flags;
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/include/linux/hid.h linux-libre-3.0.97-gnu1/include/linux/hid.h
--- linux-libre-3.0.96-gnu1/include/linux/hid.h	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/include/linux/hid.h	2013-09-26 19:53:10.000000000 -0400
@@ -414,10 +414,12 @@ struct hid_report {
 	struct hid_device *device;			/* associated device */
 };
 
+#define HID_MAX_IDS 256
+
 struct hid_report_enum {
 	unsigned numbered;
 	struct list_head report_list;
-	struct hid_report *report_id_hash[256];
+	struct hid_report *report_id_hash[HID_MAX_IDS];
 };
 
 #define HID_REPORT_TYPES 3
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/include/linux/rculist.h linux-libre-3.0.97-gnu1/include/linux/rculist.h
--- linux-libre-3.0.96-gnu1/include/linux/rculist.h	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/include/linux/rculist.h	2013-09-26 19:53:10.000000000 -0400
@@ -254,8 +254,9 @@ static inline void list_splice_init_rcu(
  */
 #define list_first_or_null_rcu(ptr, type, member) \
 	({struct list_head *__ptr = (ptr); \
-	  struct list_head __rcu *__next = list_next_rcu(__ptr); \
-	  likely(__ptr != __next) ? container_of(__next, type, member) : NULL; \
+	  struct list_head *__next = ACCESS_ONCE(__ptr->next); \
+	  likely(__ptr != __next) ? \
+		list_entry_rcu(__next, type, member) : NULL; \
 	})
 
 /**
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/Makefile linux-libre-3.0.97-gnu1/Makefile
--- linux-libre-3.0.96-gnu1/Makefile	2013-09-14 14:29:20.000000000 -0400
+++ linux-libre-3.0.97-gnu1/Makefile	2013-09-27 07:35:56.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 3
 PATCHLEVEL = 0
-SUBLEVEL = 96
+SUBLEVEL = 97
 EXTRAVERSION =-gnu1
 NAME = Sneaky Weasel
 
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/mm/huge_memory.c linux-libre-3.0.97-gnu1/mm/huge_memory.c
--- linux-libre-3.0.96-gnu1/mm/huge_memory.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/mm/huge_memory.c	2013-09-26 19:53:10.000000000 -0400
@@ -1838,6 +1838,8 @@ static void collapse_huge_page(struct mm
 		goto out;
 
 	vma = find_vma(mm, address);
+	if (!vma)
+		goto out;
 	hstart = (vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK;
 	hend = vma->vm_end & HPAGE_PMD_MASK;
 	if (address < hstart || address + HPAGE_PMD_SIZE > hend)
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/mm/memcontrol.c linux-libre-3.0.97-gnu1/mm/memcontrol.c
--- linux-libre-3.0.96-gnu1/mm/memcontrol.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/mm/memcontrol.c	2013-09-26 19:53:10.000000000 -0400
@@ -4433,7 +4433,13 @@ static int compare_thresholds(const void
 	const struct mem_cgroup_threshold *_a = a;
 	const struct mem_cgroup_threshold *_b = b;
 
-	return _a->threshold - _b->threshold;
+	if (_a->threshold > _b->threshold)
+		return 1;
+
+	if (_a->threshold < _b->threshold)
+		return -1;
+
+	return 0;
 }
 
 static int mem_cgroup_oom_notify_cb(struct mem_cgroup *mem)
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/sound/pci/hda/hda_intel.c linux-libre-3.0.97-gnu1/sound/pci/hda/hda_intel.c
--- linux-libre-3.0.96-gnu1/sound/pci/hda/hda_intel.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/sound/pci/hda/hda_intel.c	2013-09-26 19:53:10.000000000 -0400
@@ -2461,6 +2461,7 @@ static struct snd_pci_quirk msi_black_li
 	SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
 	SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
 	SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
+	SND_PCI_QUIRK(0x1179, 0xfb44, "Toshiba Satellite C870", 0), /* AMD Hudson */
 	SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
 	SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
 	{}
diff -druNp --no-dereference linux-libre-3.0.96-gnu1/sound/soc/codecs/wm8960.c linux-libre-3.0.97-gnu1/sound/soc/codecs/wm8960.c
--- linux-libre-3.0.96-gnu1/sound/soc/codecs/wm8960.c	2013-09-14 08:58:09.000000000 -0400
+++ linux-libre-3.0.97-gnu1/sound/soc/codecs/wm8960.c	2013-09-26 19:53:10.000000000 -0400
@@ -801,9 +801,9 @@ static int wm8960_set_dai_pll(struct snd
 	if (pll_div.k) {
 		reg |= 0x20;
 
-		snd_soc_write(codec, WM8960_PLL2, (pll_div.k >> 18) & 0x3f);
-		snd_soc_write(codec, WM8960_PLL3, (pll_div.k >> 9) & 0x1ff);
-		snd_soc_write(codec, WM8960_PLL4, pll_div.k & 0x1ff);
+		snd_soc_write(codec, WM8960_PLL2, (pll_div.k >> 16) & 0xff);
+		snd_soc_write(codec, WM8960_PLL3, (pll_div.k >> 8) & 0xff);
+		snd_soc_write(codec, WM8960_PLL4, pll_div.k & 0xff);
 	}
 	snd_soc_write(codec, WM8960_PLL1, reg);
 
