diff options
Diffstat (limited to 'mm')
| -rw-r--r-- | mm/page_io.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/mm/page_io.c b/mm/page_io.c index d2f0a5783370..f46a9862b7ef 100644 --- a/mm/page_io.c +++ b/mm/page_io.c | |||
| @@ -156,10 +156,12 @@ out: | |||
| 156 | * We use end_swap_bio_read() even for writes, because it happens to do what | 156 | * We use end_swap_bio_read() even for writes, because it happens to do what |
| 157 | * we want. | 157 | * we want. |
| 158 | */ | 158 | */ |
| 159 | int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page) | 159 | int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page, |
| 160 | struct bio **bio_chain) | ||
| 160 | { | 161 | { |
| 161 | struct bio *bio; | 162 | struct bio *bio; |
| 162 | int ret = 0; | 163 | int ret = 0; |
| 164 | int bio_rw; | ||
| 163 | 165 | ||
| 164 | lock_page(page); | 166 | lock_page(page); |
| 165 | 167 | ||
| @@ -170,11 +172,22 @@ int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page) | |||
| 170 | goto out; | 172 | goto out; |
| 171 | } | 173 | } |
| 172 | 174 | ||
| 173 | submit_bio(rw | (1 << BIO_RW_SYNC), bio); | 175 | bio_rw = rw; |
| 174 | wait_on_page_locked(page); | 176 | if (!bio_chain) |
| 175 | 177 | bio_rw |= (1 << BIO_RW_SYNC); | |
| 176 | if (!PageUptodate(page) || PageError(page)) | 178 | if (bio_chain) |
| 177 | ret = -EIO; | 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 | } | ||
| 178 | out: | 191 | out: |
| 179 | return ret; | 192 | return ret; |
| 180 | } | 193 | } |
