diff -druN linux-libre-2.6.27.61-libre5/arch/powerpc/include/asm/ppc_asm.h linux-libre-2.6.27.62-libre5/arch/powerpc/include/asm/ppc_asm.h
--- linux-libre-2.6.27.61-libre5/arch/powerpc/include/asm/ppc_asm.h	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/arch/powerpc/include/asm/ppc_asm.h	2012-03-17 09:03:58.000000000 -0400
@@ -166,6 +166,7 @@
 #define HMT_MEDIUM	or	2,2,2
 #define HMT_MEDIUM_HIGH or	5,5,5		# medium high priority
 #define HMT_HIGH	or	3,3,3
+#define HMT_EXTRA_HIGH	or	7,7,7		# power7 only
 
 /* handle instructions that older assemblers may not know */
 #define RFCI		.long 0x4c000066	/* rfci instruction */
diff -druN linux-libre-2.6.27.61-libre5/arch/powerpc/include/asm/reg.h linux-libre-2.6.27.62-libre5/arch/powerpc/include/asm/reg.h
--- linux-libre-2.6.27.61-libre5/arch/powerpc/include/asm/reg.h	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/arch/powerpc/include/asm/reg.h	2012-03-17 09:03:58.000000000 -0400
@@ -172,8 +172,43 @@
 #define SPRN_TBWL	0x11C	/* Time Base Lower Register (super, R/W) */
 #define SPRN_TBWU	0x11D	/* Time Base Upper Register (super, R/W) */
 #define SPRN_SPURR	0x134	/* Scaled PURR */
+#define SPRN_HSPRG0	0x130	/* Hypervisor Scratch 0 */
+#define SPRN_HSPRG1	0x131	/* Hypervisor Scratch 1 */
+#define SPRN_HDSISR     0x132
+#define SPRN_HDAR       0x133
+#define SPRN_HDEC	0x136	/* Hypervisor Decrementer */
 #define SPRN_HIOR	0x137	/* 970 Hypervisor interrupt offset */
+#define SPRN_RMOR	0x138	/* Real mode offset register */
+#define SPRN_HRMOR	0x139	/* Real mode offset register */
+#define SPRN_HSRR0	0x13A	/* Hypervisor Save/Restore 0 */
+#define SPRN_HSRR1	0x13B	/* Hypervisor Save/Restore 1 */
 #define SPRN_LPCR	0x13E	/* LPAR Control Register */
+#define   LPCR_VPM0	(1ul << (63-0))
+#define   LPCR_VPM1	(1ul << (63-1))
+#define   LPCR_ISL	(1ul << (63-2))
+#define   LPCR_DPFD_SH	(63-11)
+#define   LPCR_VRMA_L	(1ul << (63-12))
+#define   LPCR_VRMA_LP0	(1ul << (63-15))
+#define   LPCR_VRMA_LP1	(1ul << (63-16))
+#define   LPCR_RMLS    0x1C000000      /* impl dependent rmo limit sel */
+#define   LPCR_ILE     0x02000000      /* !HV irqs set MSR:LE */
+#define   LPCR_PECE	0x00007000	/* powersave exit cause enable */
+#define     LPCR_PECE0	0x00004000	/* ext. exceptions can cause exit */
+#define     LPCR_PECE1	0x00002000	/* decrementer can cause exit */
+#define     LPCR_PECE2	0x00001000	/* machine check etc can cause exit */
+#define   LPCR_MER	0x00000800	/* Mediated External Exception */
+#define   LPCR_LPES0   0x00000008      /* LPAR Env selector 0 */
+#define   LPCR_LPES1   0x00000004      /* LPAR Env selector 1 */
+#define   LPCR_RMI     0x00000002      /* real mode is cache inhibit */
+#define   LPCR_HDICE   0x00000001      /* Hyp Decr enable (HV,PR,EE) */
+#define SPRN_LPID	0x13F	/* Logical Partition Identifier */
+#define	SPRN_HMER	0x150	/* Hardware m? error recovery */
+#define	SPRN_HMEER	0x151	/* Hardware m? enable error recovery */
+#define	SPRN_HEIR	0x153	/* Hypervisor Emulated Instruction Register */
+#define SPRN_TLBINDEXR	0x154	/* P7 TLB control register */
+#define SPRN_TLBVPNR	0x155	/* P7 TLB control register */
+#define SPRN_TLBRPNR	0x156	/* P7 TLB control register */
+#define SPRN_TLBLPIDR	0x157	/* P7 TLB control register */
 #define SPRN_DBAT0L	0x219	/* Data BAT 0 Lower Register */
 #define SPRN_DBAT0U	0x218	/* Data BAT 0 Upper Register */
 #define SPRN_DBAT1L	0x21B	/* Data BAT 1 Lower Register */
