[Ocfs2-devel] [PATCH] ocfs2: Don't duplicate page passes i_size during CoW.

Joel Becker Joel.Becker at oracle.com
Mon Jul 12 02:14:13 PDT 2010


On Mon, Jul 12, 2010 at 03:19:48PM +0800, Tao Ma wrote:
> During CoW, actually all the pages after i_size contains
> garbage data, so don't read and duplicate them.
> 
> Signed-off-by: Tao Ma <tao.ma at oracle.com>
> ---
>  fs/ocfs2/refcounttree.c |   10 +++++++++-
>  1 files changed, 9 insertions(+), 1 deletions(-)
> 
> diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c
> index 1cf9cda..e082623 100644
> --- a/fs/ocfs2/refcounttree.c
> +++ b/fs/ocfs2/refcounttree.c
> @@ -2921,7 +2921,7 @@ static int ocfs2_duplicate_clusters_by_page(handle_t *handle,
>  	struct super_block *sb = ocfs2_metadata_cache_get_super(ci);
>  	u64 new_block = ocfs2_clusters_to_blocks(sb, new_cluster);
>  	struct page *page;
> -	pgoff_t page_index;
> +	pgoff_t page_index, last_page;
>  	unsigned int from, to;
>  	loff_t offset, end, map_end;
>  	struct address_space *mapping = context->inode->i_mapping;
> @@ -2932,12 +2932,20 @@ static int ocfs2_duplicate_clusters_by_page(handle_t *handle,
>  	offset = ((loff_t)cpos) << OCFS2_SB(sb)->s_clustersize_bits;
>  	end = offset + (new_len << OCFS2_SB(sb)->s_clustersize_bits);
>  
> +	last_page = i_size_read(context->inode) >> PAGE_CACHE_SHIFT;
>  	while (offset < end) {

	Why trigger on both index and byte offset?  Why not just adjust
end?

	if (end < i_size_read(context->inode))
		end = i_size_read(inode);
	
	Then you don't need the last_page variable at all, because
you're guaranteed never to go past i_size.

Joel

-- 

"Three o'clock is always too late or too early for anything you
 want to do."
        - Jean-Paul Sartre

Joel Becker
Consulting Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127



More information about the Ocfs2-devel mailing list