diff options
author | Stefan Behrens <sbehrens@giantdisaster.de> | 2013-08-15 11:11:24 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2013-09-01 08:15:59 -0400 |
commit | f420ee1e923b931eeef5e2928791e84b1197cab3 (patch) | |
tree | 11c4273d3ff3a08d18587fb3ae1f9b156e35d12c | |
parent | 70f801754728017ebc909d603c69255dc1e6f06f (diff) |
Btrfs: add mount option to force UUID tree checking
This should never be needed, but since all functions are there
to check and rebuild the UUID tree, a mount option is added that
allows to force this check and rebuild procedure.
Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
-rw-r--r-- | fs/btrfs/ctree.h | 1 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 3 | ||||
-rw-r--r-- | fs/btrfs/super.c | 8 |
3 files changed, 10 insertions, 2 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 8c954766db93..0ef9d866952f 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -1998,6 +1998,7 @@ struct btrfs_ioctl_defrag_range_args { | |||
1998 | #define BTRFS_MOUNT_CHECK_INTEGRITY (1 << 20) | 1998 | #define BTRFS_MOUNT_CHECK_INTEGRITY (1 << 20) |
1999 | #define BTRFS_MOUNT_CHECK_INTEGRITY_INCLUDING_EXTENT_DATA (1 << 21) | 1999 | #define BTRFS_MOUNT_CHECK_INTEGRITY_INCLUDING_EXTENT_DATA (1 << 21) |
2000 | #define BTRFS_MOUNT_PANIC_ON_FATAL_ERROR (1 << 22) | 2000 | #define BTRFS_MOUNT_PANIC_ON_FATAL_ERROR (1 << 22) |
2001 | #define BTRFS_MOUNT_RESCAN_UUID_TREE (1 << 23) | ||
2001 | 2002 | ||
2002 | #define BTRFS_DEFAULT_COMMIT_INTERVAL (30) | 2003 | #define BTRFS_DEFAULT_COMMIT_INTERVAL (30) |
2003 | 2004 | ||
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index e7ef82ad0d26..00914a62abec 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -2929,7 +2929,8 @@ retry_root_backup: | |||
2929 | close_ctree(tree_root); | 2929 | close_ctree(tree_root); |
2930 | return ret; | 2930 | return ret; |
2931 | } | 2931 | } |
2932 | } else if (check_uuid_tree) { | 2932 | } else if (check_uuid_tree || |
2933 | btrfs_test_opt(tree_root, RESCAN_UUID_TREE)) { | ||
2933 | pr_info("btrfs: checking UUID tree\n"); | 2934 | pr_info("btrfs: checking UUID tree\n"); |
2934 | ret = btrfs_check_uuid_tree(fs_info); | 2935 | ret = btrfs_check_uuid_tree(fs_info); |
2935 | if (ret) { | 2936 | if (ret) { |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 1bd0bb523660..57090b4284fe 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -321,7 +321,7 @@ enum { | |||
321 | Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, Opt_inode_cache, | 321 | Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, Opt_inode_cache, |
322 | Opt_no_space_cache, Opt_recovery, Opt_skip_balance, | 322 | Opt_no_space_cache, Opt_recovery, Opt_skip_balance, |
323 | Opt_check_integrity, Opt_check_integrity_including_extent_data, | 323 | Opt_check_integrity, Opt_check_integrity_including_extent_data, |
324 | Opt_check_integrity_print_mask, Opt_fatal_errors, | 324 | Opt_check_integrity_print_mask, Opt_fatal_errors, Opt_rescan_uuid_tree, |
325 | Opt_commit_interval, | 325 | Opt_commit_interval, |
326 | Opt_err, | 326 | Opt_err, |
327 | }; | 327 | }; |
@@ -362,6 +362,7 @@ static match_table_t tokens = { | |||
362 | {Opt_check_integrity, "check_int"}, | 362 | {Opt_check_integrity, "check_int"}, |
363 | {Opt_check_integrity_including_extent_data, "check_int_data"}, | 363 | {Opt_check_integrity_including_extent_data, "check_int_data"}, |
364 | {Opt_check_integrity_print_mask, "check_int_print_mask=%d"}, | 364 | {Opt_check_integrity_print_mask, "check_int_print_mask=%d"}, |
365 | {Opt_rescan_uuid_tree, "rescan_uuid_tree"}, | ||
365 | {Opt_fatal_errors, "fatal_errors=%s"}, | 366 | {Opt_fatal_errors, "fatal_errors=%s"}, |
366 | {Opt_commit_interval, "commit=%d"}, | 367 | {Opt_commit_interval, "commit=%d"}, |
367 | {Opt_err, NULL}, | 368 | {Opt_err, NULL}, |
@@ -572,6 +573,9 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
572 | case Opt_space_cache: | 573 | case Opt_space_cache: |
573 | btrfs_set_opt(info->mount_opt, SPACE_CACHE); | 574 | btrfs_set_opt(info->mount_opt, SPACE_CACHE); |
574 | break; | 575 | break; |
576 | case Opt_rescan_uuid_tree: | ||
577 | btrfs_set_opt(info->mount_opt, RESCAN_UUID_TREE); | ||
578 | break; | ||
575 | case Opt_no_space_cache: | 579 | case Opt_no_space_cache: |
576 | printk(KERN_INFO "btrfs: disabling disk space caching\n"); | 580 | printk(KERN_INFO "btrfs: disabling disk space caching\n"); |
577 | btrfs_clear_opt(info->mount_opt, SPACE_CACHE); | 581 | btrfs_clear_opt(info->mount_opt, SPACE_CACHE); |
@@ -979,6 +983,8 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) | |||
979 | seq_puts(seq, ",space_cache"); | 983 | seq_puts(seq, ",space_cache"); |
980 | else | 984 | else |
981 | seq_puts(seq, ",nospace_cache"); | 985 | seq_puts(seq, ",nospace_cache"); |
986 | if (btrfs_test_opt(root, RESCAN_UUID_TREE)) | ||
987 | seq_puts(seq, ",rescan_uuid_tree"); | ||
982 | if (btrfs_test_opt(root, CLEAR_CACHE)) | 988 | if (btrfs_test_opt(root, CLEAR_CACHE)) |
983 | seq_puts(seq, ",clear_cache"); | 989 | seq_puts(seq, ",clear_cache"); |
984 | if (btrfs_test_opt(root, USER_SUBVOL_RM_ALLOWED)) | 990 | if (btrfs_test_opt(root, USER_SUBVOL_RM_ALLOWED)) |