Hide Forgot
Description of problem: When I built latest upstream xfsprogs(HEAD=28bbc15a60d7ffb5fc9e28bbc16c67916a831ece) on RHEL-8, I got below error: Building io [CC] stat.o In file included from /usr/include/sys/stat.h:446, from ../include/xfs/linux.h:13, from ../include/xfs.h:9, from ../include/project.h:10, from ../include/input.h:12, from stat.c:13: /usr/include/bits/statx.h:25:8: error: redefinition of ‘struct statx_timestamp’ struct statx_timestamp ^~~~~~~~~~~~~~~ In file included from stat.c:10: /usr/include/linux/stat.h:56:8: note: originally defined here struct statx_timestamp { ^~~~~~~~~~~~~~~ In file included from /usr/include/sys/stat.h:446, from ../include/xfs/linux.h:13, from ../include/xfs.h:9, from ../include/project.h:10, from ../include/input.h:12, from stat.c:13: /usr/include/bits/statx.h:36:8: error: redefinition of ‘struct statx’ struct statx ^~~~~ In file included from stat.c:10: /usr/include/linux/stat.h:99:8: note: originally defined here struct statx { ^~~~~ gmake[2]: *** [../include/buildrules:81: stat.o] Error 1 gmake[1]: *** [include/buildrules:36: io] Error 2 make: *** [Makefile:92: default] Error 2 Version-Release number of selected component (if applicable): glibc-headers-2.28-42.el8.x86_64 kernel-headers-4.18.0-80.el8.x86_64 How reproducible: 100% Steps to Reproduce: # git clone git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git # git checkout -b for-next origin/for-next # make Actual results: As above Expected results: Additional info: A trick[1] as below can avoid this issue. But bits/statx.h already metioned[2] the kernel may add additional fields to struct statx in the future. So I suppose glibc might already has a proper strategy to deal with this conflict. [1] --- /usr/include/bits/statx.h.old 2019-04-12 00:16:43.028623409 -0400 +++ /usr/include/bits/statx.h 2019-04-12 00:09:12.318449804 -0400 @@ -20,7 +20,6 @@ #ifndef _SYS_STAT_H # error Never include <bits/stat.x.h> directly, include <sys/stat.h> instead. -#endif struct statx_timestamp { @@ -81,6 +80,8 @@ struct statx #define STATX_ATTR_ENCRYPTED 0x0800 #define STATX_ATTR_AUTOMOUNT 0x1000 +#endif + __BEGIN_DECLS /* Fill *BUF with information about PATH in DIRFD. */ [2] /* Warning: The kernel may add additional fields to this struct in the future. Only use this struct for calling the statx function, not for storing data. (Expansion will be controlled by the mask argument of the statx function.) */
Just FWIW, we worked around this upstream in xfsprogs: commit 868d0cce41645d5a240a7728cdf33b074b3d01f0 Author: Eric Sandeen <sandeen@redhat.com> Date: Fri May 3 11:51:37 2019 -0500 xfs_io: rework includes for statx structures Only include the kernel's linux/stat.h headers if we haven't already picked up statx bits from glibc, to avoid redefinition. Suggested-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Eric Sandeen <sandeen@redhat.com> Tested-by: Bill O'Donnell <billodo@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Bill O'Donnell <billodo@redhat.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
(TBH I thought this was a problem unique to xfsprogs)
I proposed a patch upstream: https://sourceware.org/ml/libc-alpha/2019-06/msg00072.html
I backported the following upstream commits: commit 4e75c2a43bb3208f32556a2b19c939cfe1f54ba6 Author: Florian Weimer <fweimer@redhat.com> Date: Wed Jun 12 10:41:19 2019 +0200 <sys/cdefs.h>: Add __glibc_has_include macro commit 5dad6ffbb2b76215cfcd38c3001778536ada8e8a Author: Florian Weimer <fweimer@redhat.com> Date: Wed Jun 12 12:04:09 2019 +0200 <sys/stat.h>: Use Linux UAPI header for statx if available and useful This will automatically import new STATX_* constants. It also avoids a conflict between <sys/stat.h> and <linux/stat.h>. commit 8d141877e07cc594e9fefc3795b8ba729288093c Author: Florian Weimer <fweimer@redhat.com> Date: Fri Jun 14 15:46:02 2019 +0200 <sys/cdefs.h>: Inhibit macro expansion for __glibc_has_include This is currently ineffective with GCC because of GCC PR 80005, but it makes sense to anticipate a fix for this defect. commit 48c3c1238925410b4e777dc94e2fde4cc9132d44 Author: Florian Weimer <fweimer@redhat.com> Date: Fri Jun 14 16:28:41 2019 +0200 Linux: Fix __glibc_has_include use for <sys/stat.h> and statx The identifier linux is used as a predefined macro, so the actually used path is 1/stat.h or 1/stat64.h. Using the quote-based version triggers a file lookup for /usr/include/bits/linux/stat.h (or whatever directory is used to store bits/statx.h), but since bits/ is pretty much reserved by glibc, this appears to be acceptable. This is related to GCC PR 80005: incorrect macro expansion of the argument of __has_include.
Verified with xfsprogs-5.0.0 without https://bugzilla.redhat.com/show_bug.cgi?id=1699194#c3 commit. Added sanity check that there is no conflict in case of both linux/stat.h and sys/stat.h headers are included.
Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://access.redhat.com/errata/RHSA-2019:3513