xfs
[Top] [All Lists]

Re: [PATCH v2 1/3] xfs: use b_maps[] for discontiguous buffers

To: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Subject: Re: [PATCH v2 1/3] xfs: use b_maps[] for discontiguous buffers
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Sat, 1 Dec 2012 09:18:26 +1100
Cc: Mark Tinguely <tinguely@xxxxxxx>, xfs@xxxxxxxxxxx
In-reply-to: <20121130160920.GA9873@xxxxxxxxxxxxx>
References: <20121128222309.109033307@.sgi.com> <20121128222622.688093599@xxxxxxx> <20121130160920.GA9873@xxxxxxxxxxxxx>
User-agent: Mutt/1.5.21 (2010-09-15)
On Fri, Nov 30, 2012 at 11:09:20AM -0500, Christoph Hellwig wrote:
> >  use_alloc_page:
> > -   start = BBTOB(bp->b_map.bm_bn) >> PAGE_SHIFT;
> > -   end = (BBTOB(bp->b_map.bm_bn + bp->b_length) + PAGE_SIZE - 1)
> > +   start = BBTOB(bp->b_maps[0].bm_bn) >> PAGE_SHIFT;
> > +   end = (BBTOB(bp->b_maps[0].bm_bn + bp->b_length) + PAGE_SIZE - 1)
> 
> Btw, how is this logic supposed to work for discontiguous buffers?
> 
> Each of them might straddle boundaries individually, so doing the
> start/end calculation for the number of pages isn't going to be correct.

AFAICT it is correct - the first page is always aligned to the start
of the buffer (i.e. b_offset = 0), and the end is extended to ensure
that it covers any partial tail page. e.g:

Page    0               1               2
        +---------------+---------------+---------------+
map[0]  |----------|
map[1]             |------------|
map[2]                          |--------------|
        |---------------bp->b_length-----------|
        |                                               |
        start                                           end

Maps are always multiples of basic blocks, so every segment boundary
aligns to something that IO can be done on, and the array of pages
always spans the entire range of the maps.

Hence I'm not sure what the problem is here, Christoph. Can you
expand on the issue?

Cheers,

Dave.
-- 
Dave Chinner
david@xxxxxxxxxxxxx

<Prev in Thread] Current Thread [Next in Thread>