Teach do_mpage_readpage() about unwritten buffers
Subsystems (2)
PATCH RESEND 1/1 Teach do_mpage_readpage() about unwritten buffers
Teach do_mpage_readpage() about unwritten extents so we can always map them in get_blocks rather than they are are holes on read. Allows setup_swap_extents() to use preallocated files on XFS filesystems for swap files without ever needing to convert them.
Signed-off-by Dave Chinner <[email protected]>
--- fs/mpage.c | 5 +++-- fs/xfs/linux-2.6/xfs_aops.c | 13 +++---------- 2 files changed, 6 insertions(+), 12 deletions(-)
fs/mpage.c +3 -2
@@ -207,7 +207,8 @@ do_mpage_readpage(struct bio *bio, struc* Map blocks using the result from the previous get_blocks call first. */ nblocks = map_bh->b_size >> blkbits; -if (buffer_mapped (map_bh) && block_in_file > *first_logical_block && +if (buffer_mapped (map_bh) && !buffer_unwritten (map_bh) && + block_in_file > *first_logical_block && block_in_file < (*first_logical_block + nblocks)) {unsigned map_offset = block_in_file - *first_logical_block;unsigned last = nblocks - map_offset;
@@ -242,7 +243,7 @@ do_mpage_readpage(struct bio *bio, struc *first_logical_block = block_in_file; } -if (!buffer_mapped (map_bh)) { +if (!buffer_mapped (map_bh) ||buffer_unwritten (map_bh)) { fully_mapped =0 ;if (first_hole == blocks_per_page) first_hole = page_block;
fs/xfs/linux-2.6/xfs_aops.c +3 -10
@@ -1340,16 +1340,9 @@ __xfs_get_blocks(return 0 ;if (iomap.iomap_bn !=IOMAP_DADDR_NULL ) { -/* -* For unwritten extents do not report a disk address on -* the read case (treat as if we're reading into a hole). -*/ -if (create || !(iomap.iomap_flags &IOMAP_UNWRITTEN )) { -xfs_map_buffer (bh_result, &iomap, offset, - inode->i_blkbits); - } -if (create && (iomap.iomap_flags &IOMAP_UNWRITTEN )) { -if (direct) +xfs_map_buffer (bh_result, &iomap, offset, inode->i_blkbits); +if (iomap.iomap_flags &IOMAP_UNWRITTEN ) { +if (create && direct) bh_result->b_private = inode;set_buffer_unwritten (bh_result); }