All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Lukas Czerner <lczerner@redhat.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org
Subject: Re: [PATCH v3 13/18] ext4: use ext4_zero_partial_blocks in punch_hole
Date: Fri, 19 Apr 2013 07:03:11 +0200	[thread overview]
Message-ID: <20130419050311.GD19244@quack.suse.cz> (raw)
In-Reply-To: <1365498867-27782-14-git-send-email-lczerner@redhat.com>

On Tue 09-04-13 11:14:22, Lukas Czerner wrote:
> We're doing to get rid of ext4_discard_partial_page_buffers() since it is
> duplicating some code and also partially duplicating work of
> truncate_pagecache_range(), moreover the old implementation was much
> clearer.
> 
> Now when the truncate_inode_pages_range() can handle truncating non page
> aligned regions we can use this to invalidate and zero out block aligned
> region of the punched out range and then use ext4_block_truncate_page()
> to zero the unaligned blocks on the start and end of the range. This
> will greatly simplify the punch hole code. Moreover after this commit we
> can get rid of the ext4_discard_partial_page_buffers() completely.
> 
> We also introduce function ext4_prepare_punch_hole() to do come common
> operations before we attempt to do the actual punch hole on
> indirect or extent file which saves us some code duplication.
> 
> This has been tested on ppc64 with 1k block size with fsx and xfstests
> without any problems.
> 
> Signed-off-by: Lukas Czerner <lczerner@redhat.com>
  Just two nits below, otherwise the patch looks good.

