btrfs: cleanup for extent_write_locked_range()
[sfrench/cifs-2.6.git] / fs / btrfs / extent_io.c
index e9d68b8ee9e6b627e4fdfd4bdfcd7959d3d83fcc..a010a405820775015e504910b166710772a9f45e 100644 (file)
@@ -5073,23 +5073,29 @@ int extent_write_full_page(struct page *page, struct writeback_control *wbc)
        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 */
@@ -5098,26 +5104,33 @@ int extent_write_locked_range(struct inode *inode, u64 start, u64 end,
        };
 
        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;
 }