@@ -392,12 +427,18 @@
 #define SPRN_SRR0	0x01A	/* Save/Restore Register 0 */
 #define SPRN_SRR1	0x01B	/* Save/Restore Register 1 */
 #define   SRR1_WAKEMASK		0x00380000 /* reason for wakeup */
-#define   SRR1_WAKERESET	0x00380000 /* System reset */
 #define   SRR1_WAKESYSERR	0x00300000 /* System error */
 #define   SRR1_WAKEEE		0x00200000 /* External interrupt */
 #define   SRR1_WAKEMT		0x00280000 /* mtctrl */
+#define	  SRR1_WAKEHMI		0x00280000 /* Hypervisor maintenance */
 #define   SRR1_WAKEDEC		0x00180000 /* Decrementer interrupt */
 #define   SRR1_WAKETHERM	0x00100000 /* Thermal management interrupt */
+#define	  SRR1_WAKERESET	0x00100000 /* System reset */
+#define	  SRR1_WAKESTATE	0x00030000 /* Powersave exit mask [46:47] */
+#define	  SRR1_WS_DEEPEST	0x00030000 /* Some resources not maintained,
+					  * may not be recoverable */
+#define	  SRR1_WS_DEEPER	0x00020000 /* Some resources not maintained */
+#define	  SRR1_WS_DEEP		0x00010000 /* All resources maintained */
 #define SPRN_HSRR0	0x13A	/* Save/Restore Register 0 */
 #define SPRN_HSRR1	0x13B	/* Save/Restore Register 1 */
 
@@ -698,6 +739,8 @@
 #define PV_POWER5	0x003A
 #define PV_POWER5p	0x003B
 #define PV_970FX	0x003C
+#define PV_POWER6	0x003E
+#define PV_POWER7	0x003F
 #define PV_630		0x0040
 #define PV_630p	0x0041
 #define PV_970MP	0x0044
diff -druN linux-libre-2.6.27.61-libre5/drivers/cdrom/cdrom.c linux-libre-2.6.27.62-libre5/drivers/cdrom/cdrom.c
--- linux-libre-2.6.27.61-libre5/drivers/cdrom/cdrom.c	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/drivers/cdrom/cdrom.c	2012-03-17 09:03:58.000000000 -0400
@@ -2044,11 +2044,6 @@
 	if (!nr)
 		return -ENOMEM;
 
-	if (!access_ok(VERIFY_WRITE, ubuf, nframes * CD_FRAMESIZE_RAW)) {
-		ret = -EFAULT;
-		goto out;
-	}
-
 	cgc.data_direction = CGC_DATA_READ;
 	while (nframes > 0) {
 		if (nr > nframes)
@@ -2057,7 +2052,7 @@
 		ret = cdrom_read_block(cdi, &cgc, lba, nr, 1, CD_FRAMESIZE_RAW);
 		if (ret)
 			break;
-		if (__copy_to_user(ubuf, cgc.buffer, CD_FRAMESIZE_RAW * nr)) {
+		if (copy_to_user(ubuf, cgc.buffer, CD_FRAMESIZE_RAW * nr)) {
 			ret = -EFAULT;
 			break;
 		}
@@ -2065,7 +2060,6 @@
 		nframes -= nr;
 		lba += nr;
 	}
-out:
 	kfree(cgc.buffer);
 	return ret;
 }
diff -druN linux-libre-2.6.27.61-libre5/drivers/infiniband/hw/mlx4/mad.c linux-libre-2.6.27.62-libre5/drivers/infiniband/hw/mlx4/mad.c
--- linux-libre-2.6.27.61-libre5/drivers/infiniband/hw/mlx4/mad.c	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/drivers/infiniband/hw/mlx4/mad.c	2012-03-17 09:03:58.000000000 -0400
@@ -246,12 +246,9 @@
 			return IB_MAD_RESULT_SUCCESS;
 
 		/*
-		 * Don't process SMInfo queries or vendor-specific
-		 * MADs -- the SMA can't handle them.
+		 * Don't process SMInfo queries -- the SMA can't handle them.
 		 */
