[Ocfs2-devel] [PATCH 1/3] ocfs2: When zero extending, do it by page.

Tao Ma tao.ma at oracle.com
Wed Jul 7 08:19:27 PDT 2010


Hi Joel,
Joel Becker wrote:
> ocfs2_zero_extend() does its zeroing block by block, but it calls a
> function named ocfs2_write_zero_page().  Let's have
> ocfs2_write_zero_page() handle the page level.  From
> ocfs2_zero_extend()'s perspective, it is now page-at-a-time.
>
> Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
>  fs/ocfs2/aops.c |   30 --------------
>  fs/ocfs2/file.c |  119 +++++++++++++++++++++++++++++++++++++++----------------
>  2 files changed, 85 insertions(+), 64 deletions(-)
>
> diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
> index 3623ca2..9a5c931 100644
> --- a/fs/ocfs2/aops.c
> +++ b/fs/ocfs2/aops.c
> @@ -459,36 +459,6 @@ int walk_page_buffers(	handle_t *handle,
>  	return ret;
>  }
>  
> -handle_t *ocfs2_start_walk_page_trans(struct inode *inode,
> -							 struct page *page,
> -							 unsigned from,
> -							 unsigned to)
> -{
> -	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> -	handle_t *handle;
> -	int ret = 0;
> -
> -	handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
> -	if (IS_ERR(handle)) {
> -		ret = -ENOMEM;
> -		mlog_errno(ret);
> -		goto out;
> -	}
> -
> -	if (ocfs2_should_order_data(inode)) {
> -		ret = ocfs2_jbd2_file_inode(handle, inode);
> -		if (ret < 0)
> -			mlog_errno(ret);
> -	}
> -out:
> -	if (ret) {
> -		if (!IS_ERR(handle))
> -			ocfs2_commit_trans(osb, handle);
> -		handle = ERR_PTR(ret);
> -	}
> -	return handle;
> -}
> -
>  static sector_t ocfs2_bmap(struct address_space *mapping, sector_t block)
>  {
>  	sector_t status;
> diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
> index 6a13ea6..a6e0eb6 100644
> --- a/fs/ocfs2/file.c
> +++ b/fs/ocfs2/file.c
> @@ -724,28 +724,55 @@ leave:
>  	return status;
>  }
>  
> +/*
> + * While a write will already be ordering the data, a truncate will not.
> + * Thus, we need to explicitly order the zeroed pages.
> + */
> +static handle_t *ocfs2_zero_start_ordered_transaction(struct inode *inode)
> +{
> +	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> +	handle_t *handle = NULL;
> +	int ret = 0;
> +
> +	if (ocfs2_should_order_data(inode))
>   
This should be if (!ocfs2_should_order_data(inode)) I guess? ;)
> +		goto out;
> +
> +	handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
> +	if (IS_ERR(handle)) {
> +		ret = -ENOMEM;
> +		mlog_errno(ret);
> +		goto out;
> +	}
> +
>   
Regards,
Tao



More information about the Ocfs2-devel mailing list