diff -druNp --no-dereference linux-libre-4.8.2-gnu/drivers/scsi/hosts.c linux-libre-4.8.3-gnu/drivers/scsi/hosts.c
--- linux-libre-4.8.2-gnu/drivers/scsi/hosts.c	2016-10-16 12:03:56.000000000 -0400
+++ linux-libre-4.8.3-gnu/drivers/scsi/hosts.c	2016-10-20 04:03:41.000000000 -0400
@@ -246,10 +246,6 @@ int scsi_add_host_with_dma(struct Scsi_H
 
 	shost->dma_dev = dma_dev;
 
-	error = device_add(&shost->shost_gendev);
-	if (error)
-		goto out_destroy_freelist;
-
 	/*
 	 * Increase usage count temporarily here so that calling
 	 * scsi_autopm_put_host() will trigger runtime idle if there is
@@ -260,6 +256,10 @@ int scsi_add_host_with_dma(struct Scsi_H
 	pm_runtime_enable(&shost->shost_gendev);
 	device_enable_async_suspend(&shost->shost_gendev);
 
+	error = device_add(&shost->shost_gendev);
+	if (error)
+		goto out_destroy_freelist;
+
 	scsi_host_set_state(shost, SHOST_RUNNING);
 	get_device(shost->shost_gendev.parent);
 
@@ -309,6 +309,10 @@ int scsi_add_host_with_dma(struct Scsi_H
  out_del_gendev:
 	device_del(&shost->shost_gendev);
  out_destroy_freelist:
+	device_disable_async_suspend(&shost->shost_gendev);
+	pm_runtime_disable(&shost->shost_gendev);
+	pm_runtime_set_suspended(&shost->shost_gendev);
+	pm_runtime_put_noidle(&shost->shost_gendev);
 	scsi_destroy_command_freelist(shost);
  out_destroy_tags:
 	if (shost_use_blk_mq(shost))
diff -druNp --no-dereference linux-libre-4.8.2-gnu/fs/xfs/xfs_xattr.c linux-libre-4.8.3-gnu/fs/xfs/xfs_xattr.c
--- linux-libre-4.8.2-gnu/fs/xfs/xfs_xattr.c	2016-10-16 12:03:56.000000000 -0400
+++ linux-libre-4.8.3-gnu/fs/xfs/xfs_xattr.c	2016-10-20 04:03:41.000000000 -0400
@@ -147,6 +147,7 @@ __xfs_xattr_put_listent(
 	arraytop = context->count + prefix_len + namelen + 1;
 	if (arraytop > context->firstu) {
 		context->count = -1;	/* insufficient space */
+		context->seen_enough = 1;
 		return 0;
 	}
 	offset = (char *)context->alist + context->count;
diff -druNp --no-dereference linux-libre-4.8.2-gnu/include/linux/mm.h linux-libre-4.8.3-gnu/include/linux/mm.h
--- linux-libre-4.8.2-gnu/include/linux/mm.h	2016-10-16 12:03:56.000000000 -0400
+++ linux-libre-4.8.3-gnu/include/linux/mm.h	2016-10-20 04:03:41.000000000 -0400
@@ -2234,6 +2234,7 @@ static inline struct page *follow_page(s
 #define FOLL_TRIED	0x800	/* a retry, previous pass started an IO */
 #define FOLL_MLOCK	0x1000	/* lock present pages */
 #define FOLL_REMOTE	0x2000	/* we are working on non-current tsk/mm */
+#define FOLL_COW	0x4000	/* internal GUP flag */
 
 typedef int (*pte_fn_t)(pte_t *pte, pgtable_t token, unsigned long addr,
 			void *data);
diff -druNp --no-dereference linux-libre-4.8.2-gnu/include/media/rcar-fcp.h linux-libre-4.8.3-gnu/include/media/rcar-fcp.h
--- linux-libre-4.8.2-gnu/include/media/rcar-fcp.h	2016-10-16 12:03:56.000000000 -0400
+++ linux-libre-4.8.3-gnu/include/media/rcar-fcp.h	2016-10-20 04:03:41.000000000 -0400
@@ -29,7 +29,7 @@ static inline struct rcar_fcp_device *rc
 static inline void rcar_fcp_put(struct rcar_fcp_device *fcp) { }
 static inline int rcar_fcp_enable(struct rcar_fcp_device *fcp)
 {
-	return -ENOSYS;
+	return 0;
 }
 static inline void rcar_fcp_disable(struct rcar_fcp_device *fcp) { }
 #endif
diff -druNp --no-dereference linux-libre-4.8.2-gnu/Makefile linux-libre-4.8.3-gnu/Makefile
--- linux-libre-4.8.2-gnu/Makefile	2016-10-16 13:47:25.000000000 -0400
+++ linux-libre-4.8.3-gnu/Makefile	2016-10-20 05:22:47.000000000 -0400
@@ -1,6 +1,6 @@
 VERSION = 4
 PATCHLEVEL = 8
-SUBLEVEL = 2
+SUBLEVEL = 3
 EXTRAVERSION = -gnu
 NAME = Psychotic Stoned Sheep
 
diff -druNp --no-dereference linux-libre-4.8.2-gnu/mm/gup.c linux-libre-4.8.3-gnu/mm/gup.c
--- linux-libre-4.8.2-gnu/mm/gup.c	2016-10-16 12:03:56.000000000 -0400
+++ linux-libre-4.8.3-gnu/mm/gup.c	2016-10-20 04:03:41.000000000 -0400
@@ -60,6 +60,16 @@ static int follow_pfn_pte(struct vm_area
 	return -EEXIST;
 }
 
+/*
+ * FOLL_FORCE can write to even unwritable pte's, but only
+ * after we've gone through a COW cycle and they are dirty.
+ */
+static inline bool can_follow_write_pte(pte_t pte, unsigned int flags)
+{
+	return pte_write(pte) ||
+		((flags & FOLL_FORCE) && (flags & FOLL_COW) && pte_dirty(pte));
+}
+
 static struct page *follow_page_pte(struct vm_area_struct *vma,
 		unsigned long address, pmd_t *pmd, unsigned int flags)
 {
@@ -95,7 +105,7 @@ retry:
 	}
 	if ((flags & FOLL_NUMA) && pte_protnone(pte))
 		goto no_page;
-	if ((flags & FOLL_WRITE) && !pte_write(pte)) {
+	if ((flags & FOLL_WRITE) && !can_follow_write_pte(pte, flags)) {
 		pte_unmap_unlock(ptep, ptl);
 		return NULL;
 	}
@@ -412,7 +422,7 @@ static int faultin_page(struct task_stru
 	 * reCOWed by userspace write).
 	 */
 	if ((ret & VM_FAULT_WRITE) && !(vma->vm_flags & VM_WRITE))
-		*flags &= ~FOLL_WRITE;
+	        *flags |= FOLL_COW;
 	return 0;
 }
 
