@@ -608,6 +608,22 @@ static int btrfs_free_stale_devices(const char *path,
return ret;
}
+/*
+ * Get the tier score to the device, bigger score is faster.
+ * FIXME: detect bus(DIMM, NVMe, SCSI, SATA, Virtio, ...)
+ * FIXME: detect media inside(SLC/MLC of SSD, SMR/PMR of HDD, ...)
+ * FIXME: user-assigned property to set to max score for some complex case.
+ */
+static void dev_get_tier_score(struct btrfs_device *device, struct request_queue *q)
+{
+ if (blk_queue_dax(q))
+ device->tier_score = 50;
+ else if (blk_queue_nonrot(q))
+ device->tier_score = 10;
+ else
+ device->tier_score = 0;
+}
+
/*
* This is only used on mount, and we are protected from competing things
* messing with our fs_devices by the uuid_mutex, thus we do not need the
@@ -660,6 +676,7 @@ static int btrfs_open_one_device(struct btrfs_fs_devices *fs_devices,
}
q = bdev_get_queue(bdev);
+ dev_get_tier_score(device,q);
if (!blk_queue_nonrot(q))
fs_devices->rotating = true;
@@ -2590,6 +2607,7 @@ int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path
atomic64_add(device->total_bytes, &fs_info->free_chunk_space);
+ dev_get_tier_score(device,q);
if (!blk_queue_nonrot(q))
fs_devices->rotating = true;
@@ -138,6 +138,11 @@ struct btrfs_device {
struct completion kobj_unregister;
/* For sysfs/FSID/devinfo/devid/ */
struct kobject devid_kobj;
+
+ /* Storage tier score, bigger score is faster.
+ * In most case, only 1 or 2 tiers are used at the same time, so we group them
+ * into top tier and other tier(s). */
+ u8 tier_score;
};
/*
We use a single score value to define the tier level of a device. Different score means different tier, and bigger is faster. DAX device(dax=1) SSD device(rotational=0) HDD device(rotational=1) TODO/FIXME: FIXME: detect bus(DIMM, NVMe, SCSI, SATA, Virtio, ...) TODO/FIXME: user-assigned property(refactoring the coming 'read_preferred' property?) to set to the max score for some not-well-supported case. In most case, only 1 or 2 tiers are used at the same time, so we group them into top tier and other tier(s). Signed-off-by: wangyugui <wangyugui@e16-tech.com> --- fs/btrfs/volumes.c | 18 ++++++++++++++++++ fs/btrfs/volumes.h | 5 +++++ 2 files changed, 23 insertions(+)