@@ -620,6 +620,15 @@ enum btrfs_exclusive_operation {
BTRFS_EXCLOP_SWAP_ACTIVATE,
};
+/*
+ * allocation_hint mode
+ */
+
+enum btrfs_allocation_hint_modes {
+ BTRFS_ALLOCATION_HINT_DISABLED,
+ BTRFS_ALLOCATION_HINT_ENABLED
+};
+
struct btrfs_fs_info {
u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
unsigned long flags;
@@ -1021,6 +1030,11 @@ struct btrfs_fs_info {
u64 zoned;
};
+ /* allocation_hint mode */
+ int allocation_hint_mode;
+
+ /* Max size to emit ZONE_APPEND write command */
+ u64 max_zone_append_size;
struct mutex zoned_meta_io_lock;
spinlock_t treelog_bg_lock;
u64 treelog_bg;
@@ -3160,6 +3160,8 @@ void btrfs_init_fs_info(struct btrfs_fs_info *fs_info)
spin_lock_init(&fs_info->swapfile_pins_lock);
fs_info->swapfile_pins = RB_ROOT;
+ fs_info->allocation_hint_mode = BTRFS_ALLOCATION_HINT_DISABLED;
+
fs_info->bg_reclaim_threshold = BTRFS_DEFAULT_RECLAIM_THRESH;
INIT_WORK(&fs_info->reclaim_bgs_work, btrfs_reclaim_bgs_work);
}
@@ -373,6 +373,7 @@ enum {
Opt_thread_pool,
Opt_treelog, Opt_notreelog,
Opt_user_subvol_rm_allowed,
+ Opt_allocation_hint,
/* Rescue options */
Opt_rescue,
@@ -446,6 +447,7 @@ static const match_table_t tokens = {
{Opt_treelog, "treelog"},
{Opt_notreelog, "notreelog"},
{Opt_user_subvol_rm_allowed, "user_subvol_rm_allowed"},
+ {Opt_allocation_hint, "allocation_hint=%d"},
/* Rescue options */
{Opt_rescue, "rescue=%s"},
@@ -903,6 +905,19 @@ 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_allocation_hint:
+ ret = match_int(&args[0], &intarg);
+ if (ret || (intarg != 1 && intarg != 0)) {
+ btrfs_err(info, "invalid allocation_hint= parameter\n");
+ ret = -EINVAL;
+ goto out;
+ }
+ if (intarg)
+ btrfs_info(info, "allocation_hint enabled");
+ else
+ btrfs_info(info, "allocation_hint disabled");
+ info->allocation_hint_mode = intarg;
+ break;
case Opt_enospc_debug:
btrfs_set_opt(info->mount_opt, ENOSPC_DEBUG);
break;
@@ -1497,6 +1512,8 @@ 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->allocation_hint_mode)
+ seq_puts(seq, ",allocation_hint=1");
if (btrfs_test_opt(info, ENOSPC_DEBUG))
seq_puts(seq, ",enospc_debug");
if (btrfs_test_opt(info, AUTO_DEFRAG))
@@ -5276,10 +5276,13 @@ static int gather_device_info(struct btrfs_fs_devices *fs_devices,
devices_info[ndevs].total_avail = total_avail;
devices_info[ndevs].dev = device;
- if ((ctl->type & BTRFS_BLOCK_GROUP_DATA) &&
- (ctl->type & BTRFS_BLOCK_GROUP_METADATA)) {
+ if (((ctl->type & BTRFS_BLOCK_GROUP_DATA) &&
+ (ctl->type & BTRFS_BLOCK_GROUP_METADATA)) ||
+ info->allocation_hint_mode ==
+ BTRFS_ALLOCATION_HINT_DISABLED) {
/*
- * if mixed bg set all the alloc_hint
+ * if mixed bg or the allocator hint is
+ * disabled, set all the alloc_hint
* fields to the same value, so the sorting
* is not affected
*/