@@ -2105,6 +2105,9 @@ static inline int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
int num_stripes = 1;
int i = 0, nr_devices;
const struct btrfs_raid_attr *rattr;
+ /* tier-aware */
+ int nr_top_tier = 0;
+ u8 top_tier_score = 0;
/*
* We aren't under the device list lock, so this is racy-ish, but good
@@ -2176,12 +2179,27 @@ static inline int btrfs_calc_avail_data_space(struct btrfs_fs_info *fs_info,
devices_info[i].dev = device;
devices_info[i].max_avail = avail_space;
+ if (devices_info[i].dev->tier_score > top_tier_score) {
+ top_tier_score = devices_info[i].dev->tier_score;
+ nr_top_tier = 1;
+ }
+ else if (devices_info[i].dev->tier_score == top_tier_score) {
+ nr_top_tier++;
+ }
+
i++;
}
rcu_read_unlock();
nr_devices = i;
+ if (fs_info->data_tier_policy == OTHER_TIER_ONLY &&
+ nr_top_tier != nr_devices && nr_devices - nr_top_tier < rattr->devs_min) {
+ /* FIXME: full support of tier-aware. */
+ *free_bytes = 0;
+ return 0;
+ }
+
btrfs_descending_sort_devices(devices_info, nr_devices);
i = nr_devices - 1;
Detect some case of free space 0 because of tier policy of data. Full support is yet TODO/FIXME. Signed-off-by: wangyugui <wangyugui@e16-tech.com> --- fs/btrfs/super.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)