diff options
Diffstat (limited to 'fs/btrfs')
| -rw-r--r-- | fs/btrfs/scrub.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 2d1f8909a8e1..1204eab94028 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
| @@ -348,9 +348,6 @@ static int scrub_fixup_io(int rw, struct block_device *bdev, sector_t sector, | |||
| 348 | int ret; | 348 | int ret; |
| 349 | DECLARE_COMPLETION_ONSTACK(complete); | 349 | DECLARE_COMPLETION_ONSTACK(complete); |
| 350 | 350 | ||
| 351 | /* we are going to wait on this IO */ | ||
| 352 | rw |= REQ_SYNC; | ||
| 353 | |||
| 354 | bio = bio_alloc(GFP_NOFS, 1); | 351 | bio = bio_alloc(GFP_NOFS, 1); |
| 355 | bio->bi_bdev = bdev; | 352 | bio->bi_bdev = bdev; |
| 356 | bio->bi_sector = sector; | 353 | bio->bi_sector = sector; |
| @@ -359,6 +356,7 @@ static int scrub_fixup_io(int rw, struct block_device *bdev, sector_t sector, | |||
| 359 | bio->bi_private = &complete; | 356 | bio->bi_private = &complete; |
| 360 | submit_bio(rw, bio); | 357 | submit_bio(rw, bio); |
| 361 | 358 | ||
| 359 | /* this will also unplug the queue */ | ||
| 362 | wait_for_completion(&complete); | 360 | wait_for_completion(&complete); |
| 363 | 361 | ||
| 364 | ret = !test_bit(BIO_UPTODATE, &bio->bi_flags); | 362 | ret = !test_bit(BIO_UPTODATE, &bio->bi_flags); |
| @@ -743,6 +741,7 @@ static noinline_for_stack int scrub_stripe(struct scrub_dev *sdev, | |||
| 743 | struct btrfs_root *root = fs_info->extent_root; | 741 | struct btrfs_root *root = fs_info->extent_root; |
| 744 | struct btrfs_root *csum_root = fs_info->csum_root; | 742 | struct btrfs_root *csum_root = fs_info->csum_root; |
| 745 | struct btrfs_extent_item *extent; | 743 | struct btrfs_extent_item *extent; |
| 744 | struct blk_plug plug; | ||
| 746 | u64 flags; | 745 | u64 flags; |
| 747 | int ret; | 746 | int ret; |
| 748 | int slot; | 747 | int slot; |
| @@ -847,6 +846,7 @@ static noinline_for_stack int scrub_stripe(struct scrub_dev *sdev, | |||
| 847 | * the scrub. This might currently (crc32) end up to be about 1MB | 846 | * the scrub. This might currently (crc32) end up to be about 1MB |
| 848 | */ | 847 | */ |
| 849 | start_stripe = 0; | 848 | start_stripe = 0; |
| 849 | blk_start_plug(&plug); | ||
| 850 | again: | 850 | again: |
| 851 | logical = base + offset + start_stripe * increment; | 851 | logical = base + offset + start_stripe * increment; |
| 852 | for (i = start_stripe; i < nstripes; ++i) { | 852 | for (i = start_stripe; i < nstripes; ++i) { |
| @@ -988,6 +988,7 @@ next: | |||
| 988 | scrub_submit(sdev); | 988 | scrub_submit(sdev); |
| 989 | 989 | ||
| 990 | out: | 990 | out: |
| 991 | blk_finish_plug(&plug); | ||
| 991 | btrfs_free_path(path); | 992 | btrfs_free_path(path); |
| 992 | return ret < 0 ? ret : 0; | 993 | return ret < 0 ? ret : 0; |
| 993 | } | 994 | } |
