|
@@ -312,10 +312,11 @@ enum {
|
|
|
Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, Opt_compress,
|
|
|
Opt_compress_type, Opt_compress_force, Opt_compress_force_type,
|
|
|
Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard,
|
|
|
- Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed,
|
|
|
- Opt_enospc_debug, Opt_subvolrootid, Opt_defrag, Opt_inode_cache,
|
|
|
- Opt_no_space_cache, Opt_recovery, Opt_skip_balance,
|
|
|
- Opt_check_integrity, Opt_check_integrity_including_extent_data,
|
|
|
+ Opt_space_cache, Opt_space_cache_version, Opt_clear_cache,
|
|
|
+ Opt_user_subvol_rm_allowed, Opt_enospc_debug, Opt_subvolrootid,
|
|
|
+ Opt_defrag, Opt_inode_cache, Opt_no_space_cache, Opt_recovery,
|
|
|
+ Opt_skip_balance, Opt_check_integrity,
|
|
|
+ Opt_check_integrity_including_extent_data,
|
|
|
Opt_check_integrity_print_mask, Opt_fatal_errors, Opt_rescan_uuid_tree,
|
|
|
Opt_commit_interval, Opt_barrier, Opt_nodefrag, Opt_nodiscard,
|
|
|
Opt_noenospc_debug, Opt_noflushoncommit, Opt_acl, Opt_datacow,
|
|
@@ -354,6 +355,7 @@ static match_table_t tokens = {
|
|
|
{Opt_discard, "discard"},
|
|
|
{Opt_nodiscard, "nodiscard"},
|
|
|
{Opt_space_cache, "space_cache"},
|
|
|
+ {Opt_space_cache_version, "space_cache=%s"},
|
|
|
{Opt_clear_cache, "clear_cache"},
|
|
|
{Opt_user_subvol_rm_allowed, "user_subvol_rm_allowed"},
|
|
|
{Opt_enospc_debug, "enospc_debug"},
|
|
@@ -392,7 +394,9 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|
|
bool compress_force = false;
|
|
|
|
|
|
cache_gen = btrfs_super_cache_generation(root->fs_info->super_copy);
|
|
|
- if (cache_gen)
|
|
|
+ if (btrfs_fs_compat_ro(root->fs_info, FREE_SPACE_TREE))
|
|
|
+ btrfs_set_opt(info->mount_opt, FREE_SPACE_TREE);
|
|
|
+ else if (cache_gen)
|
|
|
btrfs_set_opt(info->mount_opt, SPACE_CACHE);
|
|
|
|
|
|
if (!options)
|
|
@@ -626,15 +630,35 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|
|
"turning off discard");
|
|
|
break;
|
|
|
case Opt_space_cache:
|
|
|
- btrfs_set_and_info(root, SPACE_CACHE,
|
|
|
- "enabling disk space caching");
|
|
|
+ case Opt_space_cache_version:
|
|
|
+ if (token == Opt_space_cache ||
|
|
|
+ strcmp(args[0].from, "v1") == 0) {
|
|
|
+ btrfs_clear_opt(root->fs_info->mount_opt,
|
|
|
+ FREE_SPACE_TREE);
|
|
|
+ btrfs_set_and_info(root, SPACE_CACHE,
|
|
|
+ "enabling disk space caching");
|
|
|
+ } else if (strcmp(args[0].from, "v2") == 0) {
|
|
|
+ btrfs_clear_opt(root->fs_info->mount_opt,
|
|
|
+ SPACE_CACHE);
|
|
|
+ btrfs_set_and_info(root, FREE_SPACE_TREE,
|
|
|
+ "enabling free space tree");
|
|
|
+ } else {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
break;
|
|
|
case Opt_rescan_uuid_tree:
|
|
|
btrfs_set_opt(info->mount_opt, RESCAN_UUID_TREE);
|
|
|
break;
|
|
|
case Opt_no_space_cache:
|
|
|
- btrfs_clear_and_info(root, SPACE_CACHE,
|
|
|
- "disabling disk space caching");
|
|
|
+ if (btrfs_test_opt(root, SPACE_CACHE)) {
|
|
|
+ btrfs_clear_and_info(root, SPACE_CACHE,
|
|
|
+ "disabling disk space caching");
|
|
|
+ }
|
|
|
+ if (btrfs_test_opt(root, FREE_SPACE_TREE)) {
|
|
|
+ btrfs_clear_and_info(root, FREE_SPACE_TREE,
|
|
|
+ "disabling free space tree");
|
|
|
+ }
|
|
|
break;
|
|
|
case Opt_inode_cache:
|
|
|
btrfs_set_pending_and_info(info, INODE_MAP_CACHE,
|
|
@@ -747,8 +771,17 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
|
|
}
|
|
|
}
|
|
|
out:
|
|
|
+ if (btrfs_fs_compat_ro(root->fs_info, FREE_SPACE_TREE) &&
|
|
|
+ !btrfs_test_opt(root, FREE_SPACE_TREE) &&
|
|
|
+ !btrfs_test_opt(root, CLEAR_CACHE)) {
|
|
|
+ btrfs_err(root->fs_info, "cannot disable free space tree");
|
|
|
+ ret = -EINVAL;
|
|
|
+
|
|
|
+ }
|
|
|
if (!ret && btrfs_test_opt(root, SPACE_CACHE))
|
|
|
btrfs_info(root->fs_info, "disk space caching is enabled");
|
|
|
+ if (!ret && btrfs_test_opt(root, FREE_SPACE_TREE))
|
|
|
+ btrfs_info(root->fs_info, "using free space tree");
|
|
|
kfree(orig);
|
|
|
return ret;
|
|
|
}
|
|
@@ -1155,6 +1188,8 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
|
|
|
seq_puts(seq, ",noacl");
|
|
|
if (btrfs_test_opt(root, SPACE_CACHE))
|
|
|
seq_puts(seq, ",space_cache");
|
|
|
+ else if (btrfs_test_opt(root, FREE_SPACE_TREE))
|
|
|
+ seq_puts(seq, ",space_cache=v2");
|
|
|
else
|
|
|
seq_puts(seq, ",nospace_cache");
|
|
|
if (btrfs_test_opt(root, RESCAN_UUID_TREE))
|