On Fri, Nov 30, 2012 at 11:55:08AM -0600, Mark Tinguely wrote: > On 11/30/12 10:09, 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. > > > > eeek. yep, I will loop through and count the pages needed in each > segment. That's wrong - the pages must be mappable as a contiguous memory range. That's how this code avoids copying the data from discontiguous page ranges into a contiguous mapped memory range. If you separate each IO into to it's own set of pages, then you have to completely rewrite _xfs_buf_ioapply(), which AFAICT works just fine with the page allocation that is done right now.... Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs