|
@@ -455,9 +455,17 @@ _xfs_buf_map_pages(
|
|
|
bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset;
|
|
|
bp->b_flags |= XBF_MAPPED;
|
|
|
} else if (flags & XBF_MAPPED) {
|
|
|
- bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count,
|
|
|
- -1, PAGE_KERNEL);
|
|
|
- if (unlikely(bp->b_addr == NULL))
|
|
|
+ int retried = 0;
|
|
|
+
|
|
|
+ do {
|
|
|
+ bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count,
|
|
|
+ -1, PAGE_KERNEL);
|
|
|
+ if (bp->b_addr)
|
|
|
+ break;
|
|
|
+ vm_unmap_aliases();
|
|
|
+ } while (retried++ <= 1);
|
|
|
+
|
|
|
+ if (!bp->b_addr)
|
|
|
return -ENOMEM;
|
|
|
bp->b_addr += bp->b_offset;
|
|
|
bp->b_flags |= XBF_MAPPED;
|