> ---
>  fs/ext4/ext4.h  |    2 +
>  fs/ext4/inode.c |  110 ++++++++++++++++++++-----------------------------------
>  2 files changed, 42 insertions(+), 70 deletions(-)
> 
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index 3aa5943..2428244 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -2109,6 +2109,8 @@ extern int ext4_block_truncate_page(handle_t *handle,
>  		struct address_space *mapping, loff_t from);
>  extern int ext4_block_zero_page_range(handle_t *handle,
>  		struct address_space *mapping, loff_t from, loff_t length);
> +extern int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
> +			     loff_t lstart, loff_t lend);
>  extern int ext4_discard_partial_page_buffers(handle_t *handle,
>  		struct address_space *mapping, loff_t from,
>  		loff_t length, int flags);
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index d58e13c..6003fd1 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -3675,6 +3675,37 @@ unlock:
>  	return err;
>  }
>  
> +int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
> +			     loff_t lstart, loff_t lend)
> +{
  It's a bit confusing that ext4_block_zero_page_range() takes start, len
arguments while this function takes start, end arguments. I think it should
better be unified to avoid stupid mistakes...

> +	struct super_block *sb = inode->i_sb;
> +	struct address_space *mapping = inode->i_mapping;
> +	unsigned partial = lstart & (sb->s_blocksize - 1);
> +	ext4_fsblk_t start = lstart >> sb->s_blocksize_bits;
> +	ext4_fsblk_t end = lend >> sb->s_blocksize_bits;
> +	int err = 0;
> +
> +	/* Handle partial zero within the single block */
> +	if (start == end) {
> +		err = ext4_block_zero_page_range(handle, mapping,
> +						 lstart, lend - lstart + 1);
> +		return err;
> +	}
> +	/* Handle partial zero out on the start of the range */
> +	if (partial) {
> +		err = ext4_block_zero_page_range(handle, mapping,
> +						 lstart, sb->s_blocksize);
> +		if (err)
> +			return err;
> +	}
> +	/* Handle partial zero out on the end of the range */
> +	partial = lend & (sb->s_blocksize - 1);
> +	if (partial != sb->s_blocksize - 1)
> +		err = ext4_block_zero_page_range(handle, mapping,
> +						 lend - partial, partial + 1);
> +	return err;
> +}
> +
>  int ext4_can_truncate(struct inode *inode)
>  {
>  	if (S_ISREG(inode->i_mode))
> @@ -3703,7 +3734,6 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length)
>  	struct super_block *sb = inode->i_sb;
>  	ext4_lblk_t first_block, stop_block;
>  	struct address_space *mapping = inode->i_mapping;
> -	loff_t first_page, last_page, page_len;
>  	loff_t first_page_offset, last_page_offset;
>  	handle_t *handle;
>  	unsigned int credits;
> @@ -3755,17 +3785,13 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length)
>  		   offset;
>  	}
>  
> -	first_page = (offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
> -	last_page = (offset + length) >> PAGE_CACHE_SHIFT;
> -
> -	first_page_offset = first_page << PAGE_CACHE_SHIFT;
> -	last_page_offset = last_page << PAGE_CACHE_SHIFT;
> +	first_page_offset = round_up(offset, sb->s_blocksize);
> +	last_page_offset = round_down((offset + length), sb->s_blocksize) - 1;
  Calling these {first,last}_block_offset would be more precise, wouldn't
it?

								Honza
-- 
Jan Kara <jack@suse.cz>
SUSE Labs, CR

WARNING: multiple messages have this Message-ID (diff)
From: Jan Kara <jack@suse.cz>
To: Lukas Czerner <lczerner@redhat.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org
Subject: Re: [PATCH v3 13/18] ext4: use ext4_zero_partial_blocks in punch_hole
Date: Fri, 19 Apr 2013 07:03:11 +0200	[thread overview]
Message-ID: <20130419050311.GD19244@quack.suse.cz> (raw)
In-Reply-To: <1365498867-27782-14-git-send-email-lczerner@redhat.com>

On Tue 09-04-13 11:14:22, Lukas Czerner wrote:
> We're doing to get rid of ext4_discard_partial_page_buffers() since it is
> duplicating some code and also partially duplicating work of
> truncate_pagecache_range(), moreover the old implementation was much
> clearer.
> 
> Now when the truncate_inode_pages_range() can handle truncating non page
> aligned regions we can use this to invalidate and zero out block aligned
> region of the punched out range and then use ext4_block_truncate_page()
> to zero the unaligned blocks on the start and end of the range. This
> will greatly simplify the punch hole code. Moreover after this commit we
> can get rid of the ext4_discard_partial_page_buffers() completely.
> 
> We also introduce function ext4_prepare_punch_hole() to do come common
> operations before we attempt to do the actual punch hole on
> indirect or extent file which saves us some code duplication.
> 
> This has been tested on ppc64 with 1k block size with fsx and xfstests
> without any problems.
> 
> Signed-off-by: Lukas Czerner <lczerner@redhat.com>
  Just two nits below, otherwise the patch looks good.

> ---
>  fs/ext4/ext4.h  |    2 +
>  fs/ext4/inode.c |  110 ++++++++++++++++++++-----------------------------------
>  2 files changed, 42 insertions(+), 70 deletions(-)
> 
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index 3aa5943..2428244 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -2109,6 +2109,8 @@ extern int ext4_block_truncate_page(handle_t *handle,
>  		struct address_space *mapping, loff_t from);
>  extern int ext4_block_zero_page_range(handle_t *handle,
>  		struct address_space *mapping, loff_t from, loff_t length);
> +extern int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
> +			     loff_t lstart, loff_t lend);
>  extern int ext4_discard_partial_page_buffers(handle_t *handle,
>  		struct address_space *mapping, loff_t from,
>  		loff_t length, int flags);
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index d58e13c..6003fd1 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -3675,6 +3675,37 @@ unlock:
>  	return err;
>  }
>  
> +int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
> +			     loff_t lstart, loff_t lend)
> +{
  It's a bit confusing that ext4_block_zero_page_range() takes start, len
arguments while this function takes start, end arguments. I think it should
better be unified to avoid stupid mistakes...

> +	struct super_block *sb = inode->i_sb;
> +	struct address_space *mapping = inode->i_mapping;
> +	unsigned partial = lstart & (sb->s_blocksize - 1);
> +	ext4_fsblk_t start = lstart >> sb->s_blocksize_bits;
> +	ext4_fsblk_t end = lend >> sb->s_blocksize_bits;
> +	int err = 0;
> +
> +	/* Handle partial zero within the single block */
> +	if (start == end) {
> +		err = ext4_block_zero_page_range(handle, mapping,
> +						 lstart, lend - lstart + 1);
> +		return err;
> +	}
> +	/* Handle partial zero out on the start of the range */
> +	if (partial) {
> +		err = ext4_block_zero_page_range(handle, mapping,
> +						 lstart, sb->s_blocksize);
> +		if (err)
> +			return err;
> +	}
> +	/* Handle partial zero out on the end of the range */
> +	partial = lend & (sb->s_blocksize - 1);
> +	if (partial != sb->s_blocksize - 1)
> +		err = ext4_block_zero_page_range(handle, mapping,
> +						 lend - partial, partial + 1);
> +	return err;
> +}
> +
>  int ext4_can_truncate(struct inode *inode)
>  {
>  	if (S_ISREG(inode->i_mode))
> @@ -3703,7 +3734,6 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length)
>  	struct super_block *sb = inode->i_sb;
>  	ext4_lblk_t first_block, stop_block;
>  	struct address_space *mapping = inode->i_mapping;
> -	loff_t first_page, last_page, page_len;
>  	loff_t first_page_offset, last_page_offset;
>  	handle_t *handle;
>  	unsigned int credits;
> @@ -3755,17 +3785,13 @@ int ext4_punch_hole(struct file *file, loff_t offset, loff_t length)
>  		   offset;
>  	}
>  
> -	first_page = (offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
> -	last_page = (offset + length) >> PAGE_CACHE_SHIFT;
> -
> -	first_page_offset = first_page << PAGE_CACHE_SHIFT;
> -	last_page_offset = last_page << PAGE_CACHE_SHIFT;
> +	first_page_offset = round_up(offset, sb->s_blocksize);
> +	last_page_offset = round_down((offset + length), sb->s_blocksize) - 1;
  Calling these {first,last}_block_offset would be more precise, wouldn't
it?

								Honza
-- 
Jan Kara <jack@suse.cz>
SUSE Labs, CR

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2013-04-19  5:03 UTC|newest]

