diff -druN linux-2.6.32.45-libre2/arch/x86/kernel/apic/x2apic_uv_x.c linux-2.6.32.46-libre2/arch/x86/kernel/apic/x2apic_uv_x.c
--- linux-2.6.32.45-libre2/arch/x86/kernel/apic/x2apic_uv_x.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/arch/x86/kernel/apic/x2apic_uv_x.c	2011-08-29 17:31:54.000000000 -0400
@@ -117,7 +117,6 @@
 	    ((start_rip << UVH_IPI_INT_VECTOR_SHFT) >> 12) |
 	    APIC_DM_INIT;
 	uv_write_global_mmr64(pnode, UVH_IPI_INT, val);
-	mdelay(10);
 
 	val = (1UL << UVH_IPI_INT_SEND_SHFT) |
 	    (phys_apicid << UVH_IPI_INT_APIC_ID_SHFT) |
diff -druN linux-2.6.32.45-libre2/arch/x86/vdso/vdso32/sysenter.S linux-2.6.32.46-libre2/arch/x86/vdso/vdso32/sysenter.S
--- linux-2.6.32.45-libre2/arch/x86/vdso/vdso32/sysenter.S	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/arch/x86/vdso/vdso32/sysenter.S	2011-08-29 17:31:54.000000000 -0400
@@ -43,7 +43,7 @@
 	.space 7,0x90
 
 	/* 14: System call restart point is here! (SYSENTER_RETURN-2) */
-	jmp .Lenter_kernel
+	int $0x80
 	/* 16: System call normal return point is here! */
 VDSO32_SYSENTER_RETURN:	/* Symbol used by sysenter.c via vdso32-syms.h */
 	pop %ebp
diff -druN linux-2.6.32.45-libre2/drivers/gpu/drm/ttm/ttm_bo.c linux-2.6.32.46-libre2/drivers/gpu/drm/ttm/ttm_bo.c
--- linux-2.6.32.45-libre2/drivers/gpu/drm/ttm/ttm_bo.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/drivers/gpu/drm/ttm/ttm_bo.c	2011-08-29 17:31:54.000000000 -0400
@@ -281,8 +281,10 @@
 
 		ret = ttm_tt_set_user(bo->ttm, current,
 				      bo->buffer_start, bo->num_pages);
-		if (unlikely(ret != 0))
+		if (unlikely(ret != 0)) {
 			ttm_tt_destroy(bo->ttm);
+			bo->ttm = NULL;
+		}
 		break;
 	default:
 		printk(KERN_ERR TTM_PFX "Illegal buffer object type\n");
diff -druN linux-2.6.32.45-libre2/drivers/hwmon/ibmaem.c linux-2.6.32.46-libre2/drivers/hwmon/ibmaem.c
--- linux-2.6.32.45-libre2/drivers/hwmon/ibmaem.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/drivers/hwmon/ibmaem.c	2011-08-29 17:31:54.000000000 -0400
@@ -429,13 +429,15 @@
 	aem_send_message(ipmi);
 
 	res = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT);
-	if (!res)
-		return -ETIMEDOUT;
+	if (!res) {
+		res = -ETIMEDOUT;
+		goto out;
+	}
 
 	if (ipmi->rx_result || ipmi->rx_msg_len != rs_size ||
 	    memcmp(&rs_resp->id, &system_x_id, sizeof(system_x_id))) {
-		kfree(rs_resp);
-		return -ENOENT;
+		res = -ENOENT;
+		goto out;
 	}
 
 	switch (size) {
@@ -460,8 +462,11 @@
 		break;
 	}
 	}
+	res = 0;
 
-	return 0;
+out:
+	kfree(rs_resp);
+	return res;
 }
 
 /* Update AEM energy registers */
diff -druN linux-2.6.32.45-libre2/drivers/net/igb/e1000_82575.c linux-2.6.32.46-libre2/drivers/net/igb/e1000_82575.c
--- linux-2.6.32.45-libre2/drivers/net/igb/e1000_82575.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/drivers/net/igb/e1000_82575.c	2011-08-29 17:31:54.000000000 -0400
@@ -941,6 +941,7 @@
 	ctrl |= E1000_CTRL_SLU;
 	ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
 	wr32(E1000_CTRL, ctrl);
