aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/linux-2.6/xfs_buf.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
index 3cc671c8a67f..a5a260fab824 100644
--- a/fs/xfs/linux-2.6/xfs_buf.c
+++ b/fs/xfs/linux-2.6/xfs_buf.c
@@ -455,9 +455,17 @@ _xfs_buf_map_pages(
455 bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset; 455 bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset;
456 bp->b_flags |= XBF_MAPPED; 456 bp->b_flags |= XBF_MAPPED;
457 } else if (flags & XBF_MAPPED) { 457 } else if (flags & XBF_MAPPED) {
458 bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count, 458 int retried = 0;
459 -1, PAGE_KERNEL); 459
460 if (unlikely(bp->b_addr == NULL)) 460 do {
461 bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count,
462 -1, PAGE_KERNEL);
463 if (bp->b_addr)
464 break;
465 vm_unmap_aliases();
466 } while (retried++ <= 1);
467
468 if (!bp->b_addr)
461 return -ENOMEM; 469 return -ENOMEM;
462 bp->b_addr += bp->b_offset; 470 bp->b_addr += bp->b_offset;
463 bp->b_flags |= XBF_MAPPED; 471 bp->b_flags |= XBF_MAPPED;