@@ -3189,22 +3189,22 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
struct inode *inode = page->mapping->host;
struct extent_page_data *epd = data;
struct extent_io_tree *tree = epd->tree;
+ struct btrfs_ordered_extent *ordered;
u64 start = page_offset(page);
u64 delalloc_start;
u64 page_end = start + PAGE_CACHE_SIZE - 1;
u64 end;
u64 cur = start;
u64 extent_offset;
+ u64 extent_end;
u64 last_byte = i_size_read(inode);
- u64 block_start;
u64 iosize;
sector_t sector;
struct extent_state *cached_state = NULL;
- struct extent_map *em;
struct block_device *bdev;
int ret;
int nr = 0;
- size_t pg_offset = 0;
+ size_t pg_offset;
size_t blocksize;
loff_t i_size = i_size_read(inode);
unsigned long end_index = i_size >> PAGE_CACHE_SHIFT;
@@ -3244,7 +3244,6 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
kunmap_atomic(userpage);
flush_dcache_page(page);
}
- pg_offset = 0;
set_page_extent_mapped(page);
@@ -3355,57 +3354,45 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
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);
- break;
+
+ ordered = btrfs_lookup_ordered_extent(inode, cur);
+ if (!ordered) {
+ cur += blocksize;
+ continue;
}
- extent_offset = cur - em->start;
- BUG_ON(extent_map_end(em) <= cur);
+ 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(extent_map_end(em) - 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;
}
+
/* leave this out until we have a page_mkwrite call */
if (0 && !test_range_bit(tree, cur, cur + iosize - 1,
EXTENT_DIRTY, 0, NULL)) {
cur = cur + iosize;
- pg_offset += iosize;
continue;
}
@@ -3436,7 +3423,6 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc,
SetPageError(page);
}
cur = cur + iosize;
- pg_offset += iosize;
nr++;
}
done:
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 <chandan@linux.vnet.ibm.com> --- fs/btrfs/extent_io.c | 68 +++++++++++++++++++++------------------------------- 1 file changed, 27 insertions(+), 41 deletions(-)