page_io.c (8a84fc15ae5cafcc366dd85cf8e1ab2040679abc) | page_io.c (3aef83e0ef1ffb8ea3bea97be46821a45c952173) |
---|---|
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 --- 133 unchanged lines hidden (view full) --- 142 ret = -ENOMEM; 143 goto out; 144 } 145 count_vm_event(PSWPIN); 146 submit_bio(READ, bio); 147out: 148 return ret; 149} | 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 --- 133 unchanged lines hidden (view full) --- 142 ret = -ENOMEM; 143 goto out; 144 } 145 count_vm_event(PSWPIN); 146 submit_bio(READ, bio); 147out: 148 return ret; 149} |
150 151#ifdef CONFIG_SOFTWARE_SUSPEND 152/* 153 * A scruffy utility function to read or write an arbitrary swap page 154 * and wait on the I/O. The caller must have a ref on the page. 155 * 156 * We use end_swap_bio_read() even for writes, because it happens to do what 157 * we want. 158 */ 159int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page, 160 struct bio **bio_chain) 161{ 162 struct bio *bio; 163 int ret = 0; 164 int bio_rw; 165 166 lock_page(page); 167 168 bio = get_swap_bio(GFP_KERNEL, entry.val, page, end_swap_bio_read); 169 if (bio == NULL) { 170 unlock_page(page); 171 ret = -ENOMEM; 172 goto out; 173 } 174 175 bio_rw = rw; 176 if (!bio_chain) 177 bio_rw |= (1 << BIO_RW_SYNC); 178 if (bio_chain) 179 bio_get(bio); 180 submit_bio(bio_rw, bio); 181 if (bio_chain == NULL) { 182 wait_on_page_locked(page); 183 184 if (!PageUptodate(page) || PageError(page)) 185 ret = -EIO; 186 } 187 if (bio_chain) { 188 bio->bi_private = *bio_chain; 189 *bio_chain = bio; 190 } 191out: 192 return ret; 193} 194#endif | |