diff -druN linux-libre-2.6.32.58-libre2/arch/ia64/Kconfig linux-libre-2.6.32.59-libre2/arch/ia64/Kconfig
--- linux-libre-2.6.32.58-libre2/arch/ia64/Kconfig	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/arch/ia64/Kconfig	2012-03-17 06:14:52.000000000 -0400
@@ -502,23 +502,6 @@
 	def_bool y
 	depends on PROC_KCORE
 
-config IA32_SUPPORT
-	bool "Support for Linux/x86 binaries"
-	help
-	  IA-64 processors can execute IA-32 (X86) instructions.  By
-	  saying Y here, the kernel will include IA-32 system call
-	  emulation support which makes it possible to transparently
-	  run IA-32 Linux binaries on an IA-64 Linux system.
-	  If in doubt, say Y.
-
-config COMPAT
-	bool
-	depends on IA32_SUPPORT
-	default y
-
-config COMPAT_FOR_U64_ALIGNMENT
-	def_bool COMPAT
-
 config IA64_MCA_RECOVERY
 	tristate "MCA recovery from errors other than TLB."
 
diff -druN linux-libre-2.6.32.58-libre2/arch/s390/Kconfig linux-libre-2.6.32.59-libre2/arch/s390/Kconfig
--- linux-libre-2.6.32.58-libre2/arch/s390/Kconfig	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/arch/s390/Kconfig	2012-03-17 06:14:52.000000000 -0400
@@ -188,6 +188,9 @@
 	depends on COMPAT && SYSVIPC
 	default y
 
+config KEYS_COMPAT
+	def_bool y if COMPAT && KEYS
+
 config AUDIT_ARCH
 	bool
 	default y
diff -druN linux-libre-2.6.32.58-libre2/arch/s390/kernel/setup.c linux-libre-2.6.32.59-libre2/arch/s390/kernel/setup.c
--- linux-libre-2.6.32.58-libre2/arch/s390/kernel/setup.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/arch/s390/kernel/setup.c	2012-03-17 06:14:52.000000000 -0400
@@ -57,6 +57,7 @@
 #include <asm/ptrace.h>
 #include <asm/sections.h>
 #include <asm/ebcdic.h>
+#include <asm/compat.h>
 #include <asm/kvm_virtio.h>
 
 long psw_kernel_bits	= (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY |
diff -druN linux-libre-2.6.32.58-libre2/block/bsg.c linux-libre-2.6.32.59-libre2/block/bsg.c
--- linux-libre-2.6.32.58-libre2/block/bsg.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/block/bsg.c	2012-03-17 06:14:52.000000000 -0400
@@ -977,7 +977,8 @@
 
 	mutex_lock(&bsg_mutex);
 	idr_remove(&bsg_minor_idr, bcd->minor);
-	sysfs_remove_link(&q->kobj, "bsg");
+	if (q->kobj.sd)
+		sysfs_remove_link(&q->kobj, "bsg");
 	device_unregister(bcd->class_dev);
 	bcd->class_dev = NULL;
 	kref_put(&bcd->ref, bsg_kref_release_function);
diff -druN linux-libre-2.6.32.58-libre2/drivers/block/xen-blkfront.c linux-libre-2.6.32.59-libre2/drivers/block/xen-blkfront.c
--- linux-libre-2.6.32.58-libre2/drivers/block/xen-blkfront.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/drivers/block/xen-blkfront.c	2012-03-17 06:14:52.000000000 -0400
@@ -942,11 +942,11 @@
 	/* Flush gnttab callback work. Must be done with no locks held. */
 	flush_scheduled_work();
 
+	del_gendisk(info->gd);
+
 	blk_cleanup_queue(info->rq);
 	info->rq = NULL;
 
-	del_gendisk(info->gd);
-
  out:
 	xenbus_frontend_closed(dev);
 }
diff -druN linux-libre-2.6.32.58-libre2/drivers/net/usb/usbnet.c linux-libre-2.6.32.59-libre2/drivers/net/usb/usbnet.c
--- linux-libre-2.6.32.58-libre2/drivers/net/usb/usbnet.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/drivers/net/usb/usbnet.c	2012-03-17 06:14:52.000000000 -0400
@@ -584,6 +584,7 @@
 		entry = (struct skb_data *) skb->cb;
 		urb = entry->urb;
 
+		spin_unlock_irqrestore(&q->lock, flags);
 		// during some PM-driven resume scenarios,
 		// these (async) unlinks complete immediately
 		retval = usb_unlink_urb (urb);
@@ -591,6 +592,7 @@
 			devdbg (dev, "unlink urb err, %d", retval);
 		else
 			count++;
