diff options
Diffstat (limited to 'mm/page_io.c')
| -rw-r--r-- | mm/page_io.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/mm/page_io.c b/mm/page_io.c index dc76b4d0611e..34f02923744c 100644 --- a/mm/page_io.c +++ b/mm/page_io.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <linux/bio.h> | 18 | #include <linux/bio.h> |
| 19 | #include <linux/swapops.h> | 19 | #include <linux/swapops.h> |
| 20 | #include <linux/writeback.h> | 20 | #include <linux/writeback.h> |
| 21 | #include <linux/frontswap.h> | ||
| 21 | #include <asm/pgtable.h> | 22 | #include <asm/pgtable.h> |
| 22 | 23 | ||
| 23 | static struct bio *get_swap_bio(gfp_t gfp_flags, | 24 | static struct bio *get_swap_bio(gfp_t gfp_flags, |
| @@ -98,6 +99,12 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) | |||
| 98 | unlock_page(page); | 99 | unlock_page(page); |
| 99 | goto out; | 100 | goto out; |
| 100 | } | 101 | } |
| 102 | if (frontswap_store(page) == 0) { | ||
| 103 | set_page_writeback(page); | ||
| 104 | unlock_page(page); | ||
| 105 | end_page_writeback(page); | ||
| 106 | goto out; | ||
| 107 | } | ||
| 101 | bio = get_swap_bio(GFP_NOIO, page, end_swap_bio_write); | 108 | bio = get_swap_bio(GFP_NOIO, page, end_swap_bio_write); |
| 102 | if (bio == NULL) { | 109 | if (bio == NULL) { |
| 103 | set_page_dirty(page); | 110 | set_page_dirty(page); |
| @@ -122,6 +129,11 @@ int swap_readpage(struct page *page) | |||
| 122 | 129 | ||
| 123 | VM_BUG_ON(!PageLocked(page)); | 130 | VM_BUG_ON(!PageLocked(page)); |
| 124 | VM_BUG_ON(PageUptodate(page)); | 131 | VM_BUG_ON(PageUptodate(page)); |
| 132 | if (frontswap_load(page) == 0) { | ||
| 133 | SetPageUptodate(page); | ||
| 134 | unlock_page(page); | ||
| 135 | goto out; | ||
| 136 | } | ||
| 125 | bio = get_swap_bio(GFP_KERNEL, page, end_swap_bio_read); | 137 | bio = get_swap_bio(GFP_KERNEL, page, end_swap_bio_read); |
| 126 | if (bio == NULL) { | 138 | if (bio == NULL) { |
| 127 | unlock_page(page); | 139 | unlock_page(page); |