-		if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO ||
-		    ((in_mad->mad_hdr.attr_id & IB_SMP_ATTR_VENDOR_MASK) ==
-		     IB_SMP_ATTR_VENDOR_MASK))
+		if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_SM_INFO)
 			return IB_MAD_RESULT_SUCCESS;
 	} else if (in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT ||
 		   in_mad->mad_hdr.mgmt_class == MLX4_IB_VENDOR_CLASS1   ||
diff -druN linux-libre-2.6.27.61-libre5/drivers/video/atmel_lcdfb.c linux-libre-2.6.27.62-libre5/drivers/video/atmel_lcdfb.c
--- linux-libre-2.6.27.61-libre5/drivers/video/atmel_lcdfb.c	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/drivers/video/atmel_lcdfb.c	2012-03-17 09:03:58.000000000 -0400
@@ -1031,7 +1031,7 @@
 	 */
 	lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0UL);
 
-	sinfo->saved_lcdcon = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_VAL);
+	sinfo->saved_lcdcon = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_CTR);
 	lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, 0);
 	if (sinfo->atmel_lcdfb_power_control)
 		sinfo->atmel_lcdfb_power_control(0);
diff -druN linux-libre-2.6.27.61-libre5/fs/ecryptfs/file.c linux-libre-2.6.27.62-libre5/fs/ecryptfs/file.c
--- linux-libre-2.6.27.61-libre5/fs/ecryptfs/file.c	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/fs/ecryptfs/file.c	2012-03-17 09:03:58.000000000 -0400
@@ -333,11 +333,11 @@
 
 const struct file_operations ecryptfs_dir_fops = {
 	.readdir = ecryptfs_readdir,
+	.read = generic_read_dir,
 	.unlocked_ioctl = ecryptfs_unlocked_ioctl,
 #ifdef CONFIG_COMPAT
 	.compat_ioctl = ecryptfs_compat_ioctl,
 #endif
-	.mmap = generic_file_mmap,
 	.open = ecryptfs_open,
 	.flush = ecryptfs_flush,
 	.release = ecryptfs_release,
diff -druN linux-libre-2.6.27.61-libre5/fs/ecryptfs/inode.c linux-libre-2.6.27.62-libre5/fs/ecryptfs/inode.c
--- linux-libre-2.6.27.61-libre5/fs/ecryptfs/inode.c	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/fs/ecryptfs/inode.c	2012-03-17 09:03:58.000000000 -0400
@@ -539,8 +539,8 @@
 	dget(lower_dentry);
 	rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry);
 	dput(lower_dentry);
-	if (!rc)
-		d_delete(lower_dentry);
+	if (!rc && dentry->d_inode)
+		clear_nlink(dentry->d_inode);
 	fsstack_copy_attr_times(dir, lower_dir_dentry->d_inode);
 	dir->i_nlink = lower_dir_dentry->d_inode->i_nlink;
 	unlock_dir(lower_dir_dentry);
diff -druN linux-libre-2.6.27.61-libre5/fs/ecryptfs/read_write.c linux-libre-2.6.27.62-libre5/fs/ecryptfs/read_write.c
--- linux-libre-2.6.27.61-libre5/fs/ecryptfs/read_write.c	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/fs/ecryptfs/read_write.c	2012-03-17 09:03:58.000000000 -0400
@@ -136,13 +136,13 @@
 		pgoff_t ecryptfs_page_idx = (pos >> PAGE_CACHE_SHIFT);
 		size_t start_offset_in_page = (pos & ~PAGE_CACHE_MASK);
 		size_t num_bytes = (PAGE_CACHE_SIZE - start_offset_in_page);
-		size_t total_remaining_bytes = ((offset + size) - pos);
+		loff_t total_remaining_bytes = ((offset + size) - pos);
 
 		if (num_bytes > total_remaining_bytes)
 			num_bytes = total_remaining_bytes;
 		if (pos < offset) {
 			/* remaining zeros to write, up to destination offset */
-			size_t total_remaining_zeros = (offset - pos);
+			loff_t total_remaining_zeros = (offset - pos);
 
 			if (num_bytes > total_remaining_zeros)
 				num_bytes = total_remaining_zeros;
diff -druN linux-libre-2.6.27.61-libre5/fs/udf/super.c linux-libre-2.6.27.62-libre5/fs/udf/super.c
--- linux-libre-2.6.27.61-libre5/fs/udf/super.c	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/fs/udf/super.c	2012-03-17 09:03:58.000000000 -0400
@@ -1794,6 +1794,12 @@
 				le16_to_cpu(lvid->descTag.descCRCLength)));
 
 	lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
