@@ -1132,15 +1132,25 @@ xfs_buf_bio_end_io(
xfs_buf_t *bp = (xfs_buf_t *)bio->bi_private;
unsigned int blocksize = bp->b_target->bt_bsize;
struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
+ void *vaddr = NULL;
+ int i;
xfs_buf_ioerror(bp, -error);
+ if (is_vmalloc_addr(bp->b_addr))
+ for (i = 0; i < bp->b_page_count; i++)
+ if (bvec->bv_page == bp->b_pages[i]) {
+ vaddr = bp->b_addr + i*PAGE_SIZE;
+ break;
+ }
+
do {
struct page *page = bvec->bv_page;
- if (is_vmalloc_addr(bp->b_addr))
- invalidate_kernel_dcache_addr(bp->b_addr +
- bvec->bv_offset);
+ if (is_vmalloc_addr(bp->b_addr)) {
+ invalidate_kernel_dcache_addr(vaddr);
+ vaddr -= PAGE_SIZE;
+ }
ASSERT(!PagePrivate(page));
if (unlikely(bp->b_error)) {