diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r-- | fs/btrfs/extent_io.c | 49 |
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 | */ |
2379 | static void end_bio_extent_writepage(struct bio *bio, int err) | 2379 | static 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 | */ |
2443 | static void end_bio_extent_readpage(struct bio *bio, int err) | 2441 | static 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 | ||
3467 | static void end_bio_extent_buffer_writepage(struct bio *bio, int err) | 3461 | static 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 | ||
3500 | static int write_one_eb(struct extent_buffer *eb, | 3491 | static int write_one_eb(struct extent_buffer *eb, |