On Tue, Sep 15, 2015 at 02:04:59PM +0530, Viresh Kumar wrote:
Long back 'bool' type used to be a typecast to 'int', but that changed
in v2.6.19. And that is a typecast to _Bool now, which (mostly) takes
just a byte. Anyway, the bool type is implementation defined, and better
we don't assume its size to be 4 bytes or 1.
The problem with current code is that it reads/writes 4 bytes for a
boolean, which will read/update 3 excess bytes following the boolean
variable (when sizeof(bool) is 1 byte). And that can lead to hard to fix
bugs. It was a nightmare cracking this one.
The debugfs code had this bug since the first time it got introduced,
but was never got caught, strange. Maybe the bool variables (monitored
by debugfs) were followed by an 'int' or something bigger and the pad
bytes made sure, we never see this issue.
But the OPP (Operating performance points) library have three booleans
allocated to contiguous bytes and this bug got hit quite soon (The
debugfs support for OPP is yet to be merged). It showed up as corruption
of the debugfs boolean symbols, where Y were becoming N and vice versa.
Fix it properly by changing the last argument of debugfs_create_bool(),
to type 'bool *' instead of 'u32 *', so that it doesn't depend on sizeof
bool at all.
That required updates to all user sites as well in a single commit.
regmap core was also using debugfs_{read|write}_file_bool(), directly
and variable types were updated for that to be bool as well.
Acked-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
For the minor wm_adsp change:
Acked-by: Charles Keepax <redacted>
Thanks,
Charles