The code now loops across 'ordered extents' instead of 'extent maps' to figure
out the dirty blocks of the page to be submitted for a write operation.

Signed-off-by: Chandan Rajendra <chan...@linux.vnet.ibm.com>
---
 fs/btrfs/extent_io.c | 74 ++++++++++++++++++++--------------------------------
 1 file changed, 29 insertions(+), 45 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index f9db1be..3c33944 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -3186,18 +3186,18 @@ static noinline_for_stack int 
__extent_writepage_io(struct inode *inode,
                                 int write_flags, int *nr_ret)
 {
        struct extent_io_tree *tree = epd->tree;
+       struct btrfs_ordered_extent *ordered;
        u64 start = page_offset(page);
        u64 page_end = start + PAGE_CACHE_SIZE - 1;
        u64 end;
        u64 cur = start;
        u64 extent_offset;
-       u64 block_start;
+       u64 extent_end;
        u64 iosize;
        sector_t sector;
        struct extent_state *cached_state = NULL;
-       struct extent_map *em;
        struct block_device *bdev;
-       size_t pg_offset = 0;
+       size_t pg_offset;
        size_t blocksize;
        int ret = 0;
        int nr = 0;
@@ -3237,59 +3237,46 @@ static noinline_for_stack int 
__extent_writepage_io(struct inode *inode,
        blocksize = inode->i_sb->s_blocksize;
 
        while (cur <= end) {
-               u64 em_end;
                if (cur >= i_size) {
                        if (tree->ops && tree->ops->writepage_end_io_hook)
                                tree->ops->writepage_end_io_hook(page, cur,
                                                         page_end, NULL, 1);
                        break;
                }
-               em = epd->get_extent(inode, page, pg_offset, cur,
-                                    end - cur + 1, 1);
-               if (IS_ERR_OR_NULL(em)) {
-                       SetPageError(page);
-                       ret = PTR_ERR_OR_ZERO(em);
-                       break;
-               }
 
-               extent_offset = cur - em->start;
-               em_end = extent_map_end(em);
-               BUG_ON(em_end <= cur);
+               ordered = btrfs_lookup_ordered_extent(inode, cur);
+               if (!ordered) {
+                       cur += blocksize;
+                       continue;
+               }
+
+               pg_offset = cur & (PAGE_CACHE_SIZE - 1);
+
+               extent_offset = cur - ordered->file_offset;
+               extent_end = ordered->file_offset + ordered->len;
+               extent_end = (extent_end < ordered->file_offset) ? -1 : 
extent_end;
+               BUG_ON(extent_end <= cur);
                BUG_ON(end < cur);
-               iosize = min(em_end - cur, end - cur + 1);
+               iosize = min(extent_end - cur, end - cur + 1);
                iosize = ALIGN(iosize, blocksize);
-               sector = (em->block_start + extent_offset) >> 9;
-               bdev = em->bdev;
-               block_start = em->block_start;
-               compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags);
-               free_extent_map(em);
-               em = NULL;
+
+               sector = (ordered->start + extent_offset) >> 9;
+               bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev;
+               compressed = test_bit(BTRFS_ORDERED_COMPRESSED, 
&ordered->flags);
+               btrfs_put_ordered_extent(ordered);
+               ordered = NULL;
 
                /*
                 * compressed and inline extents are written through other
                 * paths in the FS
                 */
-               if (compressed || block_start == EXTENT_MAP_HOLE ||
-                   block_start == EXTENT_MAP_INLINE) {
-                       /*
-                        * end_io notification does not happen here for
-                        * compressed extents
-                        */
-                       if (!compressed && tree->ops &&
-                           tree->ops->writepage_end_io_hook)
-                               tree->ops->writepage_end_io_hook(page, cur,
-                                                        cur + iosize - 1,
-                                                        NULL, 1);
-                       else if (compressed) {
-                               /* we don't want to end_page_writeback on
-                                * a compressed extent.  this happens
-                                * elsewhere
-                                */
-                               nr++;
-                       }
-
+               if (compressed) {
+                       /* we don't want to end_page_writeback on
+                        * a compressed extent.  this happens
+                        * elsewhere
+                        */
+                       nr++;
                        cur += iosize;
-                       pg_offset += iosize;
                        continue;
                }
 
@@ -3320,7 +3307,6 @@ static noinline_for_stack int 
__extent_writepage_io(struct inode *inode,
                                SetPageError(page);
                }
                cur = cur + iosize;
-               pg_offset += iosize;
                nr++;
        }
 done:
@@ -3348,7 +3334,7 @@ static int __extent_writepage(struct page *page, struct 
writeback_control *wbc,
        u64 page_end = start + PAGE_CACHE_SIZE - 1;
        int ret;
        int nr = 0;
-       size_t pg_offset = 0;
+       size_t pg_offset;
        loff_t i_size = i_size_read(inode);
        unsigned long end_index = i_size >> PAGE_CACHE_SHIFT;
        int write_flags;
@@ -3383,8 +3369,6 @@ static int __extent_writepage(struct page *page, struct 
writeback_control *wbc,
                flush_dcache_page(page);
        }
 
-       pg_offset = 0;
-
        set_page_extent_mapped(page);
 
        ret = writepage_delalloc(inode, page, wbc, epd, start, &nr_written);
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to