Thread overview: 112+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-09  9:14 [PATCH v3 00/18] change invalidatepage prototype to accept length Lukas Czerner
2013-04-09  9:14 ` Lukas Czerner
2013-04-09  9:14 ` [PATCH v3 01/18] mm: " Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-09  9:14 ` [PATCH v3 02/18] jbd2: change jbd2_journal_invalidatepage " Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-09 13:22   ` Jan Kara
2013-04-09 13:22     ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 03/18] ext4: use ->invalidatepage() length argument Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-09 13:24   ` Jan Kara
2013-04-09 13:24     ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 04/18] jbd: change journal_invalidatepage() to accept length Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-09 13:20   ` Jan Kara
2013-04-09 13:20     ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 05/18] xfs: use ->invalidatepage() length argument Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-23 14:14   ` Theodore Ts'o
2013-04-23 14:14     ` Theodore Ts'o
2013-04-23 14:14     ` Theodore Ts'o
2013-04-23 21:06   ` Ben Myers
2013-04-23 21:06     ` Ben Myers
2013-04-23 21:06     ` Ben Myers
2013-04-09  9:14 ` [PATCH v3 06/18] ocfs2: " Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-09 13:26   ` Jan Kara
2013-04-09 13:26     ` Jan Kara
2013-04-23 14:16   ` Theodore Ts'o
2013-04-23 14:16     ` Theodore Ts'o
2013-04-23 14:16     ` [Ocfs2-devel] " Theodore Ts'o
2013-05-02 22:00     ` Joel Becker
2013-05-02 22:00       ` Joel Becker
2013-05-02 22:00       ` [Ocfs2-devel] " Joel Becker
2013-04-09  9:14 ` [PATCH v3 07/18] ceph: " Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-23 14:14   ` Theodore Ts'o
2013-04-23 14:14     ` Theodore Ts'o
2013-04-23 16:04   ` Sage Weil
2013-04-23 16:04     ` Sage Weil
2013-04-09  9:14 ` [Cluster-devel] [PATCH v3 08/18] gfs2: " Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-09  9:29   ` [Cluster-devel] " Steven Whitehouse
2013-04-09  9:29     ` Steven Whitehouse
2013-04-09  9:29     ` Steven Whitehouse
2013-04-09 13:09   ` Bob Peterson
2013-04-09 13:09     ` Bob Peterson
2013-04-09 13:09     ` Bob Peterson
2013-04-09 13:27     ` [Cluster-devel] " Lukáš Czerner
2013-04-09 13:27       ` Lukáš Czerner
2013-04-09 13:27       ` Lukáš Czerner
2013-04-23 14:16   ` [Cluster-devel] " Theodore Ts'o
2013-04-23 14:16     ` Theodore Ts'o
2013-04-23 14:16     ` Theodore Ts'o
2013-04-23 14:17     ` [Cluster-devel] " Theodore Ts'o
2013-04-23 14:17       ` Theodore Ts'o
2013-04-23 14:17       ` Theodore Ts'o
2013-04-09  9:14 ` [PATCH v3 09/18] reiserfs: " Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-09 13:27   ` Jan Kara
2013-04-09 13:27     ` Jan Kara
2013-04-10  9:51     ` Lukáš Czerner
2013-04-10  9:51       ` Lukáš Czerner
2013-04-09  9:14 ` [PATCH v3 10/18] mm: teach truncate_inode_pages_range() to handle non page aligned ranges Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-11 21:18   ` Jan Kara
2013-04-11 21:18     ` Jan Kara
2013-04-11 22:40     ` Hugh Dickins
2013-04-11 22:40       ` Hugh Dickins
2013-04-09  9:14 ` [PATCH v3 11/18] Revert "ext4: remove no longer used functions in inode.c" Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-18 22:08   ` Jan Kara
2013-04-18 22:08     ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 12/18] Revert "ext4: fix fsx truncate failure" Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-18 22:21   ` Jan Kara
2013-04-18 22:21     ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 13/18] ext4: use ext4_zero_partial_blocks in punch_hole Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-19  5:03   ` Jan Kara [this message]
2013-04-19  5:03     ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 14/18] ext4: remove unused discard_partial_page_buffers Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-19  5:04   ` Jan Kara
2013-04-19  5:04     ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 15/18] ext4: remove unused code from ext4_remove_blocks() Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-19  5:15   ` Jan Kara
2013-04-19  5:15     ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 16/18] ext4: update ext4_ext_remove_space trace point Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-19  5:16   ` Jan Kara
2013-04-19  5:16     ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 17/18] ext4: make punch hole code path work with bigalloc Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-20 13:42   ` Jan Kara
2013-04-20 13:42     ` Jan Kara
2013-04-23  9:19     ` Zheng Liu
2013-04-23  9:19       ` Zheng Liu
2013-04-24 11:08       ` Lukáš Czerner
2013-04-24 11:08         ` Lukáš Czerner
2013-04-24 11:29         ` Zheng Liu
2013-04-24 11:29           ` Zheng Liu
2013-04-24 11:29           ` Zheng Liu
2013-04-24 10:57     ` Lukáš Czerner
2013-04-24 10:57       ` Lukáš Czerner
2013-04-09  9:14 ` [PATCH v3 18/18] ext4: Allow punch hole with bigalloc enabled Lukas Czerner
2013-04-09  9:14   ` Lukas Czerner
2013-04-20 13:43   ` Jan Kara
2013-04-20 13:43     ` Jan Kara

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=20130419050311.GD19244@quack.suse.cz \
    --to=jack@suse.cz \
    --cc=lczerner@redhat.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.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.