On 21/12/23 10:42 pm, Darrick J. Wong wrote:
On Thu, Dec 21, 2023 at 11:42:31AM +0530, Disha Goel wrote:
In some distributions, __u64 is already defined in system header files,
causing compilation errors when building xfstest.
# make
[CC] ext4_resize
ext4_resize.c:17:28: error: conflicting types for '__u64'
typedef unsigned long long __u64;
^~~~~
In file included from /usr/include/asm/types.h:26:0,
from /usr/include/linux/types.h:5,
from /usr/include/linux/mount.h:4,
from /usr/include/sys/mount.h:32,
from ext4_resize.c:15:
/usr/include/asm-generic/int-l64.h:30:23: note: previous declaration of '__u64' was here
typedef unsigned long __u64;
^~~~~
To address this issue, replace the custom definition of __u64 with the
standard uint64_t type from <stdint.h>. uint64_t is part of the C99
standard, offering a standardised approach for representing unsigned
64-bit integers. This modification enhances code consistency and
ensures compatibility with standard types.
...but isn't consistent with the definition in the kernel uapi headers.
ioctls explicitly use __u64, not uint64_t, and there are a few arches
(apparently) where __u64 ends up an unsigned long long but uint64_t ends
up an unsigned long, and the reverse.
Thanks for reviewing the patch. I will take care of this and address in v2.
Tested on various distributions on Power architecture, by successfully
compiling xfstest. Additionally, verified the compatibility by running
ext4/033 and ext4/056 tests, both of which use ext4_resize and
observed successful test execution.
# make
[CC] detached_mounts_propagation
[CC] ext4_resize
[CC] t_readdir_3
Signed-off-by: Disha Goel <disgoel@xxxxxxxxxxxxx>
---
src/ext4_resize.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/src/ext4_resize.c b/src/ext4_resize.c
index 78b66432..6e60ee5b 100644
--- a/src/ext4_resize.c
+++ b/src/ext4_resize.c
@@ -14,10 +14,8 @@
#include <sys/ioctl.h>
#include <sys/mount.h>
Why not #include <linux/ext4.h>, which gets you both the __u64 typedef
and EXT4_IOC_RESIZE_FS?
--D
The #include <linux/ext4.h> got added in kernel 6.4 and distros which
I'm testing does not have <linux/ext4.h> present in kernel headers.
We can add #include <linux/types.h> which also gets the __u64 typedef.
Let me know your thoughts.
-typedef unsigned long long __u64;
-
#ifndef EXT4_IOC_RESIZE_FS
-#define EXT4_IOC_RESIZE_FS _IOW('f', 16, __u64)
+#define EXT4_IOC_RESIZE_FS _IOW('f', 16, uint64_t)
#endif
#define pr_error(fmt, ...) do { \
@@ -31,7 +29,7 @@ static void usage(void)
int main(int argc, char **argv)
{
- __u64 new_size;
+ uint64_t new_size;
int error, fd;
char *mnt_dir = NULL, *tmp = NULL;
--
2.39.1