@@ -570,6 +570,17 @@ enum btrfs_exclusive_operation {
BTRFS_EXCLOP_SWAP_ACTIVATE,
};
+/*
+ * 'preferred_metadata' mode
+ */
+
+enum btrfs_preferred_metadata_mode {
+ BTRFS_PM_DISABLED,
+ BTRFS_PM_HARD,
+ BTRFS_PM_METADATA,
+ BTRFS_PM_SOFT
+};
+
struct btrfs_fs_info {
u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
unsigned long flags;
@@ -961,6 +972,9 @@ struct btrfs_fs_info {
u64 zoned;
};
+ /* preferred_metadata mode */
+ int preferred_metadata_mode;
+
/* Max size to emit ZONE_APPEND write command */
u64 max_zone_append_size;
@@ -2794,6 +2794,8 @@ void btrfs_init_fs_info(struct btrfs_fs_info *fs_info)
fs_info->swapfile_pins = RB_ROOT;
fs_info->send_in_progress = 0;
+
+ fs_info->preferred_metadata_mode = BTRFS_PM_DISABLED;
}
static int init_mount_fs_info(struct btrfs_fs_info *fs_info, struct super_block *sb)
@@ -359,6 +359,7 @@ enum {
Opt_thread_pool,
Opt_treelog, Opt_notreelog,
Opt_user_subvol_rm_allowed,
+ Opt_preferred_metadata,
/* Rescue options */
Opt_rescue,
@@ -432,6 +433,7 @@ static const match_table_t tokens = {
{Opt_treelog, "treelog"},
{Opt_notreelog, "notreelog"},
{Opt_user_subvol_rm_allowed, "user_subvol_rm_allowed"},
+ {Opt_preferred_metadata, "preferred_metadata=%s"},
/* Rescue options */
{Opt_rescue, "rescue=%s"},
@@ -889,6 +891,23 @@ int btrfs_parse_options(struct btrfs_fs_info *info, char *options,
case Opt_user_subvol_rm_allowed:
btrfs_set_opt(info->mount_opt, USER_SUBVOL_RM_ALLOWED);
break;
+ case Opt_preferred_metadata:
+ if (!strcmp(args[0].from, "hard")) {
+ info->preferred_metadata_mode = BTRFS_PM_HARD;
+ } else if (!strcmp(args[0].from, "metadata")) {
+ info->preferred_metadata_mode = BTRFS_PM_METADATA;
+ } else if (!strcmp(args[0].from, "soft")) {
+ info->preferred_metadata_mode = BTRFS_PM_SOFT;
+ } else if (!strcmp(args[0].from, "disabled")) {
+ info->preferred_metadata_mode = BTRFS_PM_DISABLED;
+ } else {
+ btrfs_err(info,
+ "unknown option '%s' in preferred_metadata",
+ args[0].from);
+ ret = -EINVAL;
+ goto out;
+ }
+ break;
case Opt_enospc_debug:
btrfs_set_opt(info->mount_opt, ENOSPC_DEBUG);
break;
@@ -1495,6 +1514,14 @@ static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry)
seq_puts(seq, ",clear_cache");
if (btrfs_test_opt(info, USER_SUBVOL_RM_ALLOWED))
seq_puts(seq, ",user_subvol_rm_allowed");
+ if (info->preferred_metadata_mode == BTRFS_PM_HARD)
+ seq_puts(seq, ",preferred_metadata=hard");
+ else if (info->preferred_metadata_mode == BTRFS_PM_METADATA)
+ seq_puts(seq, ",preferred_metadata=metadata");
+ else if (info->preferred_metadata_mode == BTRFS_PM_SOFT)
+ seq_puts(seq, ",preferred_metadata=soft");
+ else if (info->preferred_metadata_mode == BTRFS_PM_DISABLED)
+ seq_puts(seq, ",preferred_metadata=disabled");
if (btrfs_test_opt(info, ENOSPC_DEBUG))
seq_puts(seq, ",enospc_debug");
if (btrfs_test_opt(info, AUTO_DEFRAG))