+	/*
+	 * We set buffer uptodate unconditionally here to avoid spurious
+	 * warnings from mark_buffer_dirty() when previous EIO has marked
+	 * the buffer as !uptodate
+	 */
+	set_buffer_uptodate(bh);
 	mark_buffer_dirty(bh);
 }
 
diff -druN linux-libre-2.6.27.61-libre5/include/linux/proportions.h linux-libre-2.6.27.62-libre5/include/linux/proportions.h
--- linux-libre-2.6.27.61-libre5/include/linux/proportions.h	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/include/linux/proportions.h	2012-03-17 09:03:58.000000000 -0400
@@ -81,7 +81,11 @@
  * Limit the time part in order to ensure there are some bits left for the
  * cycle counter and fraction multiply.
  */
+#if BITS_PER_LONG == 32
 #define PROP_MAX_SHIFT (3*BITS_PER_LONG/4)
+#else
+#define PROP_MAX_SHIFT (BITS_PER_LONG/2)
+#endif
 
 #define PROP_FRAC_SHIFT		(BITS_PER_LONG - PROP_MAX_SHIFT - 1)
 #define PROP_FRAC_BASE		(1UL << PROP_FRAC_SHIFT)
diff -druN linux-libre-2.6.27.61-libre5/kernel/relay.c linux-libre-2.6.27.62-libre5/kernel/relay.c
--- linux-libre-2.6.27.61-libre5/kernel/relay.c	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/kernel/relay.c	2012-03-17 09:03:58.000000000 -0400
@@ -171,10 +171,14 @@
  */
 static struct rchan_buf *relay_create_buf(struct rchan *chan)
 {
-	struct rchan_buf *buf = kzalloc(sizeof(struct rchan_buf), GFP_KERNEL);
-	if (!buf)
+	struct rchan_buf *buf;
+
+	if (chan->n_subbufs > UINT_MAX / sizeof(size_t *))
 		return NULL;
 
+	buf = kzalloc(sizeof(struct rchan_buf), GFP_KERNEL);
+	if (!buf)
+		return NULL;
 	buf->padding = kmalloc(chan->n_subbufs * sizeof(size_t *), GFP_KERNEL);
 	if (!buf->padding)
 		goto free_buf;
@@ -581,6 +585,8 @@
 
 	if (!(subbuf_size && n_subbufs))
 		return NULL;
+	if (subbuf_size > UINT_MAX / n_subbufs)
+		return NULL;
 
 	chan = kzalloc(sizeof(struct rchan), GFP_KERNEL);
 	if (!chan)
diff -druN linux-libre-2.6.27.61-libre5/Makefile linux-libre-2.6.27.62-libre5/Makefile
--- linux-libre-2.6.27.61-libre5/Makefile	2012-02-13 09:31:32.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/Makefile	2012-03-18 13:25:13.000000000 -0400
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 27
-EXTRAVERSION = .61-libre5
+EXTRAVERSION = .62-libre5
 NAME = Trembling Tortoise
 
 # *DOCUMENTATION*
diff -druN linux-libre-2.6.27.61-libre5/mm/filemap_xip.c linux-libre-2.6.27.62-libre5/mm/filemap_xip.c
--- linux-libre-2.6.27.61-libre5/mm/filemap_xip.c	2012-02-12 15:40:04.000000000 -0500
+++ linux-libre-2.6.27.62-libre5/mm/filemap_xip.c	2012-03-17 09:03:58.000000000 -0400
@@ -262,7 +262,12 @@
 							xip_pfn);
 		if (err == -ENOMEM)
 			return VM_FAULT_OOM;
-		BUG_ON(err);
+		/*
+		 * err == -EBUSY is fine, we've raced against another thread
+		 * that faulted-in the same page
+		 */
+		if (err != -EBUSY)
+			BUG_ON(err);
 		return VM_FAULT_NOPAGE;
 	} else {
 		int err, ret = VM_FAULT_OOM;
