All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tao Ma <tao.ma@oracle.com>
To: Joel Becker <joel.becker@oracle.com>
Cc: Dave Chinner <david@fromorbit.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Linux Kernel <linux-kernel@vger.kernel.org>,
	ocfs2-devel@oss.oracle.com, Dave Chinner <dchinner@redhat.com>,
	Christoph Hellwig <hch@lst.de>, Mark Fasheh <mfasheh@suse.com>
Subject: [Ocfs2-devel] [PATCH 1/3] ocfs2: When zero extending, do it by page.
Date: Thu, 08 Jul 2010 11:44:59 +0800	[thread overview]
Message-ID: <4C3549BB.2000906@oracle.com> (raw)
In-Reply-To: <1278501367-7710-2-git-send-email-joel.becker@oracle.com>

Hi Joel,

On 07/07/2010 07:16 PM, 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@oracle.com>
> ---
>   fs/ocfs2/aops.c |   30 --------------
>   fs/ocfs2/file.c |  119 +++++++++++++++++++++++++++++++++++++++----------------
>   2 files changed, 85 insertions(+), 64 deletions(-)
>
<snip>
> -static int ocfs2_write_zero_page(struct inode *inode,
> -				 u64 size)
> +static int ocfs2_write_zero_page(struct inode *inode, u64 abs_from,
> +				 u64 abs_to)
>   {
>   	struct address_space *mapping = inode->i_mapping;
>   	struct page *page;
> -	unsigned long index;
> -	unsigned int offset;
> +	unsigned long index = abs_from>>  PAGE_CACHE_SHIFT;
>   	handle_t *handle = NULL;
>   	int ret;
> +	unsigned zero_from, zero_to, block_start, block_end;
>
> -	offset = (size&  (PAGE_CACHE_SIZE-1)); /* Within page */
> -	/* ugh.  in prepare/commit_write, if from==to==start of block, we
> -	** skip the prepare.  make sure we never send an offset for the start
> -	** of a block
> -	*/
> -	if ((offset&  (inode->i_sb->s_blocksize - 1)) == 0) {
> -		offset++;
> -	}
> -	index = size>>  PAGE_CACHE_SHIFT;
> +	BUG_ON(abs_from>= abs_to);
> +	BUG_ON(abs_to>  ((index + 1)<<  PAGE_CACHE_SHIFT));
Sorry for not noticing this yesterday night. This can't work and will 
overflow and bug out. I met with a similar bug in reflink test. See 
commit d622b89.
> +	BUG_ON(abs_from&  (inode->i_blkbits - 1));
>
>   	page = grab_cache_page(mapping, index);
>   	if (!page) {
> @@ -754,31 +781,52 @@ static int ocfs2_write_zero_page(struct inode *inode,
>   		goto out;
>   	}
>
> -	ret = ocfs2_prepare_write_nolock(inode, page, offset, offset);
> -	if (ret<  0) {
> -		mlog_errno(ret);
> -		goto out_unlock;
> -	}
> +	/* Get the offsets within the page that we want to zero */
> +	zero_from = abs_from&  (PAGE_CACHE_SIZE - 1);
> +	zero_to = abs_to&  (PAGE_CACHE_SIZE - 1);
> +	if (!zero_to)
> +		zero_to = PAGE_CACHE_SIZE;
>
> -	if (ocfs2_should_order_data(inode)) {
> -		handle = ocfs2_start_walk_page_trans(inode, page, offset,
> -						     offset);
> -		if (IS_ERR(handle)) {
> -			ret = PTR_ERR(handle);
> -			handle = NULL;
> +	/* We know that zero_from is block aligned */
> +	for (block_start = zero_from;
> +	     (block_start<  PAGE_CACHE_SIZE)&&  (block_start<  zero_to);
> +	     block_start = block_end) {
Do we really need to check block_start < PAGE_CACHE_SIZE? I think just 
check block_start < zero_to is enough since you have limit zero_to with 
PAGE_CACHE_SIZE. What's more, it looks more natural(see below), does it?

	for (block_start = zero_form; block_start < zero_to; block_start = 
block_end) {

Regards,
Tao

WARNING: multiple messages have this Message-ID (diff)
From: Tao Ma <tao.ma@oracle.com>
To: Joel Becker <joel.becker@oracle.com>
Cc: Dave Chinner <david@fromorbit.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Linux Kernel <linux-kernel@vger.kernel.org>,
	ocfs2-devel@oss.oracle.com, Dave Chinner <dchinner@redhat.com>,
	Christoph Hellwig <hch@lst.de>, Mark Fasheh <mfasheh@suse.com>
Subject: Re: [PATCH 1/3] ocfs2: When zero extending, do it by page.
Date: Thu, 08 Jul 2010 11:44:59 +0800	[thread overview]
Message-ID: <4C3549BB.2000906@oracle.com> (raw)
In-Reply-To: <1278501367-7710-2-git-send-email-joel.becker@oracle.com>

Hi Joel,

On 07/07/2010 07:16 PM, 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@oracle.com>
> ---
>   fs/ocfs2/aops.c |   30 --------------
>   fs/ocfs2/file.c |  119 +++++++++++++++++++++++++++++++++++++++----------------
>   2 files changed, 85 insertions(+), 64 deletions(-)
>
<snip>
> -static int ocfs2_write_zero_page(struct inode *inode,
> -				 u64 size)
> +static int ocfs2_write_zero_page(struct inode *inode, u64 abs_from,
> +				 u64 abs_to)
>   {
>   	struct address_space *mapping = inode->i_mapping;
>   	struct page *page;
> -	unsigned long index;
> -	unsigned int offset;
> +	unsigned long index = abs_from>>  PAGE_CACHE_SHIFT;
>   	handle_t *handle = NULL;
>   	int ret;
> +	unsigned zero_from, zero_to, block_start, block_end;
>
> -	offset = (size&  (PAGE_CACHE_SIZE-1)); /* Within page */
> -	/* ugh.  in prepare/commit_write, if from==to==start of block, we
> -	** skip the prepare.  make sure we never send an offset for the start
> -	** of a block
> -	*/
> -	if ((offset&  (inode->i_sb->s_blocksize - 1)) == 0) {
> -		offset++;
> -	}
> -	index = size>>  PAGE_CACHE_SHIFT;
> +	BUG_ON(abs_from>= abs_to);
> +	BUG_ON(abs_to>  ((index + 1)<<  PAGE_CACHE_SHIFT));
Sorry for not noticing this yesterday night. This can't work and will 
overflow and bug out. I met with a similar bug in reflink test. See 
commit d622b89.
> +	BUG_ON(abs_from&  (inode->i_blkbits - 1));
>
>   	page = grab_cache_page(mapping, index);
>   	if (!page) {
> @@ -754,31 +781,52 @@ static int ocfs2_write_zero_page(struct inode *inode,
>   		goto out;
>   	}
>
> -	ret = ocfs2_prepare_write_nolock(inode, page, offset, offset);
> -	if (ret<  0) {
> -		mlog_errno(ret);
> -		goto out_unlock;
> -	}
> +	/* Get the offsets within the page that we want to zero */
> +	zero_from = abs_from&  (PAGE_CACHE_SIZE - 1);
> +	zero_to = abs_to&  (PAGE_CACHE_SIZE - 1);
> +	if (!zero_to)
> +		zero_to = PAGE_CACHE_SIZE;
>
> -	if (ocfs2_should_order_data(inode)) {
> -		handle = ocfs2_start_walk_page_trans(inode, page, offset,
> -						     offset);
> -		if (IS_ERR(handle)) {
> -			ret = PTR_ERR(handle);
> -			handle = NULL;
> +	/* We know that zero_from is block aligned */
> +	for (block_start = zero_from;
> +	     (block_start<  PAGE_CACHE_SIZE)&&  (block_start<  zero_to);
> +	     block_start = block_end) {
Do we really need to check block_start < PAGE_CACHE_SIZE? I think just 
check block_start < zero_to is enough since you have limit zero_to with 
PAGE_CACHE_SIZE. What's more, it looks more natural(see below), does it?

	for (block_start = zero_form; block_start < zero_to; block_start = 
block_end) {

Regards,
Tao

  parent reply	other threads:[~2010-07-08  3:44 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-28 17:35 [Ocfs2-devel] [PATCH] Revert "writeback: limit write_cache_pages integrity scanning to current EOF" Joel Becker
2010-06-28 17:35 ` Joel Becker
2010-06-29  0:24 ` [Ocfs2-devel] " Dave Chinner
2010-06-29  0:24   ` Dave Chinner
2010-06-29  0:54   ` [Ocfs2-devel] " Joel Becker
2010-06-29  0:54     ` Joel Becker
2010-06-29  1:12     ` [Ocfs2-devel] " Linus Torvalds
2010-06-29  1:12       ` Linus Torvalds
2010-06-29  1:58       ` [Ocfs2-devel] " Joel Becker
2010-06-29  1:58         ` Joel Becker
2010-06-29  2:20         ` Linus Torvalds
2010-06-29  2:20           ` Linus Torvalds
2010-06-29  2:44           ` Dave Chinner
2010-06-29  2:44             ` Dave Chinner
2010-06-29  8:16           ` Joel Becker
2010-06-29  8:16             ` Joel Becker
2010-06-30  1:30             ` Joel Becker
2010-06-30  1:30               ` Joel Becker
2010-07-06 19:06         ` Joel Becker
2010-07-06 19:06           ` Joel Becker
2010-06-29  1:56     ` Dave Chinner
2010-06-29  1:56       ` Dave Chinner
2010-06-29  2:04       ` [Ocfs2-devel] " Joel Becker
2010-06-29  2:04         ` Joel Becker
2010-06-29  2:27         ` [Ocfs2-devel] " Dave Chinner
2010-06-29  2:27           ` Dave Chinner
2010-06-29  7:18           ` [Ocfs2-devel] " Joel Becker
2010-06-29  7:18             ` Joel Becker
2010-07-02 22:49             ` [Ocfs2-devel] [PATCH] ocfs2: Zero the tail cluster when extending past i_size Joel Becker
2010-07-02 22:49               ` Joel Becker
2010-07-03 21:32               ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Zero the tail cluster when extending past i_size v2 Joel Becker
2010-07-03 21:32                 ` Joel Becker
2010-07-03 21:33                 ` [Ocfs2-devel] [PATCH 2/2] ocfs2: No need to zero pages past i_size. " Joel Becker
2010-07-03 21:33                   ` Joel Becker
2010-07-04 15:13                   ` [Ocfs2-devel] " Tao Ma
2010-07-04 15:13                     ` Tao Ma
2010-07-05  1:38                     ` [Ocfs2-devel] " Tao Ma
2010-07-05  1:38                       ` Tao Ma
2010-07-06  7:10                       ` [Ocfs2-devel] " Joel Becker
2010-07-06  7:10                         ` Joel Becker
2010-07-06  7:09                     ` [Ocfs2-devel] " Joel Becker
2010-07-06  7:09                       ` Joel Becker
2010-07-06 18:39                       ` [Ocfs2-devel] " Joel Becker
2010-07-06 18:39                         ` Joel Becker
2010-07-05  3:51                 ` [Ocfs2-devel] [PATCH 1/2] ocfs2: Zero the tail cluster when extending past " Tao Ma
2010-07-05  3:51                   ` Tao Ma
2010-07-06  7:17                   ` [Ocfs2-devel] " Joel Becker
2010-07-06  7:17                     ` Joel Becker
2010-07-06  7:54                     ` [Ocfs2-devel] " Tao Ma
2010-07-06  7:54                       ` Tao Ma
2010-07-06 11:58                       ` [Ocfs2-devel] " Joel Becker
2010-07-06 11:58                         ` Joel Becker
2010-07-07  0:42                         ` [Ocfs2-devel] " Tao Ma
2010-07-07  0:42                           ` Tao Ma
2010-07-07  2:03                           ` [Ocfs2-devel] " Joel Becker
2010-07-07  2:03                             ` Joel Becker
2010-07-06 18:48                   ` [Ocfs2-devel] " Joel Becker
2010-07-06 18:48                     ` Joel Becker
2010-07-06 18:57                   ` [Ocfs2-devel] " Joel Becker
2010-07-06 18:57                     ` Joel Becker
2010-07-07 11:16                 ` [Ocfs2-devel] [PATCH 0/3] ocfs2: Tail zeroing fixes Joel Becker
2010-07-07 11:16                   ` Joel Becker
2010-07-12 22:45                   ` [Ocfs2-devel] " Joel Becker
2010-07-12 22:45                     ` Joel Becker
2010-07-07 11:16                 ` [Ocfs2-devel] [PATCH 1/3] ocfs2: When zero extending, do it by page Joel Becker
2010-07-07 11:16                   ` Joel Becker
2010-07-07 15:19                   ` [Ocfs2-devel] " Tao Ma
2010-07-07 15:19                     ` Tao Ma
2010-07-07 20:04                     ` [Ocfs2-devel] " Joel Becker
2010-07-07 20:04                       ` Joel Becker
2010-07-08  3:44                   ` Tao Ma [this message]
2010-07-08  3:44                     ` Tao Ma
2010-07-08  9:51                     ` [Ocfs2-devel] " Joel Becker
2010-07-08  9:51                       ` Joel Becker
2010-07-07 11:16                 ` [Ocfs2-devel] [PATCH 2/3] ocfs2: Zero the tail cluster when extending past i_size Joel Becker
2010-07-07 11:16                   ` Joel Becker
2010-07-07 11:16                 ` [Ocfs2-devel] [PATCH 3/3] ocfs2: No need to zero pages " Joel Becker
2010-07-07 11:16                   ` Joel Becker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4C3549BB.2000906@oracle.com \
    --to=tao.ma@oracle.com \
    --cc=david@fromorbit.com \
    --cc=dchinner@redhat.com \
    --cc=hch@lst.de \
    --cc=joel.becker@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mfasheh@suse.com \
    --cc=ocfs2-devel@oss.oracle.com \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.