return ret;
 }
 
-int extent_write_locked_range(struct inode *inode, u64 start, u64 end,
-                             int mode)
+/*
+ * Submit the pages in the range to bio for call sites which delalloc range has
+ * already been ran (aka, ordered extent inserted) and all pages are still
+ * locked.
+ */
+int extent_write_locked_range(struct inode *inode, u64 start, u64 end)
 {
+       bool found_error = false;
+       int first_error = 0;
        int ret = 0;
        struct address_space *mapping = inode->i_mapping;
        struct page *page;
+       u64 cur = start;
        unsigned long nr_pages = (end - start + PAGE_SIZE) >>
                PAGE_SHIFT;
-
        struct extent_page_data epd = {
                .bio_ctrl = { 0 },
                .extent_locked = 1,
-               .sync_io = mode == WB_SYNC_ALL,
+               .sync_io = 1,
        };
        struct writeback_control wbc_writepages = {
-               .sync_mode      = mode,
                .nr_to_write    = nr_pages * 2,
+               .sync_mode      = WB_SYNC_ALL,
                .range_start    = start,
                .range_end      = end + 1,
                /* We're called from an async helper function */
        };
 
        wbc_attach_fdatawrite_inode(&wbc_writepages, inode);
-       while (start <= end) {
-               page = find_get_page(mapping, start >> PAGE_SHIFT);
-               if (clear_page_dirty_for_io(page))
-                       ret = __extent_writepage(page, &wbc_writepages, &epd);
-               else {
-                       btrfs_writepage_endio_finish_ordered(BTRFS_I(inode),
-                                       page, start, start + PAGE_SIZE - 1, true);
-                       unlock_page(page);
+       while (cur <= end) {
+               page = find_get_page(mapping, cur >> PAGE_SHIFT);
+               /*
+                * All pages in the range are locked since
+                * btrfs_run_delalloc_range(), thus there is no way to clear
+                * the page dirty flag.
+                */
+               ASSERT(PageDirty(page));
+               clear_page_dirty_for_io(page);
+               ret = __extent_writepage(page, &wbc_writepages, &epd);
+               ASSERT(ret <= 0);
+               if (ret < 0) {
+                       found_error = true;
+                       first_error = ret;
                }
                put_page(page);
-               start += PAGE_SIZE;
+               cur += PAGE_SIZE;
        }
 
-       ASSERT(ret <= 0);
-       if (ret == 0)
+       if (!found_error)
                ret = flush_write_bio(&epd);
        else
                end_write_bio(&epd, ret);
 
        wbc_detach_inode(&wbc_writepages);
+       if (found_error)
+               return first_error;
        return ret;
 }
 
 
                      struct btrfs_bio_ctrl *bio_ctrl,
                      unsigned int read_flags, u64 *prev_em_start);
 int extent_write_full_page(struct page *page, struct writeback_control *wbc);
-int extent_write_locked_range(struct inode *inode, u64 start, u64 end,
-                             int mode);
+int extent_write_locked_range(struct inode *inode, u64 start, u64 end);
 int extent_writepages(struct address_space *mapping,
                      struct writeback_control *wbc);
 int btree_write_cache_pages(struct address_space *mapping,
 
                 * drive.
                 */
                if (!page_started && !ret)
-                       extent_write_locked_range(&inode->vfs_inode, start,
-                                                 end, WB_SYNC_ALL);
+                       extent_write_locked_range(&inode->vfs_inode, start, end);
                else if (ret && async_chunk->locked_page)
                        unlock_page(async_chunk->locked_page);
                kfree(async_extent);
 
        __set_page_dirty_nobuffers(locked_page);
        account_page_redirty(locked_page);
-       extent_write_locked_range(&inode->vfs_inode, start, end, WB_SYNC_ALL);
+       extent_write_locked_range(&inode->vfs_inode, start, end);
        *page_started = 1;
 
        return 0;