aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_io.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r--fs/btrfs/extent_io.c49
1 files changed, 20 insertions, 29 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index fd78c84821c8..ae69a00387e7 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2029,7 +2029,7 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start,
2029 bio = btrfs_io_bio_alloc(GFP_NOFS, 1); 2029 bio = btrfs_io_bio_alloc(GFP_NOFS, 1);
2030 if (!bio) 2030 if (!bio)
2031 return -EIO; 2031 return -EIO;
2032 bio->bi_size = 0; 2032 bio->bi_iter.bi_size = 0;
2033 map_length = length; 2033 map_length = length;
2034 2034
2035 ret = btrfs_map_block(fs_info, WRITE, logical, 2035 ret = btrfs_map_block(fs_info, WRITE, logical,
@@ -2040,7 +2040,7 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start,
2040 } 2040 }
2041 BUG_ON(mirror_num != bbio->mirror_num); 2041 BUG_ON(mirror_num != bbio->mirror_num);
2042 sector = bbio->stripes[mirror_num-1].physical >> 9; 2042 sector = bbio->stripes[mirror_num-1].physical >> 9;
2043 bio->bi_sector = sector; 2043 bio->bi_iter.bi_sector = sector;
2044 dev = bbio->stripes[mirror_num-1].dev; 2044 dev = bbio->stripes[mirror_num-1].dev;
2045 kfree(bbio); 2045 kfree(bbio);
2046 if (!dev || !dev->bdev || !dev->writeable) { 2046 if (!dev || !dev->bdev || !dev->writeable) {
@@ -2314,9 +2314,9 @@ static int bio_readpage_error(struct bio *failed_bio, u64 phy_offset,
2314 return -EIO; 2314 return -EIO;
2315 } 2315 }
2316 bio->bi_end_io = failed_bio->bi_end_io; 2316 bio->bi_end_io = failed_bio->bi_end_io;
2317 bio->bi_sector = failrec->logical >> 9; 2317 bio->bi_iter.bi_sector = failrec->logical >> 9;
2318 bio->bi_bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev; 2318 bio->bi_bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev;
2319 bio->bi_size = 0; 2319 bio->bi_iter.bi_size = 0;
2320 2320
2321 btrfs_failed_bio = btrfs_io_bio(failed_bio); 2321 btrfs_failed_bio = btrfs_io_bio(failed_bio);
2322 if (btrfs_failed_bio->csum) { 2322 if (btrfs_failed_bio->csum) {
@@ -2378,11 +2378,12 @@ int end_extent_writepage(struct page *page, int err, u64 start, u64 end)
2378 */ 2378 */
2379static void end_bio_extent_writepage(struct bio *bio, int err) 2379static void end_bio_extent_writepage(struct bio *bio, int err)
2380{ 2380{
2381 struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; 2381 struct bio_vec *bvec;
2382 u64 start; 2382 u64 start;
2383 u64 end; 2383 u64 end;
2384 int i;
2384 2385
2385 do { 2386 bio_for_each_segment_all(bvec, bio, i) {
2386 struct page *page = bvec->bv_page; 2387 struct page *page = bvec->bv_page;
2387 2388
2388 /* We always issue full-page reads, but if some block 2389 /* We always issue full-page reads, but if some block
@@ -2405,14 +2406,11 @@ static void end_bio_extent_writepage(struct bio *bio, int err)
2405 start = page_offset(page); 2406 start = page_offset(page);
2406 end = start + bvec->bv_offset + bvec->bv_len - 1; 2407 end = start + bvec->bv_offset + bvec->bv_len - 1;
2407 2408
2408 if (--bvec >= bio->bi_io_vec)
2409 prefetchw(&bvec->bv_page->flags);
2410
2411 if (end_extent_writepage(page, err, start, end)) 2409 if (end_extent_writepage(page, err, start, end))
2412 continue; 2410 continue;
2413 2411
2414 end_page_writeback(page); 2412 end_page_writeback(page);
2415 } while (bvec >= bio->bi_io_vec); 2413 }
2416 2414
2417 bio_put(bio); 2415 bio_put(bio);
2418} 2416}
@@ -2442,9 +2440,8 @@ endio_readpage_release_extent(struct extent_io_tree *tree, u64 start, u64 len,
2442 */ 2440 */
2443static void end_bio_extent_readpage(struct bio *bio, int err) 2441static void end_bio_extent_readpage(struct bio *bio, int err)
2444{ 2442{
2443 struct bio_vec *bvec;
2445 int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); 2444 int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
2446 struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1;
2447 struct bio_vec *bvec = bio->bi_io_vec;
2448 struct btrfs_io_bio *io_bio = btrfs_io_bio(bio); 2445 struct btrfs_io_bio *io_bio = btrfs_io_bio(bio);
2449 struct extent_io_tree *tree; 2446 struct extent_io_tree *tree;
2450 u64 offset = 0; 2447 u64 offset = 0;
@@ -2455,16 +2452,17 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
2455 u64 extent_len = 0; 2452 u64 extent_len = 0;
2456 int mirror; 2453 int mirror;
2457 int ret; 2454 int ret;
2455 int i;
2458 2456
2459 if (err) 2457 if (err)
2460 uptodate = 0; 2458 uptodate = 0;
2461 2459
2462 do { 2460 bio_for_each_segment_all(bvec, bio, i) {
2463 struct page *page = bvec->bv_page; 2461 struct page *page = bvec->bv_page;
2464 struct inode *inode = page->mapping->host; 2462 struct inode *inode = page->mapping->host;
2465 2463
2466 pr_debug("end_bio_extent_readpage: bi_sector=%llu, err=%d, " 2464 pr_debug("end_bio_extent_readpage: bi_sector=%llu, err=%d, "
2467 "mirror=%lu\n", (u64)bio->bi_sector, err, 2465 "mirror=%lu\n", (u64)bio->bi_iter.bi_sector, err,
2468 io_bio->mirror_num); 2466 io_bio->mirror_num);
2469 tree = &BTRFS_I(inode)->io_tree; 2467 tree = &BTRFS_I(inode)->io_tree;
2470 2468
@@ -2489,9 +2487,6 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
2489 end = start + bvec->bv_offset + bvec->bv_len - 1; 2487 end = start + bvec->bv_offset + bvec->bv_len - 1;
2490 len = bvec->bv_len; 2488 len = bvec->bv_len;
2491 2489
2492 if (++bvec <= bvec_end)
2493 prefetchw(&bvec->bv_page->flags);
2494
2495 mirror = io_bio->mirror_num; 2490 mirror = io_bio->mirror_num;
2496 if (likely(uptodate && tree->ops && 2491 if (likely(uptodate && tree->ops &&
2497 tree->ops->readpage_end_io_hook)) { 2492 tree->ops->readpage_end_io_hook)) {
@@ -2572,7 +2567,7 @@ readpage_ok:
2572 extent_start = start; 2567 extent_start = start;
2573 extent_len = end + 1 - start; 2568 extent_len = end + 1 - start;
2574 } 2569 }
2575 } while (bvec <= bvec_end); 2570 }
2576 2571
2577 if (extent_len) 2572 if (extent_len)
2578 endio_readpage_release_extent(tree, extent_start, extent_len, 2573 endio_readpage_release_extent(tree, extent_start, extent_len,
@@ -2603,9 +2598,8 @@ btrfs_bio_alloc(struct block_device *bdev, u64 first_sector, int nr_vecs,
2603 } 2598 }
2604 2599
2605 if (bio) { 2600 if (bio) {
2606 bio->bi_size = 0;
2607 bio->bi_bdev = bdev; 2601 bio->bi_bdev = bdev;
2608 bio->bi_sector = first_sector; 2602 bio->bi_iter.bi_sector = first_sector;
2609 btrfs_bio = btrfs_io_bio(bio); 2603 btrfs_bio = btrfs_io_bio(bio);
2610 btrfs_bio->csum = NULL; 2604 btrfs_bio->csum = NULL;
2611 btrfs_bio->csum_allocated = NULL; 2605 btrfs_bio->csum_allocated = NULL;
@@ -2699,7 +2693,7 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree,
2699 if (bio_ret && *bio_ret) { 2693 if (bio_ret && *bio_ret) {
2700 bio = *bio_ret; 2694 bio = *bio_ret;
2701 if (old_compressed) 2695 if (old_compressed)
2702 contig = bio->bi_sector == sector; 2696 contig = bio->bi_iter.bi_sector == sector;
2703 else 2697 else
2704 contig = bio_end_sector(bio) == sector; 2698 contig = bio_end_sector(bio) == sector;
2705 2699
@@ -3466,20 +3460,18 @@ static void end_extent_buffer_writeback(struct extent_buffer *eb)
3466 3460
3467static void end_bio_extent_buffer_writepage(struct bio *bio, int err) 3461static void end_bio_extent_buffer_writepage(struct bio *bio, int err)
3468{ 3462{
3469 int uptodate = err == 0; 3463 struct bio_vec *bvec;
3470 struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
3471 struct extent_buffer *eb; 3464 struct extent_buffer *eb;
3472 int done; 3465 int i, done;
3473 3466
3474 do { 3467 bio_for_each_segment_all(bvec, bio, i) {
3475 struct page *page = bvec->bv_page; 3468 struct page *page = bvec->bv_page;
3476 3469
3477 bvec--;
3478 eb = (struct extent_buffer *)page->private; 3470 eb = (struct extent_buffer *)page->private;
3479 BUG_ON(!eb); 3471 BUG_ON(!eb);
3480 done = atomic_dec_and_test(&eb->io_pages); 3472 done = atomic_dec_and_test(&eb->io_pages);
3481 3473
3482 if (!uptodate || test_bit(EXTENT_BUFFER_IOERR, &eb->bflags)) { 3474 if (err || test_bit(EXTENT_BUFFER_IOERR, &eb->bflags)) {
3483 set_bit(EXTENT_BUFFER_IOERR, &eb->bflags); 3475 set_bit(EXTENT_BUFFER_IOERR, &eb->bflags);
3484 ClearPageUptodate(page); 3476 ClearPageUptodate(page);
3485 SetPageError(page); 3477 SetPageError(page);
@@ -3491,10 +3483,9 @@ static void end_bio_extent_buffer_writepage(struct bio *bio, int err)
3491 continue; 3483 continue;
3492 3484
3493 end_extent_buffer_writeback(eb); 3485 end_extent_buffer_writeback(eb);
3494 } while (bvec >= bio->bi_io_vec); 3486 }
3495 3487
3496 bio_put(bio); 3488 bio_put(bio);
3497
3498} 3489}
3499 3490
3500static int write_one_eb(struct extent_buffer *eb, 3491static int write_one_eb(struct extent_buffer *eb,