+	wrfl();
 
 	ret_val = igb_setup_serdes_link_82575(hw);
 	if (ret_val)
diff -druN linux-2.6.32.45-libre2/drivers/usb/class/usbtmc.c linux-2.6.32.46-libre2/drivers/usb/class/usbtmc.c
--- linux-2.6.32.45-libre2/drivers/usb/class/usbtmc.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/drivers/usb/class/usbtmc.c	2011-08-29 17:31:54.000000000 -0400
@@ -267,7 +267,7 @@
 				dev_err(dev, "usb_bulk_msg returned %d\n", rv);
 				goto exit;
 			}
-		} while ((actual = max_size) &&
+		} while ((actual == max_size) &&
 			 (n < USBTMC_MAX_READS_TO_CLEAR_BULK_IN));
 
 	if (actual == max_size) {
diff -druN linux-2.6.32.45-libre2/drivers/usb/host/pci-quirks.c linux-2.6.32.46-libre2/drivers/usb/host/pci-quirks.c
--- linux-2.6.32.45-libre2/drivers/usb/host/pci-quirks.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/drivers/usb/host/pci-quirks.c	2011-08-29 17:31:54.000000000 -0400
@@ -444,7 +444,7 @@
 
 	/* If the BIOS owns the HC, signal that the OS wants it, and wait */
 	if (val & XHCI_HC_BIOS_OWNED) {
-		writel(val & XHCI_HC_OS_OWNED, base + ext_cap_offset);
+		writel(val | XHCI_HC_OS_OWNED, base + ext_cap_offset);
 
 		/* Wait for 5 seconds with 10 microsecond polling interval */
 		timeout = handshake(base + ext_cap_offset, XHCI_HC_BIOS_OWNED,
diff -druN linux-2.6.32.45-libre2/drivers/usb/serial/qcserial.c linux-2.6.32.46-libre2/drivers/usb/serial/qcserial.c
--- linux-2.6.32.45-libre2/drivers/usb/serial/qcserial.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/drivers/usb/serial/qcserial.c	2011-08-29 17:31:54.000000000 -0400
@@ -43,6 +43,7 @@
 	{USB_DEVICE(0x05c6, 0x9203)},	/* Generic Gobi Modem device */
 	{USB_DEVICE(0x05c6, 0x9222)},	/* Generic Gobi Modem device */
 	{USB_DEVICE(0x05c6, 0x9008)},	/* Generic Gobi QDL device */
+	{USB_DEVICE(0x05c6, 0x9009)},	/* Generic Gobi Modem device */
 	{USB_DEVICE(0x05c6, 0x9201)},	/* Generic Gobi QDL device */
 	{USB_DEVICE(0x05c6, 0x9221)},	/* Generic Gobi QDL device */
 	{USB_DEVICE(0x05c6, 0x9231)},	/* Generic Gobi QDL device */
diff -druN linux-2.6.32.45-libre2/drivers/usb/storage/unusual_devs.h linux-2.6.32.46-libre2/drivers/usb/storage/unusual_devs.h
--- linux-2.6.32.45-libre2/drivers/usb/storage/unusual_devs.h	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/drivers/usb/storage/unusual_devs.h	2011-08-29 17:31:54.000000000 -0400
@@ -1977,6 +1977,16 @@
 		"Micro Mini 1GB",
 		US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ),
 
+/*
+ * Nick Bowler <nbowler@elliptictech.com>
+ * SCSI stack spams (otherwise harmless) error messages.
+ */
+UNUSUAL_DEV(  0xc251, 0x4003, 0x0100, 0x0100,
+		"Keil Software, Inc.",
+		"V2M MotherBoard",
+		US_SC_DEVICE, US_PR_DEVICE, NULL,
+		US_FL_NOT_LOCKABLE),
+
 /* Reported by Andrew Simmons <andrew.simmons@gmail.com> */
 UNUSUAL_DEV(  0xed06, 0x4500, 0x0001, 0x0001,
 		"DataStor",
diff -druN linux-2.6.32.45-libre2/fs/befs/linuxvfs.c linux-2.6.32.46-libre2/fs/befs/linuxvfs.c
--- linux-2.6.32.45-libre2/fs/befs/linuxvfs.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/fs/befs/linuxvfs.c	2011-08-29 17:31:54.000000000 -0400
@@ -469,17 +469,22 @@
 		befs_data_stream *data = &befs_ino->i_data.ds;
 		befs_off_t len = data->size;
 
-		befs_debug(sb, "Follow long symlink");
-
-		link = kmalloc(len, GFP_NOFS);
-		if (!link) {
-			link = ERR_PTR(-ENOMEM);
-		} else if (befs_read_lsymlink(sb, data, link, len) != len) {
-			kfree(link);
-			befs_error(sb, "Failed to read entire long symlink");
+		if (len == 0) {
+			befs_error(sb, "Long symlink with illegal length");
 			link = ERR_PTR(-EIO);
 		} else {
-			link[len - 1] = '\0';
+			befs_debug(sb, "Follow long symlink");
+
+			link = kmalloc(len, GFP_NOFS);
+			if (!link) {
+				link = ERR_PTR(-ENOMEM);
+			} else if (befs_read_lsymlink(sb, data, link, len) != len) {
+				kfree(link);
+				befs_error(sb, "Failed to read entire long symlink");
+				link = ERR_PTR(-EIO);
+			} else {
+				link[len - 1] = '\0';
+			}
 		}
 	} else {
 		link = befs_ino->i_data.symlink;
diff -druN linux-2.6.32.45-libre2/fs/fuse/dev.c linux-2.6.32.46-libre2/fs/fuse/dev.c
--- linux-2.6.32.45-libre2/fs/fuse/dev.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/fs/fuse/dev.c	2011-08-29 17:31:54.000000000 -0400
@@ -899,6 +899,10 @@
 	if (outarg.namelen > FUSE_NAME_MAX)
 		goto err;
 
+	err = -EINVAL;
+	if (size != sizeof(outarg) + outarg.namelen + 1)
+		goto err;
+
 	name.name = buf;
 	name.len = outarg.namelen;
 	err = fuse_copy_one(cs, buf, outarg.namelen + 1);
diff -druN linux-2.6.32.45-libre2/fs/partitions/efi.c linux-2.6.32.46-libre2/fs/partitions/efi.c
--- linux-2.6.32.45-libre2/fs/partitions/efi.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/fs/partitions/efi.c	2011-08-29 17:31:54.000000000 -0400
@@ -311,6 +311,15 @@
 		goto fail;
 	}
 
+	/* Check the GUID Partition Table header size */
+	if (le32_to_cpu((*gpt)->header_size) >
+			bdev_logical_block_size(bdev)) {
+		pr_debug("GUID Partition Table Header size is wrong: %u > %u\n",
+			le32_to_cpu((*gpt)->header_size),
+			bdev_logical_block_size(bdev));
+		goto fail;
+	}
+
 	/* Check the GUID Partition Table CRC */
 	origcrc = le32_to_cpu((*gpt)->header_crc32);
 	(*gpt)->header_crc32 = 0;
diff -druN linux-2.6.32.45-libre2/kernel/futex.c linux-2.6.32.46-libre2/kernel/futex.c
--- linux-2.6.32.45-libre2/kernel/futex.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/kernel/futex.c	2011-08-29 17:31:54.000000000 -0400
@@ -203,6 +203,8 @@
  * @uaddr:	virtual address of the futex
  * @fshared:	0 for a PROCESS_PRIVATE futex, 1 for PROCESS_SHARED
  * @key:	address where result is stored.
+ * @rw:		mapping needs to be read/write (values: VERIFY_READ,
+ *              VERIFY_WRITE)
  *
  * Returns a negative error code or 0
  * The key words are stored in *key on success.
@@ -214,12 +216,12 @@
  * lock_page() might sleep, the caller should not hold a spinlock.
  */
 static int
-get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key)
+get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw)
 {
 	unsigned long address = (unsigned long)uaddr;
 	struct mm_struct *mm = current->mm;
 	struct page *page;
-	int err;
+	int err, ro = 0;
 
 	/*
 	 * The futex address must be "naturally" aligned.
@@ -247,14 +249,31 @@
 
 again:
 	err = get_user_pages_fast(address, 1, 1, &page);
+	/*
+	 * If write access is not required (eg. FUTEX_WAIT), try
+	 * and get read-only access.
+	 */
+	if (err == -EFAULT && rw == VERIFY_READ) {
+		err = get_user_pages_fast(address, 1, 0, &page);
+		ro = 1;
+	}
 	if (err < 0)
 		return err;
+	else
+		err = 0;
 
 	page = compound_head(page);
 	lock_page(page);
 	if (!page->mapping) {
 		unlock_page(page);
 		put_page(page);
+		/*
+		* ZERO_PAGE pages don't have a mapping. Avoid a busy loop
+		* trying to find one. RW mapping would have COW'd (and thus
+		* have a mapping) so this page is RO and won't ever change.
+		*/
+		if ((page == ZERO_PAGE(address)))
+			return -EFAULT;
 		goto again;
 	}
 
@@ -266,6 +285,15 @@
 	 * the object not the particular process.
 	 */
 	if (PageAnon(page)) {
+		/*
+		 * A RO anonymous page will never change and thus doesn't make
+		 * sense for futex operations.
+		 */
+		if (ro) {
+			err = -EFAULT;
+			goto out;
+		}
+
 		key->both.offset |= FUT_OFF_MMSHARED; /* ref taken on mm */
 		key->private.mm = mm;
 		key->private.address = address;
@@ -277,9 +305,10 @@
 
 	get_futex_key_refs(key);
 
+out:
 	unlock_page(page);
 	put_page(page);
-	return 0;
+	return err;
 }
 
 static inline
@@ -880,7 +909,7 @@
 	if (!bitset)
 		return -EINVAL;
 
-	ret = get_futex_key(uaddr, fshared, &key);
+	ret = get_futex_key(uaddr, fshared, &key, VERIFY_READ);
 	if (unlikely(ret != 0))
 		goto out;
 
@@ -926,10 +955,10 @@
 	int ret, op_ret;
 
 retry:
-	ret = get_futex_key(uaddr1, fshared, &key1);
+	ret = get_futex_key(uaddr1, fshared, &key1, VERIFY_READ);
 	if (unlikely(ret != 0))
 		goto out;
-	ret = get_futex_key(uaddr2, fshared, &key2);
+	ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE);
 	if (unlikely(ret != 0))
 		goto out_put_key1;
 
@@ -1188,10 +1217,11 @@
 		pi_state = NULL;
 	}
 
