linux-fsdevel.vger.kernel.org archive mirror
 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

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

Thread overview: 50+ 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 ` [PATCH v3 01/18] mm: " Lukas Czerner
2013-04-09  9:14 ` [PATCH v3 02/18] jbd2: change jbd2_journal_invalidatepage " Lukas Czerner
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 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 13:20   ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 05/18] xfs: use ->invalidatepage() length argument Lukas Czerner
2013-04-23 14:14   ` Theodore Ts'o
2013-04-23 21:06   ` Ben Myers
2013-04-09  9:14 ` [PATCH v3 06/18] ocfs2: " Lukas Czerner
2013-04-09 13:26   ` Jan Kara
2013-04-23 14:16   ` Theodore Ts'o
2013-05-02 22:00     ` Joel Becker
2013-04-09  9:14 ` [PATCH v3 07/18] ceph: " Lukas Czerner
2013-04-23 14:14   ` Theodore Ts'o
2013-04-23 16:04   ` Sage Weil
2013-04-09  9:14 ` [PATCH v3 08/18] gfs2: " Lukas Czerner
2013-04-09  9:29   ` [Cluster-devel] " Steven Whitehouse
2013-04-09 13:09   ` Bob Peterson
2013-04-09 13:27     ` Lukáš Czerner
2013-04-23 14:16   ` 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 13:27   ` Jan Kara
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-11 21:18   ` Jan Kara
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-18 22:08   ` Jan Kara
2013-04-09  9:14 ` [PATCH v3 12/18] Revert "ext4: fix fsx truncate failure" Lukas Czerner
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-19  5:03   ` Jan Kara [this message]
2013-04-09  9:14 ` [PATCH v3 14/18] ext4: remove unused discard_partial_page_buffers Lukas Czerner
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-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-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-20 13:42   ` Jan Kara
2013-04-23  9:19     ` Zheng Liu
2013-04-24 11:08       ` Lukáš Czerner
2013-04-24 11:29         ` Zheng Liu
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-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).