[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: |
Sam Li |
Subject: |
Re: [PATCH v6 3/8] file-posix: introduce get_sysfs_str_val for device zoned model |
Date: |
Mon, 8 Aug 2022 21:59:15 +0800 |
Stefan Hajnoczi <stefanha@redhat.com> 于2022年8月8日周一 21:52写道:
>
> 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.
Cool! Will change it.
> > +
> > +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.
- [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
- [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