diff options
-rw-r--r-- | fs/btrfs/ctree.h | 8 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 26 | ||||
-rw-r--r-- | fs/btrfs/extent_io.c | 5 | ||||
-rw-r--r-- | fs/btrfs/scrub.c | 5 | ||||
-rw-r--r-- | fs/btrfs/super.c | 39 | ||||
-rw-r--r-- | fs/btrfs/volumes.c | 7 |
6 files changed, 79 insertions, 11 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 67385033323..39f6188688e 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -971,7 +971,7 @@ struct btrfs_fs_info { | |||
971 | * is required instead of the faster short fsync log commits | 971 | * is required instead of the faster short fsync log commits |
972 | */ | 972 | */ |
973 | u64 last_trans_log_full_commit; | 973 | u64 last_trans_log_full_commit; |
974 | unsigned long mount_opt:20; | 974 | unsigned long mount_opt:21; |
975 | unsigned long compress_type:4; | 975 | unsigned long compress_type:4; |
976 | u64 max_inline; | 976 | u64 max_inline; |
977 | u64 alloc_start; | 977 | u64 alloc_start; |
@@ -1155,6 +1155,10 @@ struct btrfs_fs_info { | |||
1155 | int scrub_workers_refcnt; | 1155 | int scrub_workers_refcnt; |
1156 | struct btrfs_workers scrub_workers; | 1156 | struct btrfs_workers scrub_workers; |
1157 | 1157 | ||
1158 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY | ||
1159 | u32 check_integrity_print_mask; | ||
1160 | #endif | ||
1161 | |||
1158 | /* filesystem state */ | 1162 | /* filesystem state */ |
1159 | u64 fs_state; | 1163 | u64 fs_state; |
1160 | 1164 | ||
@@ -1413,6 +1417,8 @@ struct btrfs_ioctl_defrag_range_args { | |||
1413 | #define BTRFS_MOUNT_AUTO_DEFRAG (1 << 16) | 1417 | #define BTRFS_MOUNT_AUTO_DEFRAG (1 << 16) |
1414 | #define BTRFS_MOUNT_INODE_MAP_CACHE (1 << 17) | 1418 | #define BTRFS_MOUNT_INODE_MAP_CACHE (1 << 17) |
1415 | #define BTRFS_MOUNT_RECOVERY (1 << 18) | 1419 | #define BTRFS_MOUNT_RECOVERY (1 << 18) |
1420 | #define BTRFS_MOUNT_CHECK_INTEGRITY (1 << 19) | ||
1421 | #define BTRFS_MOUNT_CHECK_INTEGRITY_INCLUDING_EXTENT_DATA (1 << 20) | ||
1416 | 1422 | ||
1417 | #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt) | 1423 | #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt) |
1418 | #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) | 1424 | #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 3f9d5551e58..f363c6d9c3d 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include "tree-log.h" | 43 | #include "tree-log.h" |
44 | #include "free-space-cache.h" | 44 | #include "free-space-cache.h" |
45 | #include "inode-map.h" | 45 | #include "inode-map.h" |
46 | #include "check-integrity.h" | ||
46 | 47 | ||
47 | static struct extent_io_ops btree_extent_io_ops; | 48 | static struct extent_io_ops btree_extent_io_ops; |
48 | static void end_workqueue_fn(struct btrfs_work *work); | 49 | static void end_workqueue_fn(struct btrfs_work *work); |
@@ -2001,6 +2002,9 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
2001 | init_waitqueue_head(&fs_info->scrub_pause_wait); | 2002 | init_waitqueue_head(&fs_info->scrub_pause_wait); |
2002 | init_rwsem(&fs_info->scrub_super_lock); | 2003 | init_rwsem(&fs_info->scrub_super_lock); |
2003 | fs_info->scrub_workers_refcnt = 0; | 2004 | fs_info->scrub_workers_refcnt = 0; |
2005 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY | ||
2006 | fs_info->check_integrity_print_mask = 0; | ||
2007 | #endif | ||
2004 | 2008 | ||
2005 | sb->s_blocksize = 4096; | 2009 | sb->s_blocksize = 4096; |
2006 | sb->s_blocksize_bits = blksize_bits(4096); | 2010 | sb->s_blocksize_bits = blksize_bits(4096); |
@@ -2356,6 +2360,19 @@ retry_root_backup: | |||
2356 | btrfs_set_opt(fs_info->mount_opt, SSD); | 2360 | btrfs_set_opt(fs_info->mount_opt, SSD); |
2357 | } | 2361 | } |
2358 | 2362 | ||
2363 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY | ||
2364 | if (btrfs_test_opt(tree_root, CHECK_INTEGRITY)) { | ||
2365 | ret = btrfsic_mount(tree_root, fs_devices, | ||
2366 | btrfs_test_opt(tree_root, | ||
2367 | CHECK_INTEGRITY_INCLUDING_EXTENT_DATA) ? | ||
2368 | 1 : 0, | ||
2369 | fs_info->check_integrity_print_mask); | ||
2370 | if (ret) | ||
2371 | printk(KERN_WARNING "btrfs: failed to initialize" | ||
2372 | " integrity check module %s\n", sb->s_id); | ||
2373 | } | ||
2374 | #endif | ||
2375 | |||
2359 | /* do not make disk changes in broken FS */ | 2376 | /* do not make disk changes in broken FS */ |
2360 | if (btrfs_super_log_root(disk_super) != 0 && | 2377 | if (btrfs_super_log_root(disk_super) != 0 && |
2361 | !(fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR)) { | 2378 | !(fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR)) { |
@@ -2634,7 +2651,7 @@ static int write_dev_supers(struct btrfs_device *device, | |||
2634 | * we fua the first super. The others we allow | 2651 | * we fua the first super. The others we allow |
2635 | * to go down lazy. | 2652 | * to go down lazy. |
2636 | */ | 2653 | */ |
2637 | ret = submit_bh(WRITE_FUA, bh); | 2654 | ret = btrfsic_submit_bh(WRITE_FUA, bh); |
2638 | if (ret) | 2655 | if (ret) |
2639 | errors++; | 2656 | errors++; |
2640 | } | 2657 | } |
@@ -2711,7 +2728,7 @@ static int write_dev_flush(struct btrfs_device *device, int wait) | |||
2711 | device->flush_bio = bio; | 2728 | device->flush_bio = bio; |
2712 | 2729 | ||
2713 | bio_get(bio); | 2730 | bio_get(bio); |
2714 | submit_bio(WRITE_FLUSH, bio); | 2731 | btrfsic_submit_bio(WRITE_FLUSH, bio); |
2715 | 2732 | ||
2716 | return 0; | 2733 | return 0; |
2717 | } | 2734 | } |
@@ -3057,6 +3074,11 @@ int close_ctree(struct btrfs_root *root) | |||
3057 | btrfs_stop_workers(&fs_info->caching_workers); | 3074 | btrfs_stop_workers(&fs_info->caching_workers); |
3058 | btrfs_stop_workers(&fs_info->readahead_workers); | 3075 | btrfs_stop_workers(&fs_info->readahead_workers); |
3059 | 3076 | ||
3077 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY | ||
3078 | if (btrfs_test_opt(root, CHECK_INTEGRITY)) | ||
3079 | btrfsic_unmount(root, fs_info->fs_devices); | ||
3080 | #endif | ||
3081 | |||
3060 | btrfs_close_devices(fs_info->fs_devices); | 3082 | btrfs_close_devices(fs_info->fs_devices); |
3061 | btrfs_mapping_tree_free(&fs_info->mapping_tree); | 3083 | btrfs_mapping_tree_free(&fs_info->mapping_tree); |
3062 | 3084 | ||
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 49f3c9dc09f..246669296e0 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include "ctree.h" | 18 | #include "ctree.h" |
19 | #include "btrfs_inode.h" | 19 | #include "btrfs_inode.h" |
20 | #include "volumes.h" | 20 | #include "volumes.h" |
21 | #include "check-integrity.h" | ||
21 | 22 | ||
22 | static struct kmem_cache *extent_state_cache; | 23 | static struct kmem_cache *extent_state_cache; |
23 | static struct kmem_cache *extent_buffer_cache; | 24 | static struct kmem_cache *extent_buffer_cache; |
@@ -1895,7 +1896,7 @@ int repair_io_failure(struct btrfs_mapping_tree *map_tree, u64 start, | |||
1895 | } | 1896 | } |
1896 | bio->bi_bdev = dev->bdev; | 1897 | bio->bi_bdev = dev->bdev; |
1897 | bio_add_page(bio, page, length, start-page_offset(page)); | 1898 | bio_add_page(bio, page, length, start-page_offset(page)); |
1898 | submit_bio(WRITE_SYNC, bio); | 1899 | btrfsic_submit_bio(WRITE_SYNC, bio); |
1899 | wait_for_completion(&compl); | 1900 | wait_for_completion(&compl); |
1900 | 1901 | ||
1901 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { | 1902 | if (!test_bit(BIO_UPTODATE, &bio->bi_flags)) { |
@@ -2393,7 +2394,7 @@ static int submit_one_bio(int rw, struct bio *bio, int mirror_num, | |||
2393 | ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, | 2394 | ret = tree->ops->submit_bio_hook(page->mapping->host, rw, bio, |
2394 | mirror_num, bio_flags, start); | 2395 | mirror_num, bio_flags, start); |
2395 | else | 2396 | else |
2396 | submit_bio(rw, bio); | 2397 | btrfsic_submit_bio(rw, bio); |
2397 | 2398 | ||
2398 | if (bio_flagged(bio, BIO_EOPNOTSUPP)) | 2399 | if (bio_flagged(bio, BIO_EOPNOTSUPP)) |
2399 | ret = -EOPNOTSUPP; | 2400 | ret = -EOPNOTSUPP; |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index ddf2c90d3fc..567e148caca 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include "transaction.h" | 25 | #include "transaction.h" |
26 | #include "backref.h" | 26 | #include "backref.h" |
27 | #include "extent_io.h" | 27 | #include "extent_io.h" |
28 | #include "check-integrity.h" | ||
28 | 29 | ||
29 | /* | 30 | /* |
30 | * This is only the first step towards a full-features scrub. It reads all | 31 | * This is only the first step towards a full-features scrub. It reads all |
@@ -732,7 +733,7 @@ static int scrub_fixup_io(int rw, struct block_device *bdev, sector_t sector, | |||
732 | bio_add_page(bio, page, PAGE_SIZE, 0); | 733 | bio_add_page(bio, page, PAGE_SIZE, 0); |
733 | bio->bi_end_io = scrub_fixup_end_io; | 734 | bio->bi_end_io = scrub_fixup_end_io; |
734 | bio->bi_private = &complete; | 735 | bio->bi_private = &complete; |
735 | submit_bio(rw, bio); | 736 | btrfsic_submit_bio(rw, bio); |
736 | 737 | ||
737 | /* this will also unplug the queue */ | 738 | /* this will also unplug the queue */ |
738 | wait_for_completion(&complete); | 739 | wait_for_completion(&complete); |
@@ -958,7 +959,7 @@ static int scrub_submit(struct scrub_dev *sdev) | |||
958 | sdev->curr = -1; | 959 | sdev->curr = -1; |
959 | atomic_inc(&sdev->in_flight); | 960 | atomic_inc(&sdev->in_flight); |
960 | 961 | ||
961 | submit_bio(READ, sbio->bio); | 962 | btrfsic_submit_bio(READ, sbio->bio); |
962 | 963 | ||
963 | return 0; | 964 | return 0; |
964 | } | 965 | } |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 34a8b6112ea..22a2015f1d7 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -165,7 +165,10 @@ enum { | |||
165 | Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard, | 165 | Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard, |
166 | Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed, | 166 | Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed, |
167 | Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, | 167 | Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, |
168 | Opt_inode_cache, Opt_no_space_cache, Opt_recovery, Opt_err, | 168 | Opt_inode_cache, Opt_no_space_cache, Opt_recovery, |
169 | Opt_check_integrity, Opt_check_integrity_including_extent_data, | ||
170 | Opt_check_integrity_print_mask, | ||
171 | Opt_err, | ||
169 | }; | 172 | }; |
170 | 173 | ||
171 | static match_table_t tokens = { | 174 | static match_table_t tokens = { |
@@ -200,6 +203,9 @@ static match_table_t tokens = { | |||
200 | {Opt_inode_cache, "inode_cache"}, | 203 | {Opt_inode_cache, "inode_cache"}, |
201 | {Opt_no_space_cache, "nospace_cache"}, | 204 | {Opt_no_space_cache, "nospace_cache"}, |
202 | {Opt_recovery, "recovery"}, | 205 | {Opt_recovery, "recovery"}, |
206 | {Opt_check_integrity, "check_int"}, | ||
207 | {Opt_check_integrity_including_extent_data, "check_int_data"}, | ||
208 | {Opt_check_integrity_print_mask, "check_int_print_mask=%d"}, | ||
203 | {Opt_err, NULL}, | 209 | {Opt_err, NULL}, |
204 | }; | 210 | }; |
205 | 211 | ||
@@ -398,6 +404,37 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
398 | printk(KERN_INFO "btrfs: enabling auto recovery"); | 404 | printk(KERN_INFO "btrfs: enabling auto recovery"); |
399 | btrfs_set_opt(info->mount_opt, RECOVERY); | 405 | btrfs_set_opt(info->mount_opt, RECOVERY); |
400 | break; | 406 | break; |
407 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY | ||
408 | case Opt_check_integrity_including_extent_data: | ||
409 | printk(KERN_INFO "btrfs: enabling check integrity" | ||
410 | " including extent data\n"); | ||
411 | btrfs_set_opt(info->mount_opt, | ||
412 | CHECK_INTEGRITY_INCLUDING_EXTENT_DATA); | ||
413 | btrfs_set_opt(info->mount_opt, CHECK_INTEGRITY); | ||
414 | break; | ||
415 | case Opt_check_integrity: | ||
416 | printk(KERN_INFO "btrfs: enabling check integrity\n"); | ||
417 | btrfs_set_opt(info->mount_opt, CHECK_INTEGRITY); | ||
418 | break; | ||
419 | case Opt_check_integrity_print_mask: | ||
420 | intarg = 0; | ||
421 | match_int(&args[0], &intarg); | ||
422 | if (intarg) { | ||
423 | info->check_integrity_print_mask = intarg; | ||
424 | printk(KERN_INFO "btrfs:" | ||
425 | " check_integrity_print_mask 0x%x\n", | ||
426 | info->check_integrity_print_mask); | ||
427 | } | ||
428 | break; | ||
429 | #else | ||
430 | case Opt_check_integrity_including_extent_data: | ||
431 | case Opt_check_integrity: | ||
432 | case Opt_check_integrity_print_mask: | ||
433 | printk(KERN_ERR "btrfs: support for check_integrity*" | ||
434 | " not compiled in!\n"); | ||
435 | ret = -EINVAL; | ||
436 | goto out; | ||
437 | #endif | ||
401 | case Opt_err: | 438 | case Opt_err: |
402 | printk(KERN_INFO "btrfs: unrecognized mount option " | 439 | printk(KERN_INFO "btrfs: unrecognized mount option " |
403 | "'%s'\n", p); | 440 | "'%s'\n", p); |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index f4b839fd3c9..821334f6e3a 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include "print-tree.h" | 32 | #include "print-tree.h" |
33 | #include "volumes.h" | 33 | #include "volumes.h" |
34 | #include "async-thread.h" | 34 | #include "async-thread.h" |
35 | #include "check-integrity.h" | ||
35 | 36 | ||
36 | static int init_first_rw_device(struct btrfs_trans_handle *trans, | 37 | static int init_first_rw_device(struct btrfs_trans_handle *trans, |
37 | struct btrfs_root *root, | 38 | struct btrfs_root *root, |
@@ -246,7 +247,7 @@ loop_lock: | |||
246 | sync_pending = 0; | 247 | sync_pending = 0; |
247 | } | 248 | } |
248 | 249 | ||
249 | submit_bio(cur->bi_rw, cur); | 250 | btrfsic_submit_bio(cur->bi_rw, cur); |
250 | num_run++; | 251 | num_run++; |
251 | batch_run++; | 252 | batch_run++; |
252 | if (need_resched()) | 253 | if (need_resched()) |
@@ -3304,7 +3305,7 @@ static noinline int schedule_bio(struct btrfs_root *root, | |||
3304 | /* don't bother with additional async steps for reads, right now */ | 3305 | /* don't bother with additional async steps for reads, right now */ |
3305 | if (!(rw & REQ_WRITE)) { | 3306 | if (!(rw & REQ_WRITE)) { |
3306 | bio_get(bio); | 3307 | bio_get(bio); |
3307 | submit_bio(rw, bio); | 3308 | btrfsic_submit_bio(rw, bio); |
3308 | bio_put(bio); | 3309 | bio_put(bio); |
3309 | return 0; | 3310 | return 0; |
3310 | } | 3311 | } |
@@ -3399,7 +3400,7 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, | |||
3399 | if (async_submit) | 3400 | if (async_submit) |
3400 | schedule_bio(root, dev, rw, bio); | 3401 | schedule_bio(root, dev, rw, bio); |
3401 | else | 3402 | else |
3402 | submit_bio(rw, bio); | 3403 | btrfsic_submit_bio(rw, bio); |
3403 | } else { | 3404 | } else { |
3404 | bio->bi_bdev = root->fs_info->fs_devices->latest_bdev; | 3405 | bio->bi_bdev = root->fs_info->fs_devices->latest_bdev; |
3405 | bio->bi_sector = logical >> 9; | 3406 | bio->bi_sector = logical >> 9; |