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 | } |