Commit 1a4aabc2 authored by Hsin-Te Yuan's avatar Hsin-Te Yuan Committed by Rafael J. Wysocki
Browse files

thermal: sysfs: Return ENODATA instead of EAGAIN for reads



According to POSIX spec, EAGAIN returned by read with O_NONBLOCK set
means the read would block. Hence, the common implementation in
nonblocking model will poll the file when the nonblocking read returns
EAGAIN. However, when the target file is thermal zone, this mechanism
will totally malfunction because thermal zone doesn't implement sysfs
notification and thus the poll will never return.

For example, the read in Golang implemnts such method and sometimes
hangs at reading some thermal zones via sysfs.

Change to return -ENODATA instead of -EAGAIN to userspace.

Signed-off-by: default avatarHsin-Te Yuan <yuanhsinte@chromium.org>
Link: https://patch.msgid.link/20250620-temp-v3-1-6becc6aeb66c@chromium.org


Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent d0b3b7b2
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -40,10 +40,13 @@ temp_show(struct device *dev, struct device_attribute *attr, char *buf)

	ret = thermal_zone_get_temp(tz, &temperature);

	if (ret)
		return ret;

	if (!ret)
		return sprintf(buf, "%d\n", temperature);

	if (ret == -EAGAIN)
		return -ENODATA;

	return ret;
}

static ssize_t