+		spin_lock_irqsave(&q->lock, flags);
 	}
 	spin_unlock_irqrestore (&q->lock, flags);
 	return count;
diff -druN linux-libre-2.6.32.58-libre2/drivers/watchdog/hpwdt.c linux-libre-2.6.32.59-libre2/drivers/watchdog/hpwdt.c
--- linux-libre-2.6.32.58-libre2/drivers/watchdog/hpwdt.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/drivers/watchdog/hpwdt.c	2012-03-17 06:14:52.000000000 -0400
@@ -220,7 +220,7 @@
 
 	cmn_regs.u1.reax = CRU_BIOS_SIGNATURE_VALUE;
 
-	set_memory_x((unsigned long)bios32_entrypoint, (2 * PAGE_SIZE));
+	set_memory_x((unsigned long)bios32_map, 2);
 	asminline_call(&cmn_regs, bios32_entrypoint);
 
 	if (cmn_regs.u1.ral != 0) {
@@ -239,7 +239,8 @@
 			cru_rom_addr =
 				ioremap(cru_physical_address, cru_length);
 			if (cru_rom_addr) {
-				set_memory_x((unsigned long)cru_rom_addr, cru_length);
+				set_memory_x((unsigned long)cru_rom_addr & PAGE_MASK,
+					(cru_length + PAGE_SIZE - 1) >> PAGE_SHIFT);
 				retval = 0;
 			}
 		}
