Re: [PATCH] uapi/fcntl: conditionally define AT_RENAME* macros
From: Randy Dunlap <hidden>
Date: 2025-08-25 06:49:40
Also in:
linux-fsdevel, lkml
Hi Amir, On 8/24/25 10:58 PM, Amir Goldstein wrote:
On Mon, Aug 25, 2025 at 1:54 AM Randy Dunlap [off-list ref] wrote:quoted
On 8/24/25 4:21 PM, Matthew Wilcox wrote:quoted
On Sun, Aug 24, 2025 at 03:10:55PM -0700, Randy Dunlap wrote:quoted
Don't define the AT_RENAME_* macros when __USE_GNU is defined since /usr/include/stdio.h defines them in that case (i.e. when _GNU_SOURCE is defined, which causes __USE_GNU to be defined). Having them defined in 2 places causes build warnings (duplicate definitions) in both samples/watch_queue/watch_test.c and samples/vfs/test-statx.c.It does? What flags?for samples/vfs/test-statx.c: In file included from ../samples/vfs/test-statx.c:23: usr/include/linux/fcntl.h:159:9: warning: ‘AT_RENAME_NOREPLACE’ redefined 159 | #define AT_RENAME_NOREPLACE 0x0001 In file included from ../samples/vfs/test-statx.c:13: /usr/include/stdio.h:171:10: note: this is the location of the previous definition 171 | # define AT_RENAME_NOREPLACE RENAME_NOREPLACE usr/include/linux/fcntl.h:160:9: warning: ‘AT_RENAME_EXCHANGE’ redefined 160 | #define AT_RENAME_EXCHANGE 0x0002 /usr/include/stdio.h:173:10: note: this is the location of the previous definition 173 | # define AT_RENAME_EXCHANGE RENAME_EXCHANGE usr/include/linux/fcntl.h:161:9: warning: ‘AT_RENAME_WHITEOUT’ redefined 161 | #define AT_RENAME_WHITEOUT 0x0004 /usr/include/stdio.h:175:10: note: this is the location of the previous definition 175 | # define AT_RENAME_WHITEOUT RENAME_WHITEOUT for samples/watch_queue/watch_test.c: In file included from usr/include/linux/watch_queue.h:6, from ../samples/watch_queue/watch_test.c:19: usr/include/linux/fcntl.h:159:9: warning: ‘AT_RENAME_NOREPLACE’ redefined 159 | #define AT_RENAME_NOREPLACE 0x0001 In file included from ../samples/watch_queue/watch_test.c:11: /usr/include/stdio.h:171:10: note: this is the location of the previous definition 171 | # define AT_RENAME_NOREPLACE RENAME_NOREPLACE usr/include/linux/fcntl.h:160:9: warning: ‘AT_RENAME_EXCHANGE’ redefined 160 | #define AT_RENAME_EXCHANGE 0x0002 /usr/include/stdio.h:173:10: note: this is the location of the previous definition 173 | # define AT_RENAME_EXCHANGE RENAME_EXCHANGE usr/include/linux/fcntl.h:161:9: warning: ‘AT_RENAME_WHITEOUT’ redefined 161 | #define AT_RENAME_WHITEOUT 0x0004 /usr/include/stdio.h:175:10: note: this is the location of the previous definition 175 | # define AT_RENAME_WHITEOUT RENAME_WHITEOUT
quoted hunk ↗ jump to hunk
quoted
quoted
I'm pretty sure C says that duplicate definitions are fine as long as they're identical.The vales are identical but the strings are not identical. We can't fix stdio.h, but we could just change uapi/linux/fcntl.h to match stdio.h. I suppose.I do not specifically object to a patch like this (assuming that is works?):--- a/include/uapi/linux/fcntl.h +++ b/include/uapi/linux/fcntl.h@@ -156,9 +156,9 @@ */ /* Flags for renameat2(2) (must match legacy RENAME_* flags). */ -#define AT_RENAME_NOREPLACE 0x0001 -#define AT_RENAME_EXCHANGE 0x0002 -#define AT_RENAME_WHITEOUT 0x0004 +#define AT_RENAME_NOREPLACE RENAME_NOREPLACE +#define AT_RENAME_EXCHANGE RENAME_EXCHANGE +#define AT_RENAME_WHITEOUT RENAME_WHITEOUT
I'll test that.
But to be clear, this is a regression introduced by glibc that is likely to break many other builds, not only the kernel samples and even if we fix linux uapi to conform to its downstream copy of definitions, it won't help those users whose programs build was broken until they install kernel headers, so feels like you should report this regression to glibc and they'd better not "fix" the regression by copying the current definition string as that may change as per the patch above.
I'll look into that also.
Why would a library copy definitions from kernel uapi without wrapping them with #ifndef or #undef?
To me it looks like they stuck them into the wrong file - stdio.h instead of fcntl.h. thanks. -- ~Randy