-	ret = get_futex_key(uaddr1, fshared, &key1);
+	ret = get_futex_key(uaddr1, fshared, &key1, VERIFY_READ);
 	if (unlikely(ret != 0))
 		goto out;
-	ret = get_futex_key(uaddr2, fshared, &key2);
+	ret = get_futex_key(uaddr2, fshared, &key2,
+			    requeue_pi ? VERIFY_WRITE : VERIFY_READ);
 	if (unlikely(ret != 0))
 		goto out_put_key1;
 
@@ -1746,7 +1776,7 @@
 	 */
 retry:
 	q->key = FUTEX_KEY_INIT;
-	ret = get_futex_key(uaddr, fshared, &q->key);
+	ret = get_futex_key(uaddr, fshared, &q->key, VERIFY_READ);
 	if (unlikely(ret != 0))
 		return ret;
 
@@ -1912,7 +1942,7 @@
 	q.requeue_pi_key = NULL;
 retry:
 	q.key = FUTEX_KEY_INIT;
-	ret = get_futex_key(uaddr, fshared, &q.key);
+	ret = get_futex_key(uaddr, fshared, &q.key, VERIFY_WRITE);
 	if (unlikely(ret != 0))
 		goto out;
 
@@ -2031,7 +2061,7 @@
 	if ((uval & FUTEX_TID_MASK) != task_pid_vnr(current))
 		return -EPERM;
 
