diff options
Diffstat (limited to 'fs/btrfs')
| -rw-r--r-- | fs/btrfs/check-integrity.c | 32 | ||||
| -rw-r--r-- | fs/btrfs/check-integrity.h | 2 | ||||
| -rw-r--r-- | fs/btrfs/extent_io.c | 12 | ||||
| -rw-r--r-- | fs/btrfs/scrub.c | 33 |
4 files changed, 20 insertions, 59 deletions
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c index b50764bef141..131d82800b3a 100644 --- a/fs/btrfs/check-integrity.c +++ b/fs/btrfs/check-integrity.c | |||
| @@ -333,7 +333,6 @@ static void btrfsic_release_block_ctx(struct btrfsic_block_data_ctx *block_ctx); | |||
| 333 | static int btrfsic_read_block(struct btrfsic_state *state, | 333 | static int btrfsic_read_block(struct btrfsic_state *state, |
| 334 | struct btrfsic_block_data_ctx *block_ctx); | 334 | struct btrfsic_block_data_ctx *block_ctx); |
| 335 | static void btrfsic_dump_database(struct btrfsic_state *state); | 335 | static void btrfsic_dump_database(struct btrfsic_state *state); |
| 336 | static void btrfsic_complete_bio_end_io(struct bio *bio, int err); | ||
| 337 | static int btrfsic_test_for_metadata(struct btrfsic_state *state, | 336 | static int btrfsic_test_for_metadata(struct btrfsic_state *state, |
| 338 | char **datav, unsigned int num_pages); | 337 | char **datav, unsigned int num_pages); |
| 339 | static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, | 338 | static void btrfsic_process_written_block(struct btrfsic_dev_state *dev_state, |
| @@ -1687,7 +1686,6 @@ static int btrfsic_read_block(struct btrfsic_state *state, | |||
| 1687 | for (i = 0; i < num_pages;) { | 1686 | for (i = 0; i < num_pages;) { |
| 1688 | struct bio *bio; | 1687 | struct bio *bio; |
| 1689 | unsigned int j; | 1688 | unsigned int j; |
| 1690 | DECLARE_COMPLETION_ONSTACK(complete); | ||
| 1691 | 1689 | ||
| 1692 | bio = btrfs_io_bio_alloc(GFP_NOFS, num_pages - i); | 1690 | bio = btrfs_io_bio_alloc(GFP_NOFS, num_pages - i); |
| 1693 | if (!bio) { | 1691 | if (!bio) { |
| @@ -1698,8 +1696,6 @@ static int btrfsic_read_block(struct btrfsic_state *state, | |||
| 1698 | } | 1696 | } |
| 1699 | bio->bi_bdev = block_ctx->dev->bdev; | 1697 | bio->bi_bdev = block_ctx->dev->bdev; |
| 1700 | bio->bi_sector = dev_bytenr >> 9; | 1698 | bio->bi_sector = dev_bytenr >> 9; |
| 1701 | bio->bi_end_io = btrfsic_complete_bio_end_io; | ||
| 1702 | bio->bi_private = &complete; | ||
| 1703 | 1699 | ||
| 1704 | for (j = i; j < num_pages; j++) { | 1700 | for (j = i; j < num_pages; j++) { |
| 1705 | ret = bio_add_page(bio, block_ctx->pagev[j], | 1701 | ret = bio_add_page(bio, block_ctx->pagev[j], |
| @@ -1712,12 +1708,7 @@ static int btrfsic_read_block(struct btrfsic_state *state, | |||
| 1712 | "btrfsic: error, failed to add a single page!\n"); | 1708 | "btrfsic: error, failed to add a single page!\n"); |
| 1713 | return -1; | 1709 | return -1; |
| 1714 | } | 1710 | } |
| 1715 | submit_bio(READ, bio); | 1711 | if (submit_bio_wait(READ, bio)) { |
| 1716 | |||
| 1717 | /* this will also unplug the queue */ | ||
| 1718 | wait_for_completion(&complete); | ||
| 1719 | |||
| 1720 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { | ||
| 1721 | printk(KERN_INFO | 1712 | printk(KERN_INFO |
| 1722 | "btrfsic: read error at logical %llu dev %s!\n", | 1713 | "btrfsic: read error at logical %llu dev %s!\n", |
| 1723 | block_ctx->start, block_ctx->dev->name); | 1714 | block_ctx->start, block_ctx->dev->name); |
| @@ -1740,11 +1731,6 @@ static int btrfsic_read_block(struct btrfsic_state *state, | |||
| 1740 | return block_ctx->len; | 1731 | return block_ctx->len; |
| 1741 | } | 1732 | } |
| 1742 | 1733 | ||
| 1743 | static void btrfsic_complete_bio_end_io(struct bio *bio, int err) | ||
| 1744 | { | ||
| 1745 | complete((struct completion *)bio->bi_private); | ||
| 1746 | } | ||
| 1747 | |||
| 1748 | static void btrfsic_dump_database(struct btrfsic_state *state) | 1734 | static void btrfsic_dump_database(struct btrfsic_state *state) |
| 1749 | { | 1735 | { |
| 1750 | struct list_head *elem_all; | 1736 | struct list_head *elem_all; |
| @@ -3008,14 +2994,12 @@ int btrfsic_submit_bh(int rw, struct buffer_head *bh) | |||
| 3008 | return submit_bh(rw, bh); | 2994 | return submit_bh(rw, bh); |
| 3009 | } | 2995 | } |
| 3010 | 2996 | ||
| 3011 | void btrfsic_submit_bio(int rw, struct bio *bio) | 2997 | static void __btrfsic_submit_bio(int rw, struct bio *bio) |
| 3012 | { | 2998 | { |
| 3013 | struct btrfsic_dev_state *dev_state; | 2999 | struct btrfsic_dev_state *dev_state; |
| 3014 | 3000 | ||
| 3015 | if (!btrfsic_is_initialized) { | 3001 | if (!btrfsic_is_initialized) |
| 3016 | submit_bio(rw, bio); | ||
| 3017 | return; | 3002 | return; |
| 3018 | } | ||
| 3019 | 3003 | ||
| 3020 | mutex_lock(&btrfsic_mutex); | 3004 | mutex_lock(&btrfsic_mutex); |
| 3021 | /* since btrfsic_submit_bio() is also called before | 3005 | /* since btrfsic_submit_bio() is also called before |
| @@ -3106,10 +3090,20 @@ void btrfsic_submit_bio(int rw, struct bio *bio) | |||
| 3106 | } | 3090 | } |
| 3107 | leave: | 3091 | leave: |
| 3108 | mutex_unlock(&btrfsic_mutex); | 3092 | mutex_unlock(&btrfsic_mutex); |
| 3093 | } | ||
| 3109 | 3094 | ||
| 3095 | void btrfsic_submit_bio(int rw, struct bio *bio) | ||
| 3096 | { | ||
| 3097 | __btrfsic_submit_bio(rw, bio); | ||
| 3110 | submit_bio(rw, bio); | 3098 | submit_bio(rw, bio); |
| 3111 | } | 3099 | } |
| 3112 | 3100 | ||
| 3101 | int btrfsic_submit_bio_wait(int rw, struct bio *bio) | ||
| 3102 | { | ||
| 3103 | __btrfsic_submit_bio(rw, bio); | ||
| 3104 | return submit_bio_wait(rw, bio); | ||
| 3105 | } | ||
| 3106 | |||
| 3113 | int btrfsic_mount(struct btrfs_root *root, | 3107 | int btrfsic_mount(struct btrfs_root *root, |
| 3114 | struct btrfs_fs_devices *fs_devices, | 3108 | struct btrfs_fs_devices *fs_devices, |
| 3115 | int including_extent_data, u32 print_mask) | 3109 | int including_extent_data, u32 print_mask) |
diff --git a/fs/btrfs/check-integrity.h b/fs/btrfs/check-integrity.h index 8b59175cc502..13b8566c97ab 100644 --- a/fs/btrfs/check-integrity.h +++ b/fs/btrfs/check-integrity.h | |||
| @@ -22,9 +22,11 @@ | |||
| 22 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY | 22 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY |
| 23 | int btrfsic_submit_bh(int rw, struct buffer_head *bh); | 23 | int btrfsic_submit_bh(int rw, struct buffer_head *bh); |
| 24 | void btrfsic_submit_bio(int rw, struct bio *bio); | 24 | void btrfsic_submit_bio(int rw, struct bio *bio); |
| 25 | int btrfsic_submit_bio_wait(int rw, struct bio *bio); | ||
| 25 | #else | 26 | #else |
| 26 | #define btrfsic_submit_bh submit_bh | 27 | #define btrfsic_submit_bh submit_bh |
| 27 | #define btrfsic_submit_bio submit_bio | 28 | #define btrfsic_submit_bio submit_bio |
| 29 | #define btrfsic_submit_bio_wait submit_bio_wait | ||
| 28 | #endif | 30 | #endif |
| 29 | 31 | ||
| 30 | int btrfsic_mount(struct btrfs_root *root, | 32 | int btrfsic_mount(struct btrfs_root *root, |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 8e457fca0a0b..ff43802a7c88 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -1952,11 +1952,6 @@ static int free_io_failure(struct inode *inode, struct io_failure_record *rec, | |||
| 1952 | return err; | 1952 | return err; |
| 1953 | } | 1953 | } |
| 1954 | 1954 | ||
| 1955 | static void repair_io_failure_callback(struct bio *bio, int err) | ||
| 1956 | { | ||
| 1957 | complete(bio->bi_private); | ||
| 1958 | } | ||
| 1959 | |||
| 1960 | /* | 1955 | /* |
| 1961 | * this bypasses the standard btrfs submit functions deliberately, as | 1956 | * this bypasses the standard btrfs submit functions deliberately, as |
| 1962 | * the standard behavior is to write all copies in a raid setup. here we only | 1957 | * the standard behavior is to write all copies in a raid setup. here we only |
| @@ -1973,7 +1968,6 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start, | |||
| 1973 | { | 1968 | { |
| 1974 | struct bio *bio; | 1969 | struct bio *bio; |
| 1975 | struct btrfs_device *dev; | 1970 | struct btrfs_device *dev; |
| 1976 | DECLARE_COMPLETION_ONSTACK(compl); | ||
| 1977 | u64 map_length = 0; | 1971 | u64 map_length = 0; |
| 1978 | u64 sector; | 1972 | u64 sector; |
| 1979 | struct btrfs_bio *bbio = NULL; | 1973 | struct btrfs_bio *bbio = NULL; |
| @@ -1990,8 +1984,6 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start, | |||
| 1990 | bio = btrfs_io_bio_alloc(GFP_NOFS, 1); | 1984 | bio = btrfs_io_bio_alloc(GFP_NOFS, 1); |
| 1991 | if (!bio) | 1985 | if (!bio) |
| 1992 | return -EIO; | 1986 | return -EIO; |
| 1993 | bio->bi_private = &compl; | ||
| 1994 | bio->bi_end_io = repair_io_failure_callback; | ||
| 1995 | bio->bi_size = 0; | 1987 | bio->bi_size = 0; |
| 1996 | map_length = length; | 1988 | map_length = length; |
| 1997 | 1989 | ||
| @@ -2012,10 +2004,8 @@ int repair_io_failure(struct btrfs_fs_info *fs_info, u64 start, | |||
| 2012 | } | 2004 | } |
| 2013 | bio->bi_bdev = dev->bdev; | 2005 | bio->bi_bdev = dev->bdev; |
| 2014 | bio_add_page(bio, page, length, start - page_offset(page)); | 2006 | bio_add_page(bio, page, length, start - page_offset(page)); |
| 2015 | btrfsic_submit_bio(WRITE_SYNC, bio); | ||
| 2016 | wait_for_completion(&compl); | ||
| 2017 | 2007 | ||
| 2018 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { | 2008 | if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) { |
| 2019 | /* try to remap that extent elsewhere? */ | 2009 | /* try to remap that extent elsewhere? */ |
| 2020 | bio_put(bio); | 2010 | bio_put(bio); |
| 2021 | btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); | 2011 | btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 561e2f16ba3e..1fd3f33c330a 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
| @@ -208,7 +208,6 @@ static void scrub_recheck_block_checksum(struct btrfs_fs_info *fs_info, | |||
| 208 | int is_metadata, int have_csum, | 208 | int is_metadata, int have_csum, |
| 209 | const u8 *csum, u64 generation, | 209 | const u8 *csum, u64 generation, |
| 210 | u16 csum_size); | 210 | u16 csum_size); |
| 211 | static void scrub_complete_bio_end_io(struct bio *bio, int err); | ||
| 212 | static int scrub_repair_block_from_good_copy(struct scrub_block *sblock_bad, | 211 | static int scrub_repair_block_from_good_copy(struct scrub_block *sblock_bad, |
| 213 | struct scrub_block *sblock_good, | 212 | struct scrub_block *sblock_good, |
| 214 | int force_write); | 213 | int force_write); |
| @@ -1294,7 +1293,6 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, | |||
| 1294 | for (page_num = 0; page_num < sblock->page_count; page_num++) { | 1293 | for (page_num = 0; page_num < sblock->page_count; page_num++) { |
| 1295 | struct bio *bio; | 1294 | struct bio *bio; |
| 1296 | struct scrub_page *page = sblock->pagev[page_num]; | 1295 | struct scrub_page *page = sblock->pagev[page_num]; |
| 1297 | DECLARE_COMPLETION_ONSTACK(complete); | ||
| 1298 | 1296 | ||
| 1299 | if (page->dev->bdev == NULL) { | 1297 | if (page->dev->bdev == NULL) { |
| 1300 | page->io_error = 1; | 1298 | page->io_error = 1; |
| @@ -1311,18 +1309,11 @@ static void scrub_recheck_block(struct btrfs_fs_info *fs_info, | |||
| 1311 | } | 1309 | } |
| 1312 | bio->bi_bdev = page->dev->bdev; | 1310 | bio->bi_bdev = page->dev->bdev; |
| 1313 | bio->bi_sector = page->physical >> 9; | 1311 | bio->bi_sector = page->physical >> 9; |
| 1314 | bio->bi_end_io = scrub_complete_bio_end_io; | ||
| 1315 | bio->bi_private = &complete; | ||
| 1316 | 1312 | ||
| 1317 | bio_add_page(bio, page->page, PAGE_SIZE, 0); | 1313 | bio_add_page(bio, page->page, PAGE_SIZE, 0); |
| 1318 | btrfsic_submit_bio(READ, bio); | 1314 | if (btrfsic_submit_bio_wait(READ, bio)) |
| 1319 | |||
| 1320 | /* this will also unplug the queue */ | ||
| 1321 | wait_for_completion(&complete); | ||
| 1322 | |||
| 1323 | page->io_error = !test_bit(BIO_UPTODATE, &bio->bi_flags); | ||
| 1324 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) | ||
| 1325 | sblock->no_io_error_seen = 0; | 1315 | sblock->no_io_error_seen = 0; |
| 1316 | |||
| 1326 | bio_put(bio); | 1317 | bio_put(bio); |
| 1327 | } | 1318 | } |
| 1328 | 1319 | ||
| @@ -1391,11 +1382,6 @@ static void scrub_recheck_block_checksum(struct btrfs_fs_info *fs_info, | |||
| 1391 | sblock->checksum_error = 1; | 1382 | sblock->checksum_error = 1; |
| 1392 | } | 1383 | } |
| 1393 | 1384 | ||
| 1394 | static void scrub_complete_bio_end_io(struct bio *bio, int err) | ||
| 1395 | { | ||
| 1396 | complete((struct completion *)bio->bi_private); | ||
| 1397 | } | ||
| 1398 | |||
| 1399 | static int scrub_repair_block_from_good_copy(struct scrub_block *sblock_bad, | 1385 | static int scrub_repair_block_from_good_copy(struct scrub_block *sblock_bad, |
| 1400 | struct scrub_block *sblock_good, | 1386 | struct scrub_block *sblock_good, |
| 1401 | int force_write) | 1387 | int force_write) |
| @@ -1430,7 +1416,6 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, | |||
| 1430 | sblock_bad->checksum_error || page_bad->io_error) { | 1416 | sblock_bad->checksum_error || page_bad->io_error) { |
| 1431 | struct bio *bio; | 1417 | struct bio *bio; |
| 1432 | int ret; | 1418 | int ret; |
| 1433 | DECLARE_COMPLETION_ONSTACK(complete); | ||
| 1434 | 1419 | ||
| 1435 | if (!page_bad->dev->bdev) { | 1420 | if (!page_bad->dev->bdev) { |
| 1436 | printk_ratelimited(KERN_WARNING | 1421 | printk_ratelimited(KERN_WARNING |
| @@ -1443,19 +1428,14 @@ static int scrub_repair_page_from_good_copy(struct scrub_block *sblock_bad, | |||
| 1443 | return -EIO; | 1428 | return -EIO; |
| 1444 | bio->bi_bdev = page_bad->dev->bdev; | 1429 | bio->bi_bdev = page_bad->dev->bdev; |
| 1445 | bio->bi_sector = page_bad->physical >> 9; | 1430 | bio->bi_sector = page_bad->physical >> 9; |
| 1446 | bio->bi_end_io = scrub_complete_bio_end_io; | ||
| 1447 | bio->bi_private = &complete; | ||
| 1448 | 1431 | ||
| 1449 | ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0); | 1432 | ret = bio_add_page(bio, page_good->page, PAGE_SIZE, 0); |
| 1450 | if (PAGE_SIZE != ret) { | 1433 | if (PAGE_SIZE != ret) { |
| 1451 | bio_put(bio); | 1434 | bio_put(bio); |
| 1452 | return -EIO; | 1435 | return -EIO; |
| 1453 | } | 1436 | } |
| 1454 | btrfsic_submit_bio(WRITE, bio); | ||
| 1455 | 1437 | ||
| 1456 | /* this will also unplug the queue */ | 1438 | if (btrfsic_submit_bio_wait(WRITE, bio)) { |
| 1457 | wait_for_completion(&complete); | ||
| 1458 | if (!bio_flagged(bio, BIO_UPTODATE)) { | ||
| 1459 | btrfs_dev_stat_inc_and_print(page_bad->dev, | 1439 | btrfs_dev_stat_inc_and_print(page_bad->dev, |
| 1460 | BTRFS_DEV_STAT_WRITE_ERRS); | 1440 | BTRFS_DEV_STAT_WRITE_ERRS); |
| 1461 | btrfs_dev_replace_stats_inc( | 1441 | btrfs_dev_replace_stats_inc( |
| @@ -3375,7 +3355,6 @@ static int write_page_nocow(struct scrub_ctx *sctx, | |||
| 3375 | struct bio *bio; | 3355 | struct bio *bio; |
| 3376 | struct btrfs_device *dev; | 3356 | struct btrfs_device *dev; |
| 3377 | int ret; | 3357 | int ret; |
| 3378 | DECLARE_COMPLETION_ONSTACK(compl); | ||
| 3379 | 3358 | ||
| 3380 | dev = sctx->wr_ctx.tgtdev; | 3359 | dev = sctx->wr_ctx.tgtdev; |
| 3381 | if (!dev) | 3360 | if (!dev) |
| @@ -3392,8 +3371,6 @@ static int write_page_nocow(struct scrub_ctx *sctx, | |||
| 3392 | spin_unlock(&sctx->stat_lock); | 3371 | spin_unlock(&sctx->stat_lock); |
| 3393 | return -ENOMEM; | 3372 | return -ENOMEM; |
| 3394 | } | 3373 | } |
| 3395 | bio->bi_private = &compl; | ||
| 3396 | bio->bi_end_io = scrub_complete_bio_end_io; | ||
| 3397 | bio->bi_size = 0; | 3374 | bio->bi_size = 0; |
| 3398 | bio->bi_sector = physical_for_dev_replace >> 9; | 3375 | bio->bi_sector = physical_for_dev_replace >> 9; |
| 3399 | bio->bi_bdev = dev->bdev; | 3376 | bio->bi_bdev = dev->bdev; |
| @@ -3404,10 +3381,8 @@ leave_with_eio: | |||
| 3404 | btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); | 3381 | btrfs_dev_stat_inc_and_print(dev, BTRFS_DEV_STAT_WRITE_ERRS); |
| 3405 | return -EIO; | 3382 | return -EIO; |
| 3406 | } | 3383 | } |
| 3407 | btrfsic_submit_bio(WRITE_SYNC, bio); | ||
| 3408 | wait_for_completion(&compl); | ||
| 3409 | 3384 | ||
| 3410 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) | 3385 | if (btrfsic_submit_bio_wait(WRITE_SYNC, bio)) |
| 3411 | goto leave_with_eio; | 3386 | goto leave_with_eio; |
| 3412 | 3387 | ||
| 3413 | bio_put(bio); | 3388 | bio_put(bio); |
