Btrfs: use larger nr_to_write for larger extents
authorChris Mason <chris.mason@oracle.com>
Fri, 7 Aug 2009 13:28:20 +0000 (09:28 -0400)
committerChris Mason <chris.mason@oracle.com>
Fri, 11 Sep 2009 17:31:04 +0000 (13:31 -0400)
When btrfs fills a large delayed allocation extent, it is a good idea
to try and convince the write_cache_pages caller to go ahead and
write a good chunk of that extent.  The extra IO is basically free
because we know it is contiguous.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent_io.c

index 7e5c5a0749e23b5d3231bfc8714cff1c7b41c34b..8d7a152a90c666277ef3e2b480466b0f8bf4d126 100644 (file)
@@ -2135,6 +2135,7 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
        delalloc_end = 0;
        page_started = 0;
        if (!epd->extent_locked) {
+               u64 delalloc_to_write;
                /*
                 * make sure the wbc mapping index is at least updated
                 * to this page.
@@ -2154,6 +2155,14 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
                        tree->ops->fill_delalloc(inode, page, delalloc_start,
                                                 delalloc_end, &page_started,
                                                 &nr_written);
+                       delalloc_to_write = (delalloc_end -
+                                       max_t(u64, page_offset(page),
+                                             delalloc_start) + 1) >>
+                                       PAGE_CACHE_SHIFT;
+                       if (wbc->nr_to_write < delalloc_to_write) {
+                               wbc->nr_to_write = min_t(long, 8192,
+                                                delalloc_to_write);
+                       }
                        delalloc_start = delalloc_end + 1;
                }
 
@@ -2350,7 +2359,6 @@ static int extent_write_cache_pages(struct extent_io_tree *tree,
                             writepage_t writepage, void *data,
                             void (*flush_fn)(void *))
 {
-       struct backing_dev_info *bdi = mapping->backing_dev_info;
        int ret = 0;
        int done = 0;
        struct pagevec pvec;
@@ -2425,10 +2433,6 @@ retry:
                        }
                        if (ret || wbc->nr_to_write <= 0)
                                done = 1;
-                       if (wbc->nonblocking && bdi_write_congested(bdi)) {
-                               wbc->encountered_congestion = 1;
-                               done = 1;
-                       }
                }
                pagevec_release(&pvec);
                cond_resched();