diff options
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 14 |
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; |