From b6536195591c0b8c2f06ade97043db9aaa451561 Mon Sep 17 00:00:00 2001 From: Mark Fasheh Date: Thu, 1 Nov 2007 11:37:48 -0700 Subject: [PATCH] --- yaml --- r: 73299 b: refs/heads/master c: 4e9563fd55ff4479f2b118d0757d121dd0cfc39c h: refs/heads/master i: 73297: e00bae721fda819314fccf722a4d518bd889b1eb 73295: ec2a50425beaf994938609c893896fc5e2fe03e0 v: v3 --- [refs] | 2 +- trunk/fs/ocfs2/aops.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 0a16525fa711..bc82e44237d3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9ea2d32f40434589ea0e136373f7d1545afb411f +refs/heads/master: 4e9563fd55ff4479f2b118d0757d121dd0cfc39c diff --git a/trunk/fs/ocfs2/aops.c b/trunk/fs/ocfs2/aops.c index c69c1b300155..556e34ccb005 100644 --- a/trunk/fs/ocfs2/aops.c +++ b/trunk/fs/ocfs2/aops.c @@ -728,6 +728,27 @@ static void ocfs2_clear_page_regions(struct page *page, kunmap_atomic(kaddr, KM_USER0); } +/* + * Nonsparse file systems fully allocate before we get to the write + * code. This prevents ocfs2_write() from tagging the write as an + * allocating one, which means ocfs2_map_page_blocks() might try to + * read-in the blocks at the tail of our file. Avoid reading them by + * testing i_size against each block offset. + */ +static int ocfs2_should_read_blk(struct inode *inode, struct page *page, + unsigned int block_start) +{ + u64 offset = page_offset(page) + block_start; + + if (ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))) + return 1; + + if (i_size_read(inode) > offset) + return 1; + + return 0; +} + /* * Some of this taken from block_prepare_write(). We already have our * mapping by now though, and the entire write will be allocating or @@ -781,6 +802,7 @@ int ocfs2_map_page_blocks(struct page *page, u64 *p_blkno, set_buffer_uptodate(bh); } else if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_new(bh) && + ocfs2_should_read_blk(inode, page, block_start) && (block_start < from || block_end > to)) { ll_rw_block(READ, 1, &bh); *wait_bh++=bh;