aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorStefan Behrens <sbehrens@giantdisaster.de>2011-11-09 07:44:05 -0500
committerStefan Behrens <sbehrens@giantdisaster.de>2011-12-21 13:14:17 -0500
commit21adbd5cbb5344a3fca6bb7ddb2ab6cb03c44546 (patch)
tree208c3ab6ad8bb35937b21c4d54e45e46d99557ff /fs/btrfs/disk-io.c
parentf11e4d7f533249ddfa110116200c5c3a509f9218 (diff)
Btrfs: integrate integrity check module into btrfs
This is the last part of the patch series. It modifies the btrfs code to use the integrity check module if configured to do so with the define BTRFS_FS_CHECK_INTEGRITY. If this define is not set, the only effective change is that code is added that handles the mount option to activate the integrity check. If the mount option is set and the define BTRFS_FS_CHECK_INTEGRITY is not set, that code complains in the log and the mount fails with EINVAL. Add the mount option to activate the usage of the integrity check code. Add invocation of btrfs integrity check code init and cleanup function on mount and umount, respectively. Add hook to call btrfs integrity check code version of submit_bh/submit_bio. Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 3f9d5551e582..f363c6d9c3de 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
47static struct extent_io_ops btree_extent_io_ops; 48static struct extent_io_ops btree_extent_io_ops;
48static void end_workqueue_fn(struct btrfs_work *work); 49static 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