[Ocfs2-devel] [PATCH] Treat writes as new when holes span across page boundaries

Joel Becker jlbec at evilplan.org
Sun Feb 20 18:08:57 PST 2011


On Sun, Feb 20, 2011 at 12:45:05PM -0600, Goldwyn Rodrigues wrote:
> On Sun, Feb 20, 2011 at 1:09 AM, Joel Becker <jlbec at evilplan.org> wrote:
> >        Is this a new approach to your earlier patch, or an additional
> > change?
> 
> This is a new approach. You can scrap the previous attempt. I started
> reading about write prepare's once you advised to look at the write
> front.

	Ok, cool.  It definitely is along the track I was suggesting.

> >> ---
> >> diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
> >> index 1fbb0e2..4be220d 100644
> >> --- a/fs/ocfs2/aops.c
> >> +++ b/fs/ocfs2/aops.c
> >> @@ -1026,6 +1026,12 @@ static int ocfs2_prepare_page_for_write(struct
> >> inode *inode, u64 *p_blkno,
> >>       ocfs2_figure_cluster_boundaries(OCFS2_SB(inode->i_sb), cpos,
> >>                                       &cluster_start, &cluster_end);
> >>
> >> +     /* treat the write as new if the a hole/lseek spanned across
> >> +      * the page boundary.
> >> +      */
> >> +     new = new | ((i_size_read(inode) <= page_offset(page)) &&
> >> +                     (page_offset(page) <= user_pos));
> >
> >        There are two problems here.  First, It's not safe to claim
> > existing data is 'new'.  Imagine you have a 4K page and a 512B
> > blocksize.  The first 2 blocks of the page have data in them, but your
> > code change will cause them to be set_uptodate() even if we haven't read
> > them in yet.
> 
> I did not understand this. Could you explain this in terms of
> blocksize=512, page_offset, i_size and pos?
> However I'll try to interpret: Won't the i_size be 1024 (assuming it
> is the start of file) and the new flag set to false?

	What if i_size is 1000?  The second block will have data,
including zeros to the end of the block.  I have to think about this
some more to be sure where the offsets lie -- this is hard code to think
about -- but essentially there is a difference between blocks we have
allocated but not used yet, and blocks that are part of a brand new
allocation.  We need to make sure we're not confusing the two.

> >        Secondly, ocfs2_should_read_blk() already checks for blocks past
> > i_size and skips reading them.  So if you are trying to avoid reading
> > them, it is already handled.
> 
> If the previous call was lseek, i_size is not updated.
> ocfs2_should_read_blk returns true and junk read.

	Why would it return true if the f_pos is > i_size?  It should
return 0.

Joel

-- 

Life's Little Instruction Book #314

	"Never underestimate the power of forgiveness."

			http://www.jlbec.org/
			jlbec at evilplan.org



More information about the Ocfs2-devel mailing list