1 /* 2 * linux/mm/page_io.c 3 * 4 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds 5 * 6 * Swap reorganised 29.12.95, 7 * Asynchronous swapping added 30.12.95. Stephen Tweedie 8 * Removed race in async swapping. 14.4.1996. Bruno Haible 9 * Add swap of shared pages through the page cache. 20.2.1998. Stephen Tweedie 10 * Always use brw_page, life becomes simpler. 12 May 1998 Eric Biederman 11 */ 12 13 #include <linux/mm.h> 14 #include <linux/kernel_stat.h> 15 #include <linux/gfp.h> 16 #include <linux/pagemap.h> 17 #include <linux/swap.h> 18 #include <linux/bio.h> 19 #include <linux/swapops.h> 20 #include <linux/writeback.h> 21 #include <asm/pgtable.h> 22 23 static struct bio *get_swap_bio(gfp_t gfp_flags, 24 struct page *page, bio_end_io_t end_io) 25 { 26 struct bio *bio; 27 28 bio = bio_alloc(gfp_flags, 1); 29 if (bio) { 30 bio->bi_sector = map_swap_page(page, &bio->bi_bdev); 31 bio->bi_sector <<= PAGE_SHIFT - 9; 32 bio->bi_io_vec[0].bv_page = page; 33 bio->bi_io_vec[0].bv_len = PAGE_SIZE; 34 bio->bi_io_vec[0].bv_offset = 0; 35 bio->bi_vcnt = 1; 36 bio->bi_idx = 0; 37 bio->bi_size = PAGE_SIZE; 38 bio->bi_end_io = end_io; 39 } 40 return bio; 41 } 42 43 static void end_swap_bio_write(struct bio *bio, int err) 44 { 45 const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); 46 struct page *page = bio->bi_io_vec[0].bv_page; 47 48 if (!uptodate) { 49 SetPageError(page); 50 /* 51 * We failed to write the page out to swap-space. 52 * Re-dirty the page in order to avoid it being reclaimed. 53 * Also print a dire warning that things will go BAD (tm) 54 * very quickly. 55 * 56 * Also clear PG_reclaim to avoid rotate_reclaimable_page() 57 */ 58 set_page_dirty(page); 59 printk(KERN_ALERT "Write-error on swap-device (%u:%u:%Lu)\n", 60 imajor(bio->bi_bdev->bd_inode), 61 iminor(bio->bi_bdev->bd_inode), 62 (unsigned long long)bio->bi_sector); 63 ClearPageReclaim(page); 64 } 65 end_page_writeback(page); 66 bio_put(bio); 67 } 68 69 void end_swap_bio_read(struct bio *bio, int err) 70 { 71 const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); 72 struct page *page = bio->bi_io_vec[0].bv_page; 73 74 if (!uptodate) { 75 SetPageError(page); 76 ClearPageUptodate(page); 77 printk(KERN_ALERT "Read-error on swap-device (%u:%u:%Lu)\n", 78 imajor(bio->bi_bdev->bd_inode), 79 iminor(bio->bi_bdev->bd_inode), 80 (unsigned long long)bio->bi_sector); 81 } else { 82 SetPageUptodate(page); 83 } 84 unlock_page(page); 85 bio_put(bio); 86 } 87 88 /* 89 * We may have stale swap cache pages in memory: notice 90 * them here and get rid of the unnecessary final write. 91 */ 92 int swap_writepage(struct page *page, struct writeback_control *wbc) 93 { 94 struct bio *bio; 95 int ret = 0, rw = WRITE; 96 97 if (try_to_free_swap(page)) { 98 unlock_page(page); 99 goto out; 100 } 101 bio = get_swap_bio(GFP_NOIO, page, end_swap_bio_write); 102 if (bio == NULL) { 103 set_page_dirty(page); 104 unlock_page(page); 105 ret = -ENOMEM; 106 goto out; 107 } 108 if (wbc->sync_mode == WB_SYNC_ALL) 109 rw |= REQ_SYNC; 110 count_vm_event(PSWPOUT); 111 set_page_writeback(page); 112 unlock_page(page); 113 submit_bio(rw, bio); 114 out: 115 return ret; 116 } 117 118 int swap_readpage(struct page *page) 119 { 120 struct bio *bio; 121 int ret = 0; 122 123 VM_BUG_ON(!PageLocked(page)); 124 VM_BUG_ON(PageUptodate(page)); 125 bio = get_swap_bio(GFP_KERNEL, page, end_swap_bio_read); 126 if (bio == NULL) { 127 unlock_page(page); 128 ret = -ENOMEM; 129 goto out; 130 } 131 count_vm_event(PSWPIN); 132 submit_bio(READ, bio); 133 out: 134 return ret; 135 } 136