diff options
| -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 3cc671c8a67..a5a260fab82 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; |
