Re: [PATCH] thermal: sysfs: Return ENODATA instead of EAGAIN for reads
From: Rafael J. Wysocki
Date: Wed Apr 09 2025 - 13:32:30 EST
On Wed, Apr 9, 2025 at 11:13 AM Hsin-Te Yuan <yuanhsinte@xxxxxxxxxxxx> wrote:
>
> When userspace nonblocking reads temperature via sysfs, EAGAIN error
> returned by thermal driver will confuse user from the usual meaning of
> EAGAIN, the read would block.
Why would it block?
> Change to throw ENODATA instead of EAGAIN to userspace.
Casting error codes tends to be confusing.
> Also, ENODATA more accurately reflects that data is not currently available.
It means something else, "try again" vs "no data available (possibly at all)".
The error code comes from the thermal driver and if it wants to say
"try again" then this is what it wants to say.
> Signed-off-by: Hsin-Te Yuan <yuanhsinte@xxxxxxxxxxxx>
> ---
> drivers/thermal/thermal_sysfs.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
> index 24b9055a0b6c515b865e0d7e2db1d0de176ff767..3d1713e053dfb867933d95131f1f2491d2ecd07e 100644
> --- a/drivers/thermal/thermal_sysfs.c
> +++ b/drivers/thermal/thermal_sysfs.c
> @@ -40,8 +40,11 @@ temp_show(struct device *dev, struct device_attribute *attr, char *buf)
>
> ret = thermal_zone_get_temp(tz, &temperature);
>
> - if (ret)
> + if (ret) {
> + if (ret == -EAGAIN)
> + return -ENODATA;
> return ret;
> + }
>
> return sprintf(buf, "%d\n", temperature);
> }
>
> ---
> base-commit: a24588245776dafc227243a01bfbeb8a59bafba9
> change-id: 20250409-temp-6ebd13ad0dbd
>
> Best regards,
> --
> Hsin-Te Yuan <yuanhsinte@xxxxxxxxxxxx>
>
>