diff options
Diffstat (limited to 'btrfstune.c')
-rw-r--r-- | btrfstune.c | 61 |
1 files changed, 59 insertions, 2 deletions
diff --git a/btrfstune.c b/btrfstune.c index 47830c5..4db1767 100644 --- a/btrfstune.c +++ b/btrfstune.c @@ -40,7 +40,7 @@ int update_seeding_flag(struct btrfs_root *root, int set_flag) struct btrfs_super_block *disk_super; u64 super_flags; - disk_super = &root->fs_info->super_copy; + disk_super = root->fs_info->super_copy; super_flags = btrfs_super_flags(disk_super); if (set_flag) { if (super_flags & BTRFS_SUPER_FLAG_SEEDING) { @@ -65,22 +65,58 @@ int update_seeding_flag(struct btrfs_root *root, int set_flag) return 0; } +int enable_extrefs_flag(struct btrfs_root *root) +{ + struct btrfs_trans_handle *trans; + struct btrfs_super_block *disk_super; + u64 super_flags; + + disk_super = root->fs_info->super_copy; + super_flags = btrfs_super_incompat_flags(disk_super); + super_flags |= BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF; + trans = btrfs_start_transaction(root, 1); + btrfs_set_super_incompat_flags(disk_super, super_flags); + btrfs_commit_transaction(trans, root); + + return 0; +} + +int enable_skinny_metadata(struct btrfs_root *root) +{ + struct btrfs_trans_handle *trans; + struct btrfs_super_block *disk_super; + u64 super_flags; + + disk_super = root->fs_info->super_copy; + super_flags = btrfs_super_incompat_flags(disk_super); + super_flags |= BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA; + trans = btrfs_start_transaction(root, 1); + btrfs_set_super_incompat_flags(disk_super, super_flags); + btrfs_commit_transaction(trans, root); + + return 0; +} + static void print_usage(void) { fprintf(stderr, "usage: btrfstune [options] device\n"); fprintf(stderr, "\t-S value\tenable/disable seeding\n"); + fprintf(stderr, "\t-r \t\tenable extended inode refs\n"); + fprintf(stderr, "\t-x enable skinny metadata extent refs\n"); } int main(int argc, char *argv[]) { struct btrfs_root *root; int success = 0; + int extrefs_flag = 0; int seeding_flag = 0; int seeding_value = 0; + int skinny_flag = 0; int ret; while(1) { - int c = getopt(argc, argv, "S:"); + int c = getopt(argc, argv, "S:rx"); if (c < 0) break; switch(c) { @@ -88,6 +124,12 @@ int main(int argc, char *argv[]) seeding_flag = 1; seeding_value = atoi(optarg); break; + case 'r': + extrefs_flag = 1; + break; + case 'x': + skinny_flag = 1; + break; default: print_usage(); return 1; @@ -108,12 +150,27 @@ int main(int argc, char *argv[]) root = open_ctree(device, 0, 1); + if (!root) { + fprintf(stderr, "Open ctree failed\n"); + return 1; + } + if (seeding_flag) { ret = update_seeding_flag(root, seeding_value); if (!ret) success++; } + if (extrefs_flag) { + enable_extrefs_flag(root); + success++; + } + + if (skinny_flag) { + enable_skinny_metadata(root); + success++; + } + if (success > 0) { ret = 0; } else { |