-	ret = get_futex_key(uaddr, fshared, &key);
+	ret = get_futex_key(uaddr, fshared, &key, VERIFY_WRITE);
 	if (unlikely(ret != 0))
 		goto out;
 
@@ -2223,7 +2253,7 @@
 	rt_waiter.task = NULL;
 
 	key2 = FUTEX_KEY_INIT;
-	ret = get_futex_key(uaddr2, fshared, &key2);
+	ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE);
 	if (unlikely(ret != 0))
 		goto out;
 
diff -druN linux-2.6.32.45-libre2/Makefile linux-2.6.32.46-libre2/Makefile
--- linux-2.6.32.45-libre2/Makefile	2011-08-17 02:36:31.000000000 -0400
+++ linux-2.6.32.46-libre2/Makefile	2011-08-31 10:26:07.000000000 -0400
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 32
-EXTRAVERSION = .45-libre2
+EXTRAVERSION = .46-libre2
 NAME = Man-Eating Seals of Antiquity
 
 # *DOCUMENTATION*
diff -druN linux-2.6.32.45-libre2/mm/vmalloc.c linux-2.6.32.46-libre2/mm/vmalloc.c
--- linux-2.6.32.45-libre2/mm/vmalloc.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/mm/vmalloc.c	2011-08-29 17:31:54.000000000 -0400
@@ -671,9 +671,10 @@
 #define VMAP_BBMAP_BITS_MIN	(VMAP_MAX_ALLOC*2)
 #define VMAP_MIN(x, y)		((x) < (y) ? (x) : (y)) /* can't use min() */
 #define VMAP_MAX(x, y)		((x) > (y) ? (x) : (y)) /* can't use max() */
