diff options
Diffstat (limited to 'fs/nfs/blocklayout/blocklayout.c')
-rw-r--r-- | fs/nfs/blocklayout/blocklayout.c | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c index e242bbf72972..56ff823ca82e 100644 --- a/fs/nfs/blocklayout/blocklayout.c +++ b/fs/nfs/blocklayout/blocklayout.c | |||
@@ -134,8 +134,8 @@ bl_submit_bio(int rw, struct bio *bio) | |||
134 | if (bio) { | 134 | if (bio) { |
135 | get_parallel(bio->bi_private); | 135 | get_parallel(bio->bi_private); |
136 | dprintk("%s submitting %s bio %u@%llu\n", __func__, | 136 | dprintk("%s submitting %s bio %u@%llu\n", __func__, |
137 | rw == READ ? "read" : "write", | 137 | rw == READ ? "read" : "write", bio->bi_iter.bi_size, |
138 | bio->bi_size, (unsigned long long)bio->bi_sector); | 138 | (unsigned long long)bio->bi_iter.bi_sector); |
139 | submit_bio(rw, bio); | 139 | submit_bio(rw, bio); |
140 | } | 140 | } |
141 | return NULL; | 141 | return NULL; |
@@ -156,7 +156,8 @@ static struct bio *bl_alloc_init_bio(int npg, sector_t isect, | |||
156 | } | 156 | } |
157 | 157 | ||
158 | if (bio) { | 158 | if (bio) { |
159 | bio->bi_sector = isect - be->be_f_offset + be->be_v_offset; | 159 | bio->bi_iter.bi_sector = isect - be->be_f_offset + |
160 | be->be_v_offset; | ||
160 | bio->bi_bdev = be->be_mdev; | 161 | bio->bi_bdev = be->be_mdev; |
161 | bio->bi_end_io = end_io; | 162 | bio->bi_end_io = end_io; |
162 | bio->bi_private = par; | 163 | bio->bi_private = par; |
@@ -201,18 +202,14 @@ static struct bio *bl_add_page_to_bio(struct bio *bio, int npg, int rw, | |||
201 | static void bl_end_io_read(struct bio *bio, int err) | 202 | static void bl_end_io_read(struct bio *bio, int err) |
202 | { | 203 | { |
203 | struct parallel_io *par = bio->bi_private; | 204 | struct parallel_io *par = bio->bi_private; |
204 | const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); | 205 | struct bio_vec *bvec; |
205 | struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; | 206 | int i; |
206 | 207 | ||
207 | do { | 208 | if (!err) |
208 | struct page *page = bvec->bv_page; | 209 | bio_for_each_segment_all(bvec, bio, i) |
210 | SetPageUptodate(bvec->bv_page); | ||
209 | 211 | ||
210 | if (--bvec >= bio->bi_io_vec) | 212 | if (err) { |
211 | prefetchw(&bvec->bv_page->flags); | ||
212 | if (uptodate) | ||
213 | SetPageUptodate(page); | ||
214 | } while (bvec >= bio->bi_io_vec); | ||
215 | if (!uptodate) { | ||
216 | struct nfs_read_data *rdata = par->data; | 213 | struct nfs_read_data *rdata = par->data; |
217 | struct nfs_pgio_header *header = rdata->header; | 214 | struct nfs_pgio_header *header = rdata->header; |
218 | 215 | ||
@@ -383,20 +380,16 @@ static void mark_extents_written(struct pnfs_block_layout *bl, | |||
383 | static void bl_end_io_write_zero(struct bio *bio, int err) | 380 | static void bl_end_io_write_zero(struct bio *bio, int err) |
384 | { | 381 | { |
385 | struct parallel_io *par = bio->bi_private; | 382 | struct parallel_io *par = bio->bi_private; |
386 | const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); | 383 | struct bio_vec *bvec; |
387 | struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; | 384 | int i; |
388 | |||
389 | do { | ||
390 | struct page *page = bvec->bv_page; | ||
391 | 385 | ||
392 | if (--bvec >= bio->bi_io_vec) | 386 | bio_for_each_segment_all(bvec, bio, i) { |
393 | prefetchw(&bvec->bv_page->flags); | ||
394 | /* This is the zeroing page we added */ | 387 | /* This is the zeroing page we added */ |
395 | end_page_writeback(page); | 388 | end_page_writeback(bvec->bv_page); |
396 | page_cache_release(page); | 389 | page_cache_release(bvec->bv_page); |
397 | } while (bvec >= bio->bi_io_vec); | 390 | } |
398 | 391 | ||
399 | if (unlikely(!uptodate)) { | 392 | if (unlikely(err)) { |
400 | struct nfs_write_data *data = par->data; | 393 | struct nfs_write_data *data = par->data; |
401 | struct nfs_pgio_header *header = data->header; | 394 | struct nfs_pgio_header *header = data->header; |
402 | 395 | ||
@@ -519,7 +512,7 @@ bl_do_readpage_sync(struct page *page, struct pnfs_block_extent *be, | |||
519 | isect = (page->index << PAGE_CACHE_SECTOR_SHIFT) + | 512 | isect = (page->index << PAGE_CACHE_SECTOR_SHIFT) + |
520 | (offset / SECTOR_SIZE); | 513 | (offset / SECTOR_SIZE); |
521 | 514 | ||
522 | bio->bi_sector = isect - be->be_f_offset + be->be_v_offset; | 515 | bio->bi_iter.bi_sector = isect - be->be_f_offset + be->be_v_offset; |
523 | bio->bi_bdev = be->be_mdev; | 516 | bio->bi_bdev = be->be_mdev; |
524 | bio->bi_end_io = bl_read_single_end_io; | 517 | bio->bi_end_io = bl_read_single_end_io; |
525 | 518 | ||