@@ -1138,6 +1138,10 @@ xfs_buf_bio_end_io(
do {
struct page *page = bvec->bv_page;
+ if (is_vmalloc_addr(bp->b_addr))
+ invalidate_kernel_dcache_addr(bp->b_addr +
+ bvec->bv_offset);
+
ASSERT(!PagePrivate(page));
if (unlikely(bp->b_error)) {
if (bp->b_flags & XBF_READ)
@@ -1202,6 +1206,9 @@ _xfs_buf_ioapply(
bio->bi_end_io = xfs_buf_bio_end_io;
bio->bi_private = bp;
+ if (is_vmalloc_addr(bp->b_addr))
+ flush_kernel_dcache_addr(bp->b_addr);
+
bio_add_page(bio, bp->b_pages[0], PAGE_CACHE_SIZE, 0);
size = 0;
@@ -1228,6 +1235,9 @@ next_chunk:
if (nbytes > size)
nbytes = size;
+ if (is_vmalloc_addr(bp->b_addr))
+ flush_kernel_dcache_addr(bp->b_addr + PAGE_SIZE*map_i);
+
rbytes = bio_add_page(bio, bp->b_pages[map_i], nbytes, offset);
if (rbytes < nbytes)
break;
xfs_buf.c includes what is essentially a hand rolled version of blk_rq_map_kern(). In order to work properly with the vmalloc buffers that xfs uses, this hand rolled routine must also implement the flushing API for vmap/vmalloc areas. Signed-off-by: James Bottomley <James.Bottomley@suse.de> --- fs/xfs/linux-2.6/xfs_buf.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-)