-#define VMAP_BBMAP_BITS		VMAP_MIN(VMAP_BBMAP_BITS_MAX,		\
-					VMAP_MAX(VMAP_BBMAP_BITS_MIN,	\
-						VMALLOC_PAGES / NR_CPUS / 16))
+#define VMAP_BBMAP_BITS		\
+		VMAP_MIN(VMAP_BBMAP_BITS_MAX,	\
+		VMAP_MAX(VMAP_BBMAP_BITS_MIN,	\
+			VMALLOC_PAGES / roundup_pow_of_two(NR_CPUS) / 16))
 
 #define VMAP_BLOCK_SIZE		(VMAP_BBMAP_BITS * PAGE_SIZE)
 
diff -druN linux-2.6.32.45-libre2/net/atm/br2684.c linux-2.6.32.46-libre2/net/atm/br2684.c
--- linux-2.6.32.45-libre2/net/atm/br2684.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/net/atm/br2684.c	2011-08-29 17:31:54.000000000 -0400
@@ -208,8 +208,6 @@
 		if (brdev->payload == p_bridged) {
 			skb_push(skb, 2);
 			memset(skb->data, 0, 2);
-		} else { /* p_routed */
-			skb_pull(skb, ETH_HLEN);
 		}
 	}
 	skb_debug(skb);
diff -druN linux-2.6.32.45-libre2/sound/pci/ac97/ac97_patch.c linux-2.6.32.46-libre2/sound/pci/ac97/ac97_patch.c
--- linux-2.6.32.45-libre2/sound/pci/ac97/ac97_patch.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/sound/pci/ac97/ac97_patch.c	2011-08-29 17:31:54.000000000 -0400
@@ -1915,6 +1915,7 @@
 	0x103c0944, /* HP nc6220 */
 	0x103c0934, /* HP nc8220 */
 	0x103c006d, /* HP nx9105 */
+	0x103c300d, /* HP Compaq dc5100 SFF(PT003AW) */
 	0x17340088, /* FSC Scenic-W */
 	0 /* end */
 };
diff -druN linux-2.6.32.45-libre2/sound/usb/caiaq/audio.c linux-2.6.32.46-libre2/sound/usb/caiaq/audio.c
--- linux-2.6.32.45-libre2/sound/usb/caiaq/audio.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/sound/usb/caiaq/audio.c	2011-08-29 17:31:54.000000000 -0400
@@ -138,8 +138,12 @@
 
 	for (i = 0; i < N_URBS; i++) {
 		usb_kill_urb(dev->data_urbs_in[i]);
-		usb_kill_urb(dev->data_urbs_out[i]);
+
+		if (test_bit(i, &dev->outurb_active_mask))
+			usb_kill_urb(dev->data_urbs_out[i]);
 	}
+
+	dev->outurb_active_mask = 0;
 }
 
 static int snd_usb_caiaq_substream_open(struct snd_pcm_substream *substream)