diff -druN linux-libre-2.6.32.58-libre2/fs/binfmt_elf.c linux-libre-2.6.32.59-libre2/fs/binfmt_elf.c
--- linux-libre-2.6.32.58-libre2/fs/binfmt_elf.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/fs/binfmt_elf.c	2012-03-17 06:14:52.000000000 -0400
@@ -1452,7 +1452,7 @@
 	for (i = 1; i < view->n; ++i) {
 		const struct user_regset *regset = &view->regsets[i];
 		do_thread_regset_writeback(t->task, regset);
-		if (regset->core_note_type &&
+		if (regset->core_note_type && regset->get &&
 		    (!regset->active || regset->active(t->task, regset))) {
 			int ret;
 			size_t size = regset->n * regset->size;
diff -druN linux-libre-2.6.32.58-libre2/fs/cifs/dir.c linux-libre-2.6.32.59-libre2/fs/cifs/dir.c
--- linux-libre-2.6.32.58-libre2/fs/cifs/dir.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/fs/cifs/dir.c	2012-03-17 06:14:52.000000000 -0400
@@ -691,10 +691,26 @@
 			 * If either that or op not supported returned, follow
 			 * the normal lookup.
 			 */
-			if ((rc == 0) || (rc == -ENOENT))
+			switch (rc) {
+			case 0:
+				/*
+				 * The server may allow us to open things like
+				 * FIFOs, but the client isn't set up to deal
+				 * with that. If it's not a regular file, just
+				 * close it and proceed as if it were a normal
+				 * lookup.
+				 */
+				if (newInode && !S_ISREG(newInode->i_mode)) {
+					CIFSSMBClose(xid, pTcon, fileHandle);
+					break;
+				}
+			case -ENOENT:
 				posix_open = true;
-			else if ((rc == -EINVAL) || (rc != -EOPNOTSUPP))
+			case -EOPNOTSUPP:
+				break;
+			default:
 				pTcon->broken_posix_open = true;
+			}
 		}
 		if (!posix_open)
 			rc = cifs_get_inode_info_unix(&newInode, full_path,
diff -druN linux-libre-2.6.32.58-libre2/fs/ecryptfs/crypto.c linux-libre-2.6.32.59-libre2/fs/ecryptfs/crypto.c
--- linux-libre-2.6.32.58-libre2/fs/ecryptfs/crypto.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/fs/ecryptfs/crypto.c	2012-03-17 06:14:52.000000000 -0400
@@ -1455,6 +1455,25 @@
 		ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE;
 }
 
+void ecryptfs_i_size_init(const char *page_virt, struct inode *inode)
+{
+	struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
+	struct ecryptfs_crypt_stat *crypt_stat;
+	u64 file_size;
+
+	crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
+	mount_crypt_stat =
+		&ecryptfs_superblock_to_private(inode->i_sb)->mount_crypt_stat;
+	if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) {
+		file_size = i_size_read(ecryptfs_inode_to_lower(inode));
+		if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
+			file_size += crypt_stat->num_header_bytes_at_front;
+	} else
+		file_size = get_unaligned_be64(page_virt);
+	i_size_write(inode, (loff_t)file_size);
+	crypt_stat->flags |= ECRYPTFS_I_SIZE_INITIALIZED;
+}
+
 /**
  * ecryptfs_read_headers_virt
  * @page_virt: The virtual address into which to read the headers
@@ -1485,6 +1504,8 @@
 		rc = -EINVAL;
 		goto out;
 	}
+	if (!(crypt_stat->flags & ECRYPTFS_I_SIZE_INITIALIZED))
+		ecryptfs_i_size_init(page_virt, ecryptfs_dentry->d_inode);
 	offset += MAGIC_ECRYPTFS_MARKER_SIZE_BYTES;
 	rc = ecryptfs_process_flags(crypt_stat, (page_virt + offset),
 				    &bytes_read);
diff -druN linux-libre-2.6.32.58-libre2/fs/ecryptfs/ecryptfs_kernel.h linux-libre-2.6.32.59-libre2/fs/ecryptfs/ecryptfs_kernel.h
--- linux-libre-2.6.32.58-libre2/fs/ecryptfs/ecryptfs_kernel.h	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/fs/ecryptfs/ecryptfs_kernel.h	2012-03-17 06:14:52.000000000 -0400
@@ -270,6 +270,7 @@
 #define ECRYPTFS_ENCFN_USE_MOUNT_FNEK 0x00001000
 #define ECRYPTFS_ENCFN_USE_FEK        0x00002000
 #define ECRYPTFS_UNLINK_SIGS	      0x00004000
+#define ECRYPTFS_I_SIZE_INITIALIZED   0x00008000
 	u32 flags;
 	unsigned int file_version;
 	size_t iv_bytes;
@@ -619,6 +620,7 @@
 int ecryptfs_interpose(struct dentry *hidden_dentry,
 		       struct dentry *this_dentry, struct super_block *sb,
 		       u32 flags);
+void ecryptfs_i_size_init(const char *page_virt, struct inode *inode);
 int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
 					struct dentry *lower_dentry,
 					struct inode *ecryptfs_dir_inode,
diff -druN linux-libre-2.6.32.58-libre2/fs/ecryptfs/file.c linux-libre-2.6.32.59-libre2/fs/ecryptfs/file.c
--- linux-libre-2.6.32.58-libre2/fs/ecryptfs/file.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/fs/ecryptfs/file.c	2012-03-17 06:14:52.000000000 -0400
@@ -237,7 +237,8 @@
 				goto out_free;
 			}
 			rc = 0;
-			crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
+			crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED
+						| ECRYPTFS_ENCRYPTED);
 			mutex_unlock(&crypt_stat->cs_mutex);
 			goto out;
 		}
diff -druN linux-libre-2.6.32.58-libre2/fs/ecryptfs/inode.c linux-libre-2.6.32.59-libre2/fs/ecryptfs/inode.c
--- linux-libre-2.6.32.58-libre2/fs/ecryptfs/inode.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/fs/ecryptfs/inode.c	2012-03-17 06:14:52.000000000 -0400
@@ -256,10 +256,8 @@
 	struct dentry *lower_dir_dentry;
 	struct vfsmount *lower_mnt;
 	struct inode *lower_inode;
-	struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
 	struct ecryptfs_crypt_stat *crypt_stat;
 	char *page_virt = NULL;
-	u64 file_size;
 	int rc = 0;
 
 	lower_dir_dentry = lower_dentry->d_parent;
@@ -334,18 +332,7 @@
 		}
 		crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR;
 	}
-	mount_crypt_stat = &ecryptfs_superblock_to_private(
-		ecryptfs_dentry->d_sb)->mount_crypt_stat;
-	if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) {
-		if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
-			file_size = (crypt_stat->num_header_bytes_at_front
-				     + i_size_read(lower_dentry->d_inode));
-		else
-			file_size = i_size_read(lower_dentry->d_inode);
-	} else {
-		file_size = get_unaligned_be64(page_virt);
-	}
-	i_size_write(ecryptfs_dentry->d_inode, (loff_t)file_size);
+	ecryptfs_i_size_init(page_virt, ecryptfs_dentry->d_inode);
 out_free_kmem:
 	kmem_cache_free(ecryptfs_header_cache_2, page_virt);
 	goto out;
@@ -964,7 +951,8 @@
 				goto out;
 			}
 			rc = 0;
-			crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
+			crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED
+						| ECRYPTFS_ENCRYPTED);
 		}
 	}
 	mutex_unlock(&crypt_stat->cs_mutex);
diff -druN linux-libre-2.6.32.58-libre2/include/linux/backing-dev.h linux-libre-2.6.32.59-libre2/include/linux/backing-dev.h
--- linux-libre-2.6.32.58-libre2/include/linux/backing-dev.h	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/include/linux/backing-dev.h	2012-03-17 06:14:52.000000000 -0400
@@ -105,6 +105,7 @@
 				long nr_pages);
 int bdi_writeback_task(struct bdi_writeback *wb);
 int bdi_has_dirty_io(struct backing_dev_info *bdi);
+void bdi_arm_supers_timer(void);
 
 extern spinlock_t bdi_lock;
 extern struct list_head bdi_list;
diff -druN linux-libre-2.6.32.58-libre2/include/linux/regset.h linux-libre-2.6.32.59-libre2/include/linux/regset.h
--- linux-libre-2.6.32.58-libre2/include/linux/regset.h	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/include/linux/regset.h	2012-03-17 06:14:52.000000000 -0400
@@ -335,8 +335,11 @@
 {
 	const struct user_regset *regset = &view->regsets[setno];
 
+	if (!regset->get)
+		return -EOPNOTSUPP;
+
 	if (!access_ok(VERIFY_WRITE, data, size))
-		return -EIO;
+		return -EFAULT;
 
 	return regset->get(target, regset, offset, size, NULL, data);
 }
@@ -358,8 +361,11 @@
 {
 	const struct user_regset *regset = &view->regsets[setno];
 
+	if (!regset->set)
+		return -EOPNOTSUPP;
+
 	if (!access_ok(VERIFY_READ, data, size))
-		return -EIO;
+		return -EFAULT;
 
 	return regset->set(target, regset, offset, size, NULL, data);
 }
diff -druN linux-libre-2.6.32.58-libre2/Makefile linux-libre-2.6.32.59-libre2/Makefile
--- linux-libre-2.6.32.58-libre2/Makefile	2012-03-04 23:50:30.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/Makefile	2012-03-18 13:24:30.000000000 -0400
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 32
-EXTRAVERSION = .58-libre2
+EXTRAVERSION = .59-libre2
 NAME = Man-Eating Seals of Antiquity
 
 # *DOCUMENTATION*
diff -druN linux-libre-2.6.32.58-libre2/mm/backing-dev.c linux-libre-2.6.32.59-libre2/mm/backing-dev.c
--- linux-libre-2.6.32.58-libre2/mm/backing-dev.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/mm/backing-dev.c	2012-03-17 06:14:52.000000000 -0400
@@ -41,7 +41,6 @@
 
 static int bdi_sync_supers(void *);
 static void sync_supers_timer_fn(unsigned long);
-static void arm_supers_timer(void);
 
 static void bdi_add_default_flusher_task(struct backing_dev_info *bdi);
 
@@ -242,7 +241,7 @@
 
 	init_timer(&sync_supers_timer);
 	setup_timer(&sync_supers_timer, sync_supers_timer_fn, 0);
-	arm_supers_timer();
+	bdi_arm_supers_timer();
 
 	err = bdi_init(&default_backing_dev_info);
 	if (!err)
@@ -364,10 +363,13 @@
 	return 0;
 }
 
-static void arm_supers_timer(void)
+void bdi_arm_supers_timer(void)
 {
 	unsigned long next;
 
+	if (!dirty_writeback_interval)
+		return;
+
 	next = msecs_to_jiffies(dirty_writeback_interval * 10) + jiffies;
 	mod_timer(&sync_supers_timer, round_jiffies_up(next));
 }
@@ -375,7 +377,7 @@
 static void sync_supers_timer_fn(unsigned long unused)
 {
 	wake_up_process(sync_supers_tsk);
-	arm_supers_timer();
+	bdi_arm_supers_timer();
 }
 
 static int bdi_forker_task(void *ptr)
@@ -418,7 +420,10 @@
 
 			spin_unlock_bh(&bdi_lock);
 			wait = msecs_to_jiffies(dirty_writeback_interval * 10);
-			schedule_timeout(wait);
+			if (wait)
+				schedule_timeout(wait);
+			else
+				schedule();
 			try_to_freeze();
 			continue;
 		}
diff -druN linux-libre-2.6.32.58-libre2/mm/page-writeback.c linux-libre-2.6.32.59-libre2/mm/page-writeback.c
--- linux-libre-2.6.32.58-libre2/mm/page-writeback.c	2012-03-04 12:49:44.000000000 -0500
+++ linux-libre-2.6.32.59-libre2/mm/page-writeback.c	2012-03-17 06:14:52.000000000 -0400
@@ -694,6 +694,7 @@
 	void __user *buffer, size_t *length, loff_t *ppos)
 {
 	proc_dointvec(table, write, buffer, length, ppos);
+	bdi_arm_supers_timer();
 	return 0;
 }
 
