fs/block_dev.c: add bdev_read_page() and bdev_write_page()
[firefly-linux-kernel-4.4.55.git] / fs / mpage.c
index 10da0da730177672c18ca20862fba9ff4fffb0b6..5f9ed622274f411128752d7efd472f954f669a6e 100644 (file)
@@ -269,6 +269,11 @@ do_mpage_readpage(struct bio *bio, struct page *page, unsigned nr_pages,
 
 alloc_new:
        if (bio == NULL) {
+               if (first_hole == blocks_per_page) {
+                       if (!bdev_read_page(bdev, blocks[0] << (blkbits - 9),
+                                                               page))
+                               goto out;
+               }
                bio = mpage_alloc(bdev, blocks[0] << (blkbits - 9),
                                min_t(int, nr_pages, bio_get_nr_vecs(bdev)),
                                GFP_KERNEL);
@@ -587,6 +592,13 @@ page_is_mapped:
 
 alloc_new:
        if (bio == NULL) {
+               if (first_unmapped == blocks_per_page) {
+                       if (!bdev_write_page(bdev, blocks[0] << (blkbits - 9),
+                                                               page, wbc)) {
+                               clean_buffers(page, first_unmapped);
+                               goto out;
+                       }
+               }
                bio = mpage_alloc(bdev, blocks[0] << (blkbits - 9),
                                bio_get_nr_vecs(bdev), GFP_NOFS|__GFP_HIGH);
                if (bio == NULL)