All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Lukáš Czerner" <lczerner@redhat.com>
To: Zheng Liu <gnehzuil.liu@gmail.com>
Cc: "Lukáš Czerner" <lczerner@redhat.com>,
	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 14:20:57 +0200 (CEST)	[thread overview]
Message-ID: <alpine.LFD.2.00.1207231354220.20857@localhost> (raw)
In-Reply-To: <20120723115722.GA3363@gmail.com>

[-- Attachment #1: Type: TEXT/PLAIN, Size: 6172 bytes --]

On Mon, 23 Jul 2012, Zheng Liu wrote:

> Date: Mon, 23 Jul 2012 19:57:22 +0800
> From: Zheng Liu <gnehzuil.liu@gmail.com>
> To: Lukáš Czerner <lczerner@redhat.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
> 
> Hi Lukas,
> 
> On Mon, Jul 23, 2012 at 01:01:53PM +0200, Lukáš Czerner wrote:
> > 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
> 
> Thank you for your reminding.  I have seen your patch set and it is
> pretty cool.  IMHO your patch set shall be merged into upstream kernel
> before applying io tree because io tree still has a lot of things that
> needs to be done.  So I will change it according to your patches. :-)

Great, thanks!

> 
> > 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.
> 
> It seems that we need to take i_mutex locking to prevent from buffered
> writes after page cache has been truncated by truncate_pagecache_range.
> If a buffered write without delalloc occurs after truncating page cache
> and before taking i_data_sem, that means that the allocated block for
> this buffered write will be removed in ext4_ext_remove_space when the
> offset is within the range of the hole.  Am I missing something?

You're absolutely right, currently this is possible. But I think that we
can take i_data_sem before truncating the pagecache hence preventing anyone
from mapping new blocks. However this is not yet implemented in my
patch set.

...
hmm, looking at the ext4_write_begin() it seems like it might not be
such good idea after all. It seems to take page lock before
i_data_sem so we might get deadlock, moreover if the punch hole
happened in the middle of the ext4_write_begin() we might have only
part of the data written, moreover this does not have to be hole
aligned, which is bad. I need to revise that.

Thanks!
-Lukas


> 
> Regards,
> Zheng
> 
> > > 
> > > 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,
> > > 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

  reply	other threads:[~2012-07-23 12:20 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
2012-07-23 11:57     ` Zheng Liu
2012-07-23 12:20       ` Lukáš Czerner [this message]
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.1207231354220.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.