diff options
| author | Steven Whitehouse <swhiteho@redhat.com> | 2006-09-28 08:29:59 -0400 |
|---|---|---|
| committer | Steven Whitehouse <swhiteho@redhat.com> | 2006-09-28 08:29:59 -0400 |
| commit | 185a257f2f73bcd89050ad02da5bedbc28fc43fa (patch) | |
| tree | 5e32586114534ed3f2165614cba3d578f5d87307 /mm/page_io.c | |
| parent | 3f1a9aaeffd8d1cbc5ab9776c45cbd66af1c9699 (diff) | |
| parent | a77c64c1a641950626181b4857abb701d8f38ccc (diff) | |
Merge branch 'master' into gfs2
Diffstat (limited to 'mm/page_io.c')
| -rw-r--r-- | mm/page_io.c | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/mm/page_io.c b/mm/page_io.c index 88029948d00a..d4840ecbf8f9 100644 --- a/mm/page_io.c +++ b/mm/page_io.c | |||
| @@ -52,14 +52,29 @@ static int end_swap_bio_write(struct bio *bio, unsigned int bytes_done, int err) | |||
| 52 | if (bio->bi_size) | 52 | if (bio->bi_size) |
| 53 | return 1; | 53 | return 1; |
| 54 | 54 | ||
| 55 | if (!uptodate) | 55 | if (!uptodate) { |
| 56 | SetPageError(page); | 56 | SetPageError(page); |
| 57 | /* | ||
| 58 | * We failed to write the page out to swap-space. | ||
| 59 | * Re-dirty the page in order to avoid it being reclaimed. | ||
| 60 | * Also print a dire warning that things will go BAD (tm) | ||
| 61 | * very quickly. | ||
| 62 | * | ||
| 63 | * Also clear PG_reclaim to avoid rotate_reclaimable_page() | ||
| 64 | */ | ||
| 65 | set_page_dirty(page); | ||
| 66 | printk(KERN_ALERT "Write-error on swap-device (%u:%u:%Lu)\n", | ||
| 67 | imajor(bio->bi_bdev->bd_inode), | ||
| 68 | iminor(bio->bi_bdev->bd_inode), | ||
| 69 | (unsigned long long)bio->bi_sector); | ||
| 70 | ClearPageReclaim(page); | ||
| 71 | } | ||
| 57 | end_page_writeback(page); | 72 | end_page_writeback(page); |
| 58 | bio_put(bio); | 73 | bio_put(bio); |
| 59 | return 0; | 74 | return 0; |
| 60 | } | 75 | } |
| 61 | 76 | ||
| 62 | static int end_swap_bio_read(struct bio *bio, unsigned int bytes_done, int err) | 77 | int end_swap_bio_read(struct bio *bio, unsigned int bytes_done, int err) |
| 63 | { | 78 | { |
| 64 | const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); | 79 | const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); |
| 65 | struct page *page = bio->bi_io_vec[0].bv_page; | 80 | struct page *page = bio->bi_io_vec[0].bv_page; |
| @@ -70,6 +85,10 @@ static int end_swap_bio_read(struct bio *bio, unsigned int bytes_done, int err) | |||
| 70 | if (!uptodate) { | 85 | if (!uptodate) { |
| 71 | SetPageError(page); | 86 | SetPageError(page); |
| 72 | ClearPageUptodate(page); | 87 | ClearPageUptodate(page); |
| 88 | printk(KERN_ALERT "Read-error on swap-device (%u:%u:%Lu)\n", | ||
| 89 | imajor(bio->bi_bdev->bd_inode), | ||
| 90 | iminor(bio->bi_bdev->bd_inode), | ||
| 91 | (unsigned long long)bio->bi_sector); | ||
| 73 | } else { | 92 | } else { |
| 74 | SetPageUptodate(page); | 93 | SetPageUptodate(page); |
| 75 | } | 94 | } |
| @@ -137,10 +156,12 @@ out: | |||
| 137 | * 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 |
| 138 | * we want. | 157 | * we want. |
| 139 | */ | 158 | */ |
| 140 | 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) | ||
| 141 | { | 161 | { |
| 142 | struct bio *bio; | 162 | struct bio *bio; |
| 143 | int ret = 0; | 163 | int ret = 0; |
| 164 | int bio_rw; | ||
| 144 | 165 | ||
| 145 | lock_page(page); | 166 | lock_page(page); |
| 146 | 167 | ||
| @@ -151,11 +172,22 @@ int rw_swap_page_sync(int rw, swp_entry_t entry, struct page *page) | |||
| 151 | goto out; | 172 | goto out; |
| 152 | } | 173 | } |
| 153 | 174 | ||
| 154 | submit_bio(rw | (1 << BIO_RW_SYNC), bio); | 175 | bio_rw = rw; |
| 155 | wait_on_page_locked(page); | 176 | if (!bio_chain) |
| 156 | 177 | bio_rw |= (1 << BIO_RW_SYNC); | |
| 157 | if (!PageUptodate(page) || PageError(page)) | 178 | if (bio_chain) |
| 158 | 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 | } | ||
| 159 | out: | 191 | out: |
| 160 | return ret; | 192 | return ret; |
| 161 | } | 193 | } |
