--- /dev/null
+From f3038ee3a3f1017a1cbe9907e31fa12d366c5dcb Mon Sep 17 00:00:00 2001
+From: Nikolay Borisov <nborisov@suse.com>
+Date: Tue, 5 Dec 2017 09:29:19 +0200
+Subject: btrfs: Handle btrfs_set_extent_delalloc failure in fixup worker
+
+From: Nikolay Borisov <nborisov@suse.com>
+
+commit f3038ee3a3f1017a1cbe9907e31fa12d366c5dcb upstream.
+
+This function was introduced by 247e743cbe6e ("Btrfs: Use async helpers
+to deal with pages that have been improperly dirtied") and it didn't do
+any error handling then. This function might very well fail in ENOMEM
+situation, yet it's not handled, this could lead to inconsistent state.
+So let's handle the failure by setting the mapping error bit.
+
+Signed-off-by: Nikolay Borisov <nborisov@suse.com>
+Reviewed-by: Qu Wenruo <wqu@suse.com>
+Reviewed-by: David Sterba <dsterba@suse.com>
+Signed-off-by: David Sterba <dsterba@suse.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+
+---
+ fs/btrfs/inode.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+--- a/fs/btrfs/inode.c
++++ b/fs/btrfs/inode.c
+@@ -2101,8 +2101,15 @@ again:
+ goto out;
+ }
+
+- btrfs_set_extent_delalloc(inode, page_start, page_end, &cached_state,
+- 0);
++ ret = btrfs_set_extent_delalloc(inode, page_start, page_end,
++ &cached_state, 0);
++ if (ret) {
++ mapping_set_error(page->mapping, ret);
++ end_extent_writepage(page, ret, page_start, page_end);
++ ClearPageChecked(page);
++ goto out;
++ }
++
+ ClearPageChecked(page);
+ set_page_dirty(page);
+ out: