From: "Lukáš Czerner" <lczerner@redhat.com>
To: Zheng Liu <gnehzuil.liu@gmail.com>
Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org,
xiaoqiangnk@gmail.com, achender@linux.vnet.ibm.com,
wenqing.lz@taobao.com
Subject: Re: [RFC][PATCH 09/10 v1][RESEND] ext4: don't need to writeout all dirty pages in punch hole
Date: Mon, 23 Jul 2012 13:01:53 +0200 (CEST) [thread overview]
Message-ID: <alpine.LFD.2.00.1207231249020.20857@localhost> (raw)
In-Reply-To: <1342943986-12413-10-git-send-email-wenqing.lz@taobao.com>
On Sun, 22 Jul 2012, Zheng Liu wrote:
> Date: Sun, 22 Jul 2012 15:59:45 +0800
> From: Zheng Liu <gnehzuil.liu@gmail.com>
> To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org
> Cc: xiaoqiangnk@gmail.com, achender@linux.vnet.ibm.com, wenqing.lz@taobao.com
> Subject: [RFC][PATCH 09/10 v1][RESEND] ext4: don't need to writeout all dirty
> pages in punch hole
>
> From: Zheng Liu <wenqing.lz@taobao.com>
>
> Now we don't need to writeout all dirty pages when punching a hole. The i_mutex
> locking is taken to avoid concurrent writes. In truncate_pagecache_range, all
> pages in this hole is released, and ext4_es_remove_space is called to update
> extent status tree.
Hi Zheng,
I am currently in the middle of reworking punch hole for ext4 so
there will be some changes in this area. See the patch set
http://www.spinics.net/lists/linux-ext4/msg33014.html
Moreover I think that we should avoid taking i_mutex if we can and I
believe that we can in this case, because we only need to prevent
allocation. So I just want to let you know that this part is
probably going to change anyway.
Thanks!
-Lukas
>
> Signed-off-by: Zheng Liu <wenqing.lz@taobao.com>
> ---
> fs/ext4/extents.c | 28 ++++++++++++----------------
> 1 files changed, 12 insertions(+), 16 deletions(-)
>
> diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
> index f2c5294..2a526b4 100644
> --- a/fs/ext4/extents.c
> +++ b/fs/ext4/extents.c
> @@ -4529,9 +4529,11 @@ int ext4_ext_punch_hole(struct file *file, loff_t offset, loff_t length)
> loff_t first_page_offset, last_page_offset;
> int credits, err = 0;
>
> + mutex_lock(&inode->i_mutex);
> +
> /* No need to punch hole beyond i_size */
> if (offset >= inode->i_size)
> - return 0;
> + goto error;
>
> /*
> * If the hole extends beyond i_size, set the hole
> @@ -4549,18 +4551,6 @@ int ext4_ext_punch_hole(struct file *file, loff_t offset, loff_t length)
> first_page_offset = first_page << PAGE_CACHE_SHIFT;
> last_page_offset = last_page << PAGE_CACHE_SHIFT;
>
> - /*
> - * Write out all dirty pages to avoid race conditions
> - * Then release them.
> - */
> - if (mapping->nrpages && mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) {
> - err = filemap_write_and_wait_range(mapping,
> - offset, offset + length - 1);
> -
> - if (err)
> - return err;
> - }
> -
> /* Now release the pages */
> if (last_page_offset > first_page_offset) {
> truncate_pagecache_range(inode, first_page_offset,
> @@ -4572,12 +4562,14 @@ int ext4_ext_punch_hole(struct file *file, loff_t offset, loff_t length)
>
> credits = ext4_writepage_trans_blocks(inode);
> handle = ext4_journal_start(inode, credits);
> - if (IS_ERR(handle))
> - return PTR_ERR(handle);
> + if (IS_ERR(handle)) {
> + err = PTR_ERR(handle);
> + goto error;
> + }
>
> err = ext4_orphan_add(handle, inode);
> if (err)
> - goto out;
> + goto error;
>
> /*
> * Now we need to zero out the non-page-aligned data in the
> @@ -4652,6 +4644,8 @@ int ext4_ext_punch_hole(struct file *file, loff_t offset, loff_t length)
> ext4_ext_invalidate_cache(inode);
> ext4_discard_preallocations(inode);
>
> + err = ext4_es_remove_space(inode, first_block,
> + stop_block - first_block);
> err = ext4_ext_remove_space(inode, first_block, stop_block - 1);
>
> ext4_ext_invalidate_cache(inode);
> @@ -4667,6 +4661,8 @@ out:
> inode->i_mtime = inode->i_ctime = ext4_current_time(inode);
> ext4_mark_inode_dirty(handle, inode);
> ext4_journal_stop(handle);
> +error:
> + mutex_unlock(&inode->i_mutex);
> return err;
> }
> int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
>
next prev parent reply other threads:[~2012-07-23 11:02 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-22 7:59 [RFC][PATCH 00/10 v1][RESEND] ext4: extent status tree (step 1) Zheng Liu
2012-07-22 7:59 ` [RFC][PATCH 01/10 v1][RESEND] ext4: add two structures supporting extent status tree Zheng Liu
2012-07-22 7:59 ` [RFC][PATCH 02/10 v1][RESEND] ext4: add operations on " Zheng Liu
2012-07-31 11:55 ` Lukáš Czerner
2012-07-31 13:18 ` Zheng Liu
2012-07-22 7:59 ` [RFC][PATCH 03/10 v1][RESEND] ext4: initialize " Zheng Liu
2012-07-22 7:59 ` [RFC][PATCH 04/10 v1][RESEND] ext4: let ext4 maintain " Zheng Liu
2012-07-22 7:59 ` [RFC][PATCH 05/10 v1][RESEND] ext4: add some tracepoints in " Zheng Liu
2012-07-22 7:59 ` [RFC][PATCH 06/10 v1][RESEND] ext4: reimplement fiemap on " Zheng Liu
2012-07-22 7:59 ` [RFC][PATCH 07/10 v1][RESEND] ext4: reimplement ext4_find_delay_alloc_range " Zheng Liu
2012-07-22 7:59 ` [RFC][PATCH 08/10 v1][RESEND] ext4: introduce lseek SEEK_DATA/SEEK_HOLE support Zheng Liu
2012-07-22 7:59 ` [RFC][PATCH 09/10 v1][RESEND] ext4: don't need to writeout all dirty pages in punch hole Zheng Liu
2012-07-23 11:01 ` Lukáš Czerner [this message]
2012-07-23 11:57 ` Zheng Liu
2012-07-23 12:20 ` Lukáš Czerner
2012-07-23 13:18 ` Zheng Liu
2012-07-22 7:59 ` [RFC][PATCH 10/10 v1][RESEND] ext4: add two tracepoints in punching hole Zheng Liu
2012-07-27 13:43 ` Lukáš Czerner
2012-07-30 2:15 ` Zheng Liu
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=alpine.LFD.2.00.1207231249020.20857@localhost \
--to=lczerner@redhat.com \
--cc=achender@linux.vnet.ibm.com \
--cc=gnehzuil.liu@gmail.com \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=wenqing.lz@taobao.com \
--cc=xiaoqiangnk@gmail.com \
/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.