[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v6 3/8] file-posix: introduce get_sysfs_str_val for device zo
From: |
Stefan Hajnoczi |
Subject: |
Re: [PATCH v6 3/8] file-posix: introduce get_sysfs_str_val for device zoned model |
Date: |
Sat, 6 Aug 2022 08:50:37 -0400 |
On Fri, Aug 05, 2022 at 03:57:46PM +0800, Sam Li wrote:
> Use sysfs attribute files to get the string value of device
> zoned model. Then get_sysfs_zoned_model can convert it to
> BlockZoneModel type in QEMU.
>
> Signed-off-by: Sam Li <faithilikerun@gmail.com>
> Reviewed-by: Hannes Reinecke <hare@suse.de>
> ---
> block/file-posix.c | 70 ++++++++++++++++++++++++++++++++
> include/block/block_int-common.h | 3 ++
> 2 files changed, 73 insertions(+)
>
> diff --git a/block/file-posix.c b/block/file-posix.c
> index a40eab64a2..4785203eea 100644
> --- a/block/file-posix.c
> +++ b/block/file-posix.c
> @@ -1264,6 +1264,68 @@ out:
> #endif
> }
>
> +/*
> + * Convert the zoned attribute file in sysfs to internal value.
> + */
> +static int get_sysfs_str_val(int fd, struct stat *st,
> + const char *attribute,
> + char **val) {
The fd argument is unused and can be dropped.
> +#ifdef CONFIG_LINUX
> + char *buf = NULL;
> + g_autofree char *sysfspath = NULL;
> + int ret;
> + size_t len;
> +
> + if (!S_ISBLK(st->st_mode)) {
> + return -ENOTSUP;
> + }
> +
> + sysfspath = g_strdup_printf("/sys/dev/block/%u:%u/queue/%s",
> + major(st->st_rdev), minor(st->st_rdev),
> + attribute);
> + ret = g_file_get_contents(sysfspath, &buf, &len, NULL);
> + if (ret == -1) {
> + ret = -errno;
g_file_get_contents() does not set errno. You can either pass in a
GError and report the message string by converting it into a QEMU Error
object (grep for g_file_get_contents() to see example), or you can
return a fixed error code like -ENOENT.
> + return ret;
> + }
> +
> + /* The file is ended with '\n' */
> + if (buf[len - 1] == '\n') {
> + buf[len - 1] = '\0';
> + }
> +
> + if (!strncpy(*val, buf, len)) {
> + ret = -errno;
> + return ret;
> + }
> + g_free(buf);
buf is not necessary. val can be passed directly to g_file_get_contents().
> + return 0;
> +#else
> + return -ENOTSUP;
> +#endif
> +}
Now get_sysfs_long_val() can be written using get_sysfs_str_val():
static long get_sysfs_long_val(struct stat *st, const char *attribute)
{
g_autofree char *str = NULL;
const char *end;
long val;
int ret;
ret = get_sysfs_str_val(st, attribute, &str);
if (ret < 0) {
return ret;
}
ret = qemu_strtol(str, &end, 10, &val);
if (ret == 0 && end && *end == '\0') {
ret = val;
}
return ret;
}
The get_sysfs_long_val() patch can be moved after the
get_sysfs_str_val() patch.
> +
> +static int get_sysfs_zoned_model(int fd, struct stat *st,
> + BlockZoneModel *zoned) {
> + g_autofree char *val = NULL;
> + val = g_malloc(32);
> + get_sysfs_str_val(fd, st, "zoned", &val);
Once get_sysfs_str_val() passes val through to g_get_file_contents() the
caller will no longer have to g_malloc() val themselves.
signature.asc
Description: PGP signature
- [PATCH v6 0/8] Add support for zoned device, Sam Li, 2022/08/05
- [PATCH v6 1/8] include: add zoned device structs, Sam Li, 2022/08/05
- [PATCH v6 2/8] file-posix: introduce get_sysfs_long_val for the long sysfs attribute, Sam Li, 2022/08/05
- [PATCH v6 3/8] file-posix: introduce get_sysfs_str_val for device zoned model, Sam Li, 2022/08/05
- Re: [PATCH v6 3/8] file-posix: introduce get_sysfs_str_val for device zoned model,
Stefan Hajnoczi <=
- [PATCH v6 4/8] block: add block layer APIs resembling Linux ZonedBlockDevice ioctls, Sam Li, 2022/08/05
- [PATCH v6 5/8] raw-format: add zone operations to pass through requests, Sam Li, 2022/08/05
- [PATCH v6 6/8] config: add check to block layer, Sam Li, 2022/08/05
- [PATCH v6 7/8] qemu-iotests: test new zone operations, Sam Li, 2022/08/05
- [PATCH v6 8/8] docs/zoned-storage: add zoned device documentation, Sam Li, 2022/08/05