@@ -466,8 +470,9 @@
 {
 	struct snd_usb_caiaq_cb_info *info = urb->context;
 	struct snd_usb_caiaqdev *dev;
-	struct urb *out;
-	int frame, len, send_it = 0, outframe = 0;
+	struct urb *out = NULL;
+	int i, frame, len, send_it = 0, outframe = 0;
+	size_t offset = 0;
 
 	if (urb->status || !info)
 		return;
@@ -477,7 +482,17 @@
 	if (!dev->streaming)
 		return;
 
-	out = dev->data_urbs_out[info->index];
+	/* find an unused output urb that is unused */
+	for (i = 0; i < N_URBS; i++)
+		if (test_and_set_bit(i, &dev->outurb_active_mask) == 0) {
+			out = dev->data_urbs_out[i];
+			break;
+		}
+
+	if (!out) {
+		log("Unable to find an output urb to use\n");
+		goto requeue;
+	}
 
 	/* read the recently received packet and send back one which has
 	 * the same layout */
@@ -488,7 +503,8 @@
 		len = urb->iso_frame_desc[outframe].actual_length;
 		out->iso_frame_desc[outframe].length = len;
 		out->iso_frame_desc[outframe].actual_length = 0;
-		out->iso_frame_desc[outframe].offset = BYTES_PER_FRAME * frame;
+		out->iso_frame_desc[outframe].offset = offset;
+		offset += len;
 
 		if (len > 0) {
 			spin_lock(&dev->spinlock);
@@ -504,11 +520,15 @@
 	}
 
 	if (send_it) {
-		out->number_of_packets = FRAMES_PER_URB;
+		out->number_of_packets = outframe;
 		out->transfer_flags = URB_ISO_ASAP;
 		usb_submit_urb(out, GFP_ATOMIC);
+	} else {
+		struct snd_usb_caiaq_cb_info *oinfo = out->context;
+		clear_bit(oinfo->index, &dev->outurb_active_mask);
 	}
 
+requeue:
 	/* re-submit inbound urb */
 	for (frame = 0; frame < FRAMES_PER_URB; frame++) {
 		urb->iso_frame_desc[frame].offset = BYTES_PER_FRAME * frame;
@@ -530,6 +550,8 @@
 		dev->output_running = 1;
 		wake_up(&dev->prepare_wait_queue);
 	}
+
+	clear_bit(info->index, &dev->outurb_active_mask);
 }
 
 static struct urb **alloc_urbs(struct snd_usb_caiaqdev *dev, int dir, int *ret)
@@ -680,6 +702,9 @@
 	if (!dev->data_cb_info)
 		return -ENOMEM;
 
+	dev->outurb_active_mask = 0;
+	BUILD_BUG_ON(N_URBS > (sizeof(dev->outurb_active_mask) * 8));
+
 	for (i = 0; i < N_URBS; i++) {
 		dev->data_cb_info[i].dev = dev;
 		dev->data_cb_info[i].index = i;
diff -druN linux-2.6.32.45-libre2/sound/usb/caiaq/device.h linux-2.6.32.46-libre2/sound/usb/caiaq/device.h
--- linux-2.6.32.45-libre2/sound/usb/caiaq/device.h	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/sound/usb/caiaq/device.h	2011-08-29 17:31:54.000000000 -0400
@@ -92,6 +92,7 @@
 	int input_panic, output_panic, warned;
 	char *audio_in_buf, *audio_out_buf;
 	unsigned int samplerates, bpp;
+	unsigned long outurb_active_mask;
 
 	struct snd_pcm_substream *sub_playback[MAX_STREAMS];
 	struct snd_pcm_substream *sub_capture[MAX_STREAMS];
diff -druN linux-2.6.32.45-libre2/tools/perf/util/config.c linux-2.6.32.46-libre2/tools/perf/util/config.c
--- linux-2.6.32.45-libre2/tools/perf/util/config.c	2011-08-15 21:57:37.000000000 -0400
+++ linux-2.6.32.46-libre2/tools/perf/util/config.c	2011-08-29 17:31:54.000000000 -0400
@@ -416,7 +416,6 @@
 int perf_config(config_fn_t fn, void *data)
 {
 	int ret = 0, found = 0;
-	char *repo_config = NULL;
 	const char *home = NULL;
 
 	/* Setting $PERF_CONFIG makes perf read _only_ the given config file. */
@@ -438,12 +437,6 @@
 		free(user_config);
 	}
 
-	repo_config = perf_pathdup("config");
-	if (!access(repo_config, R_OK)) {
-		ret += perf_config_from_file(fn, repo_config, data);
-		found += 1;
-	}
-	free(repo_config);
 	if (found == 0)
 		return -1;
 	return ret;
