[btrfs-devel]A question about extent buffer codes

Chris Mason chris.mason at oracle.com
Wed Oct 17 08:38:35 PDT 2007


On Tue, 2007-10-16 at 22:36 +0800, Yan Zheng wrote:
> 2007/10/16, Chris Mason <chris.mason at oracle.com>:
> > On Tue, 2007-10-16 at 20:32 +0800, Yan Zheng wrote:
> > > Hello
> > >
> > > Some xxx_extent_buffer functions have codes like:
> > > --
> > > offset = dst_offset & ((unsigned long)PAGE_CACHE_SIZE - 1);
> > > if (i == 0)
> > >         offset += start_offset;
> > >
> > > I can't understand why these is a test.  I feel the variable 'offset'
> > > should be computed by code like:
> > > --
> > >  offset = (dst_offset + start_offset) & ((unsigned
> > > long)PAGE_CACHE_SIZE - 1);
> > It could be offset = (dst->start + dst_offset) & PAGE_CACHE_SIZE - 1,
> > but start_offset is already the offset into the first page.  So, we only
> > want to add it on the first page.
> > -chris
> >
> I'm sorry , I'm still confused by these codes.  For example, when page
> size is 4k,  the start_offset of a extent buffer is 2048 and we want
> to access the 4096th byte in the extent buffer(parameter start is
> 4096). the data should be in the second page in the extent buffer and
> offset from the start of the second page should be 2048.  But if
> compute variable 'offset' by codes:
> ---  codes from read_extent_buffer  ---
> offset = start & ((unsigned long)PAGE_CACHE_SIZE - 1);
> if (i == 0)
> 	offset += start_offset;
> 
> offset is 0.   Please tell me where my mistake is,  Thanks.

Sorry, I wasn't clear.  I'll change it to (dst->start + dst_offset) &
(PAGE_CACHE_SIZE - 1), which will be correct.

It didn't show up in testing because the current code always uses
blocksizes in multiples of the page size.

-chris





More information about the Btrfs-devel mailing list