diff options
Diffstat (limited to 'fs/btrfs/scrub.c')
-rw-r--r-- | fs/btrfs/scrub.c | 30 |
1 files changed, 9 insertions, 21 deletions
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index b223620cd5a6..27892f67e69b 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
@@ -352,13 +352,14 @@ static void scrub_print_warning(const char *errstr, struct scrub_block *sblock) | |||
352 | struct extent_buffer *eb; | 352 | struct extent_buffer *eb; |
353 | struct btrfs_extent_item *ei; | 353 | struct btrfs_extent_item *ei; |
354 | struct scrub_warning swarn; | 354 | struct scrub_warning swarn; |
355 | u32 item_size; | 355 | unsigned long ptr = 0; |
356 | int ret; | 356 | u64 extent_item_pos; |
357 | u64 flags = 0; | ||
357 | u64 ref_root; | 358 | u64 ref_root; |
359 | u32 item_size; | ||
358 | u8 ref_level; | 360 | u8 ref_level; |
359 | unsigned long ptr = 0; | ||
360 | const int bufsize = 4096; | 361 | const int bufsize = 4096; |
361 | u64 extent_item_pos; | 362 | int ret; |
362 | 363 | ||
363 | path = btrfs_alloc_path(); | 364 | path = btrfs_alloc_path(); |
364 | 365 | ||
@@ -375,7 +376,8 @@ static void scrub_print_warning(const char *errstr, struct scrub_block *sblock) | |||
375 | if (!path || !swarn.scratch_buf || !swarn.msg_buf) | 376 | if (!path || !swarn.scratch_buf || !swarn.msg_buf) |
376 | goto out; | 377 | goto out; |
377 | 378 | ||
378 | ret = extent_from_logical(fs_info, swarn.logical, path, &found_key); | 379 | ret = extent_from_logical(fs_info, swarn.logical, path, &found_key, |
380 | &flags); | ||
379 | if (ret < 0) | 381 | if (ret < 0) |
380 | goto out; | 382 | goto out; |
381 | 383 | ||
@@ -387,7 +389,7 @@ static void scrub_print_warning(const char *errstr, struct scrub_block *sblock) | |||
387 | item_size = btrfs_item_size_nr(eb, path->slots[0]); | 389 | item_size = btrfs_item_size_nr(eb, path->slots[0]); |
388 | btrfs_release_path(path); | 390 | btrfs_release_path(path); |
389 | 391 | ||
390 | if (ret & BTRFS_EXTENT_FLAG_TREE_BLOCK) { | 392 | if (flags & BTRFS_EXTENT_FLAG_TREE_BLOCK) { |
391 | do { | 393 | do { |
392 | ret = tree_backref_for_extent(&ptr, eb, ei, item_size, | 394 | ret = tree_backref_for_extent(&ptr, eb, ei, item_size, |
393 | &ref_root, &ref_level); | 395 | &ref_root, &ref_level); |
@@ -1029,6 +1031,7 @@ static int scrub_setup_recheck_block(struct scrub_dev *sdev, | |||
1029 | spin_lock(&sdev->stat_lock); | 1031 | spin_lock(&sdev->stat_lock); |
1030 | sdev->stat.malloc_errors++; | 1032 | sdev->stat.malloc_errors++; |
1031 | spin_unlock(&sdev->stat_lock); | 1033 | spin_unlock(&sdev->stat_lock); |
1034 | kfree(bbio); | ||
1032 | return -ENOMEM; | 1035 | return -ENOMEM; |
1033 | } | 1036 | } |
1034 | sblock->page_count++; | 1037 | sblock->page_count++; |
@@ -1666,21 +1669,6 @@ static void scrub_bio_end_io_worker(struct btrfs_work *work) | |||
1666 | scrub_block_put(sblock); | 1669 | scrub_block_put(sblock); |
1667 | } | 1670 | } |
1668 | 1671 | ||
1669 | if (sbio->err) { | ||
1670 | /* what is this good for??? */ | ||
1671 | sbio->bio->bi_flags &= ~(BIO_POOL_MASK - 1); | ||
1672 | sbio->bio->bi_flags |= 1 << BIO_UPTODATE; | ||
1673 | sbio->bio->bi_phys_segments = 0; | ||
1674 | sbio->bio->bi_idx = 0; | ||
1675 | |||
1676 | for (i = 0; i < sbio->page_count; i++) { | ||
1677 | struct bio_vec *bi; | ||
1678 | bi = &sbio->bio->bi_io_vec[i]; | ||
1679 | bi->bv_offset = 0; | ||
1680 | bi->bv_len = PAGE_SIZE; | ||
1681 | } | ||
1682 | } | ||
1683 | |||
1684 | bio_put(sbio->bio); | 1672 | bio_put(sbio->bio); |
1685 | sbio->bio = NULL; | 1673 | sbio->bio = NULL; |
1686 | spin_lock(&sdev->list_lock); | 1674 | spin_lock(&sdev->list_lock); |