* [RFC][PATCH V5] btrfs-progs: allocation_hint disk property @ 2021-02-01 21:28 Goffredo Baroncelli 2021-02-01 21:28 ` [PATCH 1/2] btrfs-progs: add ioctl BTRFS_IOC_DEV_PROPERTIES Goffredo Baroncelli 2021-02-01 21:28 ` [PATCH 2/2] btrfs-progs: new "allocation_hint" property Goffredo Baroncelli 0 siblings, 2 replies; 4+ messages in thread From: Goffredo Baroncelli @ 2021-02-01 21:28 UTC (permalink / raw) To: linux-btrfs; +Cc: Zygo Blaxell, Josef Bacik This patches set is the userspace portion of the serie "[PATCH V6] btrfs: allocation_hint mode". Look this patches set for further information. G.Baroncelli -- gpg @keyserver.linux.it: Goffredo Baroncelli <kreijackATinwind.it> Key fingerprint BBF5 1610 0B64 DAC6 5F7D 17B2 0EDA 9B37 8B82 E0B5 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] btrfs-progs: add ioctl BTRFS_IOC_DEV_PROPERTIES. 2021-02-01 21:28 [RFC][PATCH V5] btrfs-progs: allocation_hint disk property Goffredo Baroncelli @ 2021-02-01 21:28 ` Goffredo Baroncelli 2021-02-01 21:28 ` [PATCH 2/2] btrfs-progs: new "allocation_hint" property Goffredo Baroncelli 1 sibling, 0 replies; 4+ messages in thread From: Goffredo Baroncelli @ 2021-02-01 21:28 UTC (permalink / raw) To: linux-btrfs; +Cc: Zygo Blaxell, Josef Bacik, Goffredo Baroncelli From: Goffredo Baroncelli <kreijack@inwind.it> Update the header to add the BTRFS_IOC_DEV_PROPERTIES ioctl: - add ioctl BTRFS_IOC_DEV_PROPERTIES define - add struct btrfs_ioctl_dev_properties - add the BTRFS_DEV_PROPERTY_ define This ioctl is a base for returning / setting information from / to the fields of the btrfs_dev_item object. For now only the "type" field is returned / set. Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it> --- ioctl.h | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/ioctl.h b/ioctl.h index ade6dcb9..a4febb95 100644 --- a/ioctl.h +++ b/ioctl.h @@ -775,6 +775,44 @@ struct btrfs_ioctl_get_subvol_rootref_args { }; BUILD_ASSERT(sizeof(struct btrfs_ioctl_get_subvol_rootref_args) == 4096); +#define BTRFS_DEV_PROPERTY_TYPE (1ULL << 0) +#define BTRFS_DEV_PROPERTY_DEV_GROUP (1ULL << 1) +#define BTRFS_DEV_PROPERTY_SEEK_SPEED (1ULL << 2) +#define BTRFS_DEV_PROPERTY_BANDWIDTH (1ULL << 3) +#define BTRFS_DEV_PROPERTY_READ (1ULL << 60) + +/* + * The ioctl BTRFS_IOC_DEV_PROPERTIES can read and write the device properties. + * + * The properties that the user want to write have to be set + * in the 'properties' field using the BTRFS_DEV_PROPERTY_xxxx constants. + * + * If the ioctl is used to read the device properties, the bit + * BTRFS_DEV_PROPERTY_READ has to be set in the 'properties' field. + * In this case the properties that the user want have to be set in the + * 'properties' field. The kernel doesn't return a property that was not + * required, however it may return a subset of the requested properties. + * The returned properties have the corrispondent BTRFS_DEV_PROPERTY_xxxx + * flag set in the 'properties' field. + * + * Up to 2020/05/11 the only properties that can be read/write is the 'type' + * one. + */ +struct btrfs_ioctl_dev_properties { + __u64 devid; + __u64 properties; + __u64 type; + __u32 dev_group; + __u8 seek_speed; + __u8 bandwidth; + + /* + * for future expansion + */ + __u8 unused1[2]; + __u64 unused2[4]; +}; + /* Error codes as returned by the kernel */ enum btrfs_err_code { notused, @@ -949,6 +987,8 @@ static inline char *btrfs_err_str(enum btrfs_err_code err_code) struct btrfs_ioctl_ino_lookup_user_args) #define BTRFS_IOC_SNAP_DESTROY_V2 _IOW(BTRFS_IOCTL_MAGIC, 63, \ struct btrfs_ioctl_vol_args_v2) +#define BTRFS_IOC_DEV_PROPERTIES _IOW(BTRFS_IOCTL_MAGIC, 64, \ + struct btrfs_ioctl_dev_properties) #ifdef __cplusplus } -- 2.30.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] btrfs-progs: new "allocation_hint" property. 2021-02-01 21:28 [RFC][PATCH V5] btrfs-progs: allocation_hint disk property Goffredo Baroncelli 2021-02-01 21:28 ` [PATCH 1/2] btrfs-progs: add ioctl BTRFS_IOC_DEV_PROPERTIES Goffredo Baroncelli @ 2021-02-01 21:28 ` Goffredo Baroncelli 1 sibling, 0 replies; 4+ messages in thread From: Goffredo Baroncelli @ 2021-02-01 21:28 UTC (permalink / raw) To: linux-btrfs; +Cc: Zygo Blaxell, Josef Bacik, Goffredo Baroncelli From: Goffredo Baroncelli <kreijack@inwind.it> Handle the property allocation_hint of a btrfs device. Below an example of use: $ # set a new value $ sudo btrfs property set /dev/vde allocation_hint DATA_ONLY $ # get the current value $ sudo btrfs property get /dev/vde allocation_hint devid=4, path=/dev/vde: dedicated_metadata=DATA_ONLY The following properties are availables: - DATA_ONLY - PREFERRED_DATA (default) - PREFERRED_METADATA - METADATA_ONLY Root privileges are required. Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it> --- kernel-shared/ctree.h | 15 ++++ props.c | 170 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+) diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h index 7683b8bb..844df9ce 100644 --- a/kernel-shared/ctree.h +++ b/kernel-shared/ctree.h @@ -219,6 +219,21 @@ struct btrfs_mapping_tree { struct cache_tree cache_tree; }; +/* btrfs chunk allocation hints */ +#define BTRFS_DEV_ALLOCATION_MASK_BIT_COUNT 3 +#define BTRFS_DEV_ALLOCATION_MASK ((1ULL << \ + BTRFS_DEV_ALLOCATION_MASK_BIT_COUNT) -1) +/* preferred metadata chunk, but data chunk allowed */ +#define BTRFS_DEV_ALLOCATION_PREFERRED_METADATA (1ULL) +/* only metadata chunk are allowed */ +#define BTRFS_DEV_ALLOCATION_METADATA_ONLY (2ULL) +/* only data chunk allowed */ +#define BTRFS_DEV_ALLOCATION_DATA_ONLY (3ULL) +/* preferred data chunk, but metadata chunk allowed */ +#define BTRFS_DEV_ALLOCATION_PREFERRED_DATA (0ULL) +/* 5..7 are unused values */ + + #define BTRFS_UUID_SIZE 16 struct btrfs_dev_item { /* the internal btrfs device id */ diff --git a/props.c b/props.c index 0cfc358d..2f5f6482 100644 --- a/props.c +++ b/props.c @@ -20,6 +20,7 @@ #include <sys/xattr.h> #include <fcntl.h> #include <unistd.h> +#include <sys/sysmacros.h> #include <btrfsutil.h> @@ -166,6 +167,169 @@ out: return ret; } +static int btrfs_find_devid_and_mnt(const char *devpath, int *devid, + char *path, int maxpath) +{ + int ret, i, fd; + DIR *dir; + struct stat stdevpath; + struct btrfs_ioctl_fs_info_args fi_args; + struct btrfs_ioctl_dev_info_args dev_info; + + ret = get_btrfs_mount(devpath, path, maxpath); + if (ret) + return ret; + + fd = btrfs_open_dir(path, &dir, 1); + if (fd < 0) + return fd; + + ret = stat(devpath, &stdevpath); + if (ret) { + error("cannot stat '%s'", devpath); + goto out; + } + + ret = ioctl(fd, BTRFS_IOC_FS_INFO, &fi_args); + if (ret < 0) { + if (errno == EPERM) + return -errno; + error("cannot get filesystem info: %m"); + ret = -10; + goto out; + } + + for (i = 0 ; i <= fi_args.max_id ; i++) { + struct stat st; + memset(&dev_info, 0, sizeof(dev_info)); + ret = get_device_info(fd, i, &dev_info); + if (ret == -ENODEV) + continue; + if (ret) { + error("cannot get info about device devid=%d", i); + goto out; + } + + if (!dev_info.path) + /* missing devices */ + continue; + + ret = stat((char*)dev_info.path, &st); + if (ret) { + error("cannot stat '%s'", devpath); + goto out; + } + + if (major(st.st_rdev) == major(stdevpath.st_rdev) && + minor(st.st_rdev) == minor(stdevpath.st_rdev)) { + *devid = dev_info.devid; + ret = 0; + goto out; + } + } + + ret = -12; + +out: + close_file_or_dir(fd, dir); + return ret; +} + +static struct ull_charp_pair_t { + u64 value; + const char *descr; +} allocation_hint_description[] = { + {BTRFS_DEV_ALLOCATION_PREFERRED_METADATA, "PREFERRED_METADATA"}, + {BTRFS_DEV_ALLOCATION_METADATA_ONLY, "METADATA_ONLY"}, + {BTRFS_DEV_ALLOCATION_PREFERRED_DATA, "PREFERRED_DATA"}, + {BTRFS_DEV_ALLOCATION_DATA_ONLY, "DATA_ONLY"}, + {0, NULL} +}; + + +static int prop_allocation_hint(enum prop_object_type type, + const char *object, + const char *name, + const char *value) +{ + int ret, devid, fd; + char path[PATH_MAX]; + DIR *dir; + struct btrfs_ioctl_dev_properties props; + int i; + u64 v; + + ret = btrfs_find_devid_and_mnt(object, &devid, path, sizeof(path)); + if (ret) + return -5; + + fd = btrfs_open_dir(path, &dir, 1); + if (fd < 0) + return fd; + + memset(&props, 0, sizeof(props)); + props.devid = devid; + props.properties = BTRFS_DEV_PROPERTY_TYPE|BTRFS_DEV_PROPERTY_READ; + ret = ioctl(fd, BTRFS_IOC_DEV_PROPERTIES, &props); + if (ret < 0) { + error("Cannot perform BTRFS_IOC_DEV_PROPERTIES ioctl on '%s'", + path); + ret = -1; + goto out; + } + + if (!value) { + v = props.type & BTRFS_DEV_ALLOCATION_MASK; + for (i = 0 ; allocation_hint_description[i].descr ; i++) + if (v == allocation_hint_description[i].value) + break; + if (allocation_hint_description[i].descr) + printf("devid=%d, path=%s: allocation_hint=%s\n", + devid, object, + allocation_hint_description[i].descr); + else + printf("devid=%d, path=%s: allocation_hint=unknow:%llu\n", + devid, object, + v); + ret = 0; + goto out; + } + + for (i = 0 ; allocation_hint_description[i].descr ; i++) + if (!strcmp(value, allocation_hint_description[i].descr)) + break; + + if (allocation_hint_description[i].descr) { + v = allocation_hint_description[i].value; + } else if (sscanf(value, "%llu", &v) != 1) { + error("Invalid value '%s'\n", value); + ret = -3; + goto out; + } else if (v & ~BTRFS_DEV_ALLOCATION_MASK) { + error("Invalid value '%s'\n", value); + ret = -3; + goto out; + } + + props.type &= ~BTRFS_DEV_ALLOCATION_MASK; + props.type |= (v & BTRFS_DEV_ALLOCATION_MASK); + + props.properties = BTRFS_DEV_PROPERTY_TYPE; + props.devid = devid; + ret = ioctl(fd, BTRFS_IOC_DEV_PROPERTIES, &props); + if (ret < 0) { + error("Cannot perform BTRFS_IOC_DEV_PROPERTIES ioctl on '%s'", + path); + ret = -4; + goto out; + } + + ret = 0; +out: + close_file_or_dir(fd, dir); + return ret; +} + const struct prop_handler prop_handlers[] = { { .name ="ro", @@ -187,5 +351,11 @@ const struct prop_handler prop_handlers[] = { .read_only = 0, .types = prop_object_inode, prop_compression }, + { + .name = "allocation_hint", + .desc = "hint to store teh data/metadata chunks", + .types = prop_object_dev, + .handler = prop_allocation_hint + }, {NULL, NULL, 0, 0, NULL} }; -- 2.30.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 0/2] btrfs-progs: allocation_hint disk property @ 2021-02-22 21:31 Goffredo Baroncelli 2021-02-22 21:31 ` [PATCH 1/2] btrfs-progs: add ioctl BTRFS_IOC_DEV_PROPERTIES Goffredo Baroncelli 0 siblings, 1 reply; 4+ messages in thread From: Goffredo Baroncelli @ 2021-02-22 21:31 UTC (permalink / raw) To: linux-btrfs; +Cc: Zygo Blaxell, Josef Bacik, Goffredo Baroncelli From: Goffredo Baroncelli <kreijack@inwind.it> This patches set is the userspace portion of the serie "[PATCH V7] btrfs: allocation_hint mode". Look this patches set for further information. G.Baroncelli -- gpg @keyserver.linux.it: Goffredo Baroncelli <kreijackATinwind.it> Key fingerprint BBF5 1610 0B64 DAC6 5F7D 17B2 0EDA 9B37 8B82 E0B5 Goffredo Baroncelli (2): btrfs-progs: add ioctl BTRFS_IOC_DEV_PROPERTIES. btrfs-progs: new "allocation_hint" property. ioctl.h | 39 ++++++++++ kernel-shared/ctree.h | 15 ++++ props.c | 171 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 225 insertions(+) -- 2.30.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] btrfs-progs: add ioctl BTRFS_IOC_DEV_PROPERTIES. 2021-02-22 21:31 [PATCH 0/2] btrfs-progs: allocation_hint disk property Goffredo Baroncelli @ 2021-02-22 21:31 ` Goffredo Baroncelli 0 siblings, 0 replies; 4+ messages in thread From: Goffredo Baroncelli @ 2021-02-22 21:31 UTC (permalink / raw) To: linux-btrfs; +Cc: Zygo Blaxell, Josef Bacik, Goffredo Baroncelli From: Goffredo Baroncelli <kreijack@inwind.it> Update the header to add the BTRFS_IOC_DEV_PROPERTIES ioctl: - add ioctl BTRFS_IOC_DEV_PROPERTIES define - add struct btrfs_ioctl_dev_properties - add the BTRFS_DEV_PROPERTY_ define This ioctl is a base for returning / setting information from / to the fields of the btrfs_dev_item object. For now only the "type" field is returned / set. Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it> --- ioctl.h | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/ioctl.h b/ioctl.h index ade6dcb9..22a9c7a3 100644 --- a/ioctl.h +++ b/ioctl.h @@ -775,6 +775,43 @@ struct btrfs_ioctl_get_subvol_rootref_args { }; BUILD_ASSERT(sizeof(struct btrfs_ioctl_get_subvol_rootref_args) == 4096); +#define BTRFS_DEV_PROPERTY_TYPE (1ULL << 0) +#define BTRFS_DEV_PROPERTY_DEV_GROUP (1ULL << 1) +#define BTRFS_DEV_PROPERTY_SEEK_SPEED (1ULL << 2) +#define BTRFS_DEV_PROPERTY_BANDWIDTH (1ULL << 3) +#define BTRFS_DEV_PROPERTY_READ (1ULL << 60) + +/* + * The ioctl BTRFS_IOC_DEV_PROPERTIES can read and write the device properties. + * + * The properties that the user want to write have to be set + * in the 'properties' field using the BTRFS_DEV_PROPERTY_xxxx constants. + * + * If the ioctl is used to read the device properties, the bit + * BTRFS_DEV_PROPERTY_READ has to be set in the 'properties' field. + * In this case the properties that the user want have to be set in the + * 'properties' field. The kernel doesn't return a property that was not + * required, however it may return a subset of the requested properties. + * The returned properties have the corrispondent BTRFS_DEV_PROPERTY_xxxx + * flag set in the 'properties' field. + * + * Up to 2020/05/11 the only properties that can be read/write is the 'type' + * one. + */ +struct btrfs_ioctl_dev_properties { + __u64 devid; + __u64 properties; + __u64 type; + __u32 dev_group; + __u8 seek_speed; + __u8 bandwidth; + + /* + * for future expansion, pad up to 1k + */ + __u8 reserved[1024-30]; +}; + /* Error codes as returned by the kernel */ enum btrfs_err_code { notused, @@ -949,6 +986,8 @@ static inline char *btrfs_err_str(enum btrfs_err_code err_code) struct btrfs_ioctl_ino_lookup_user_args) #define BTRFS_IOC_SNAP_DESTROY_V2 _IOW(BTRFS_IOCTL_MAGIC, 63, \ struct btrfs_ioctl_vol_args_v2) +#define BTRFS_IOC_DEV_PROPERTIES _IOW(BTRFS_IOCTL_MAGIC, 64, \ + struct btrfs_ioctl_dev_properties) #ifdef __cplusplus } -- 2.30.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2021-02-22 21:32 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-02-01 21:28 [RFC][PATCH V5] btrfs-progs: allocation_hint disk property Goffredo Baroncelli 2021-02-01 21:28 ` [PATCH 1/2] btrfs-progs: add ioctl BTRFS_IOC_DEV_PROPERTIES Goffredo Baroncelli 2021-02-01 21:28 ` [PATCH 2/2] btrfs-progs: new "allocation_hint" property Goffredo Baroncelli -- strict thread matches above, loose matches on Subject: below -- 2021-02-22 21:31 [PATCH 0/2] btrfs-progs: allocation_hint disk property Goffredo Baroncelli 2021-02-22 21:31 ` [PATCH 1/2] btrfs-progs: add ioctl BTRFS_IOC_DEV_PROPERTIES Goffredo Baroncelli
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox