xfs: Fix undefined behavior of shift into sign bit
authorGeert Uytterhoeven <geert+renesas@glider.be>
Sun, 4 Jun 2023 18:09:27 +0000 (04:09 +1000)
committerDave Chinner <david@fromorbit.com>
Sun, 4 Jun 2023 18:09:27 +0000 (04:09 +1000)
commit4320f34666363e202f8c290869c2d78c1ce9f3f1
treed040167009790ca121bb2e69db731006794b55ed
parent82842fee6e5979ca7e2bf4d839ef890c22ffb7aa
xfs: Fix undefined behavior of shift into sign bit

With gcc-5:

    In file included from ./include/trace/define_trace.h:102:0,
     from ./fs/xfs/scrub/trace.h:988,
     from fs/xfs/scrub/trace.c:40:
    ./fs/xfs/./scrub/trace.h: In function ‘trace_raw_output_xchk_fsgate_class’:
    ./fs/xfs/scrub/scrub.h:111:28: error: initializer element is not constant
     #define XREP_ALREADY_FIXED (1 << 31) /* checking our repair work */
^

Shifting the (signed) value 1 into the sign bit is undefined behavior.

Fix this for all definitions in the file by shifting "1U" instead of
"1".

This was exposed by the first user added in commit 466c525d6d35e691
("xfs: minimize overhead of drain wakeups by using jump labels").

Fixes: 160b5a784525e8a4 ("xfs: hoist the already_fixed variable to the scrub context")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/scrub/scrub.h