fstests.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] xfstests: replace custom __u64 definition with uint64_t
@ 2023-12-21  6:12 Disha Goel
  2023-12-21 17:12 ` Darrick J. Wong
  0 siblings, 1 reply; 5+ messages in thread
From: Disha Goel @ 2023-12-21  6:12 UTC (permalink / raw)
  To: fstests; +Cc: ojaswin, ritesh.list, Disha Goel

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.

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@linux.ibm.com>
---
 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>
 
-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


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] xfstests: replace custom __u64 definition with uint64_t
  2023-12-21  6:12 [PATCH] xfstests: replace custom __u64 definition with uint64_t Disha Goel
@ 2023-12-21 17:12 ` Darrick J. Wong
  2023-12-26  8:44   ` Disha Goel
  0 siblings, 1 reply; 5+ messages in thread
From: Darrick J. Wong @ 2023-12-21 17:12 UTC (permalink / raw)
  To: Disha Goel; +Cc: fstests, ojaswin, ritesh.list

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.

> 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@linux.ibm.com>
> ---
>  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

>  
> -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
> 
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] xfstests: replace custom __u64 definition with uint64_t
  2023-12-21 17:12 ` Darrick J. Wong
@ 2023-12-26  8:44   ` Disha Goel
  2023-12-26 17:52     ` Darrick J. Wong
  0 siblings, 1 reply; 5+ messages in thread
From: Disha Goel @ 2023-12-26  8:44 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: fstests, ojaswin, ritesh.list

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@linux.ibm.com>
>> ---
>>   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
>>
>>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] xfstests: replace custom __u64 definition with uint64_t
  2023-12-26  8:44   ` Disha Goel
@ 2023-12-26 17:52     ` Darrick J. Wong
  2024-01-03 12:20       ` Disha Goel
  0 siblings, 1 reply; 5+ messages in thread
From: Darrick J. Wong @ 2023-12-26 17:52 UTC (permalink / raw)
  To: Disha Goel; +Cc: fstests, ojaswin, ritesh.list

On Tue, Dec 26, 2023 at 02:14:38PM +0530, Disha Goel wrote:
> 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@linux.ibm.com>
> > > ---
> > >   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.

Ah, linux/ext4.h didn't exist until 6.4.  Heh.  Well, in the long run
fstests really ought to pull in kernel ioctl definitions whenever
possible.  So:

I suppose this program should #include <linux/types.h> to get the __u64
definition, after which this can go away:

> > > -typedef unsigned long long __u64;

And then you'd need to add some m4/autoconf AC_CHECK_HEADERS magic for
configure to detect when #include <linux/ext4.h> actually results in a
compilable program; and set some make variable accordingly.

Then this program can grow a:

#ifdef HAVE_LINUX_EXT4_H
# include <linux/ext4.h>
#endif

After which this existing bit of cpp magic:

#ifndef EXT4_IOC_RESIZE_FS
# define EXT4_IOC_RESIZE_FS			_IOW('f', 16, __u64)
#endif

should work for everyone.

--D

> > > -
> > >   #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
> > > 
> > > 
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] xfstests: replace custom __u64 definition with uint64_t
  2023-12-26 17:52     ` Darrick J. Wong
@ 2024-01-03 12:20       ` Disha Goel
  0 siblings, 0 replies; 5+ messages in thread
From: Disha Goel @ 2024-01-03 12:20 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: fstests, ojaswin, ritesh.list

On 26/12/23 11:22 pm, Darrick J. Wong wrote:

> Ah, linux/ext4.h didn't exist until 6.4.  Heh.  Well, in the long run
> fstests really ought to pull in kernel ioctl definitions whenever
> possible.  So:
>
> I suppose this program should #include <linux/types.h> to get the __u64
> definition, after which this can go away:
>
>>>> -typedef unsigned long long __u64;
> And then you'd need to add some m4/autoconf AC_CHECK_HEADERS magic for
> configure to detect when #include <linux/ext4.h> actually results in a
> compilable program; and set some make variable accordingly.
>
> Then this program can grow a:
>
> #ifdef HAVE_LINUX_EXT4_H
> # include <linux/ext4.h>
> #endif
>
> After which this existing bit of cpp magic:
>
> #ifndef EXT4_IOC_RESIZE_FS
> # define EXT4_IOC_RESIZE_FS			_IOW('f', 16, __u64)
> #endif
>
> should work for everyone.
>
> --D

Sure, will address the changes in v2.

Thanks


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-01-03 12:20 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-21  6:12 [PATCH] xfstests: replace custom __u64 definition with uint64_t Disha Goel
2023-12-21 17:12 ` Darrick J. Wong
2023-12-26  8:44   ` Disha Goel
2023-12-26 17:52     ` Darrick J. Wong
2024-01-03 12:20       ` Disha Goel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).