* [PATCH] fstests: fix blksize_t printf format warnings across architectures
@ 2024-11-20 11:40 Anand Jain
2024-11-20 16:28 ` Darrick J. Wong
2024-11-20 22:06 ` Qu Wenruo
0 siblings, 2 replies; 6+ messages in thread
From: Anand Jain @ 2024-11-20 11:40 UTC (permalink / raw)
To: fstests; +Cc: linux-btrfs, linux-xfs
Fix format string warnings when printing blksize_t values that vary
across architectures. The warning occurs because blksize_t is defined
differently between architectures: aarch64 architectures blksize_t is
int, on x86-64 it's long-int. Cast the values to long. Fixes warnings
as below.
seek_sanity_test.c:110:45: warning: format '%ld' expects argument of type
'long int', but argument 3 has type 'blksize_t' {aka 'int'}
attr_replace_test.c:70:22: warning: format '%ld' expects argument of type
'long int', but argument 3 has type '__blksize_t' {aka 'int'}
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
src/attr_replace_test.c | 2 +-
src/seek_sanity_test.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/attr_replace_test.c b/src/attr_replace_test.c
index 1218e7264c8f..5d560a633361 100644
--- a/src/attr_replace_test.c
+++ b/src/attr_replace_test.c
@@ -67,7 +67,7 @@ int main(int argc, char *argv[])
if (ret < 0) die();
size = sbuf.st_blksize * 3 / 4;
if (!size)
- fail("Invalid st_blksize(%ld)\n", sbuf.st_blksize);
+ fail("Invalid st_blksize(%ld)\n", (long)sbuf.st_blksize);
size = MIN(size, maxsize);
value = malloc(size);
if (!value)
diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c
index a61ed3da9a8f..c5930357911f 100644
--- a/src/seek_sanity_test.c
+++ b/src/seek_sanity_test.c
@@ -107,7 +107,7 @@ static int get_io_sizes(int fd)
offset += pos ? 0 : 1;
alloc_size = offset;
done:
- fprintf(stdout, "Allocation size: %ld\n", alloc_size);
+ fprintf(stdout, "Allocation size: %ld\n", (long)alloc_size);
return 0;
fail:
--
2.47.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] fstests: fix blksize_t printf format warnings across architectures 2024-11-20 11:40 [PATCH] fstests: fix blksize_t printf format warnings across architectures Anand Jain @ 2024-11-20 16:28 ` Darrick J. Wong 2024-11-21 2:04 ` Anand Jain 2024-11-20 22:06 ` Qu Wenruo 1 sibling, 1 reply; 6+ messages in thread From: Darrick J. Wong @ 2024-11-20 16:28 UTC (permalink / raw) To: Anand Jain; +Cc: fstests, linux-btrfs, linux-xfs On Wed, Nov 20, 2024 at 07:40:41PM +0800, Anand Jain wrote: > Fix format string warnings when printing blksize_t values that vary > across architectures. The warning occurs because blksize_t is defined > differently between architectures: aarch64 architectures blksize_t is > int, on x86-64 it's long-int. Cast the values to long. Fixes warnings > as below. > > seek_sanity_test.c:110:45: warning: format '%ld' expects argument of type > 'long int', but argument 3 has type 'blksize_t' {aka 'int'} > > attr_replace_test.c:70:22: warning: format '%ld' expects argument of type > 'long int', but argument 3 has type '__blksize_t' {aka 'int'} > > Signed-off-by: Anand Jain <anand.jain@oracle.com> I waded through a whole bunch of glibc typedef and macro crud and discovered that on x64 it can even be long long. I think. There were so many levels of indirection that I am not certain that my analysis was correct. :( However, I don't see any harm in explicitly casting to long. Nobody has yet come up with a 8GB fsblock filesystem, so we're ok for now. :P Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> --D > --- > src/attr_replace_test.c | 2 +- > src/seek_sanity_test.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/src/attr_replace_test.c b/src/attr_replace_test.c > index 1218e7264c8f..5d560a633361 100644 > --- a/src/attr_replace_test.c > +++ b/src/attr_replace_test.c > @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) > if (ret < 0) die(); > size = sbuf.st_blksize * 3 / 4; > if (!size) > - fail("Invalid st_blksize(%ld)\n", sbuf.st_blksize); > + fail("Invalid st_blksize(%ld)\n", (long)sbuf.st_blksize); > size = MIN(size, maxsize); > value = malloc(size); > if (!value) > diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c > index a61ed3da9a8f..c5930357911f 100644 > --- a/src/seek_sanity_test.c > +++ b/src/seek_sanity_test.c > @@ -107,7 +107,7 @@ static int get_io_sizes(int fd) > offset += pos ? 0 : 1; > alloc_size = offset; > done: > - fprintf(stdout, "Allocation size: %ld\n", alloc_size); > + fprintf(stdout, "Allocation size: %ld\n", (long)alloc_size); > return 0; > > fail: > -- > 2.47.0 > > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] fstests: fix blksize_t printf format warnings across architectures 2024-11-20 16:28 ` Darrick J. Wong @ 2024-11-21 2:04 ` Anand Jain 0 siblings, 0 replies; 6+ messages in thread From: Anand Jain @ 2024-11-21 2:04 UTC (permalink / raw) To: Darrick J. Wong; +Cc: fstests, linux-btrfs, linux-xfs On 21/11/24 00:28, Darrick J. Wong wrote: > On Wed, Nov 20, 2024 at 07:40:41PM +0800, Anand Jain wrote: >> Fix format string warnings when printing blksize_t values that vary >> across architectures. The warning occurs because blksize_t is defined >> differently between architectures: aarch64 architectures blksize_t is >> int, on x86-64 it's long-int. Cast the values to long. Fixes warnings >> as below. >> >> seek_sanity_test.c:110:45: warning: format '%ld' expects argument of type >> 'long int', but argument 3 has type 'blksize_t' {aka 'int'} >> >> attr_replace_test.c:70:22: warning: format '%ld' expects argument of type >> 'long int', but argument 3 has type '__blksize_t' {aka 'int'} >> >> Signed-off-by: Anand Jain <anand.jain@oracle.com> > > I waded through a whole bunch of glibc typedef and macro crud and > discovered that on x64 it can even be long long. I think. There were > so many levels of indirection that I am not certain that my analysis was > correct. :( > Per preprocessor, it verifies blksize_t is long int and int on x86-64 and aarch64, respectively. gcc -E -P -dD -x c - < <(echo '#include <sys/types.h>') | grep blksize_t x86-64 typedef long int __blksize_t; typedef __blksize_t blksize_t; aarch64 typedef int __blksize_t; typedef __blksize_t blksize_t; Thanks, Anand > However, I don't see any harm in explicitly casting to long. Nobody has > yet come up with a 8GB fsblock filesystem, so we're ok for now. :P > > Reviewed-by: "Darrick J. Wong" <djwong@kernel.org> > > --D > >> --- >> src/attr_replace_test.c | 2 +- >> src/seek_sanity_test.c | 2 +- >> 2 files changed, 2 insertions(+), 2 deletions(-) >> >> diff --git a/src/attr_replace_test.c b/src/attr_replace_test.c >> index 1218e7264c8f..5d560a633361 100644 >> --- a/src/attr_replace_test.c >> +++ b/src/attr_replace_test.c >> @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) >> if (ret < 0) die(); >> size = sbuf.st_blksize * 3 / 4; >> if (!size) >> - fail("Invalid st_blksize(%ld)\n", sbuf.st_blksize); >> + fail("Invalid st_blksize(%ld)\n", (long)sbuf.st_blksize); >> size = MIN(size, maxsize); >> value = malloc(size); >> if (!value) >> diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c >> index a61ed3da9a8f..c5930357911f 100644 >> --- a/src/seek_sanity_test.c >> +++ b/src/seek_sanity_test.c >> @@ -107,7 +107,7 @@ static int get_io_sizes(int fd) >> offset += pos ? 0 : 1; >> alloc_size = offset; >> done: >> - fprintf(stdout, "Allocation size: %ld\n", alloc_size); >> + fprintf(stdout, "Allocation size: %ld\n", (long)alloc_size); >> return 0; >> >> fail: >> -- >> 2.47.0 >> >> ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] fstests: fix blksize_t printf format warnings across architectures 2024-11-20 11:40 [PATCH] fstests: fix blksize_t printf format warnings across architectures Anand Jain 2024-11-20 16:28 ` Darrick J. Wong @ 2024-11-20 22:06 ` Qu Wenruo 2024-11-20 22:21 ` Darrick J. Wong 1 sibling, 1 reply; 6+ messages in thread From: Qu Wenruo @ 2024-11-20 22:06 UTC (permalink / raw) To: Anand Jain, fstests; +Cc: linux-btrfs, linux-xfs 在 2024/11/20 22:10, Anand Jain 写道: > Fix format string warnings when printing blksize_t values that vary > across architectures. The warning occurs because blksize_t is defined > differently between architectures: aarch64 architectures blksize_t is > int, on x86-64 it's long-int. Cast the values to long. Fixes warnings > as below. > > seek_sanity_test.c:110:45: warning: format '%ld' expects argument of type > 'long int', but argument 3 has type 'blksize_t' {aka 'int'} > > attr_replace_test.c:70:22: warning: format '%ld' expects argument of type > 'long int', but argument 3 has type '__blksize_t' {aka 'int'} Why not just use %zu instead? Thanks, Qu > > Signed-off-by: Anand Jain <anand.jain@oracle.com> > --- > src/attr_replace_test.c | 2 +- > src/seek_sanity_test.c | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/src/attr_replace_test.c b/src/attr_replace_test.c > index 1218e7264c8f..5d560a633361 100644 > --- a/src/attr_replace_test.c > +++ b/src/attr_replace_test.c > @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) > if (ret < 0) die(); > size = sbuf.st_blksize * 3 / 4; > if (!size) > - fail("Invalid st_blksize(%ld)\n", sbuf.st_blksize); > + fail("Invalid st_blksize(%ld)\n", (long)sbuf.st_blksize); > size = MIN(size, maxsize); > value = malloc(size); > if (!value) > diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c > index a61ed3da9a8f..c5930357911f 100644 > --- a/src/seek_sanity_test.c > +++ b/src/seek_sanity_test.c > @@ -107,7 +107,7 @@ static int get_io_sizes(int fd) > offset += pos ? 0 : 1; > alloc_size = offset; > done: > - fprintf(stdout, "Allocation size: %ld\n", alloc_size); > + fprintf(stdout, "Allocation size: %ld\n", (long)alloc_size); > return 0; > > fail: ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] fstests: fix blksize_t printf format warnings across architectures 2024-11-20 22:06 ` Qu Wenruo @ 2024-11-20 22:21 ` Darrick J. Wong 2024-11-20 23:10 ` Qu Wenruo 0 siblings, 1 reply; 6+ messages in thread From: Darrick J. Wong @ 2024-11-20 22:21 UTC (permalink / raw) To: Qu Wenruo; +Cc: Anand Jain, fstests, linux-btrfs, linux-xfs On Thu, Nov 21, 2024 at 08:36:58AM +1030, Qu Wenruo wrote: > > > 在 2024/11/20 22:10, Anand Jain 写道: > > Fix format string warnings when printing blksize_t values that vary > > across architectures. The warning occurs because blksize_t is defined > > differently between architectures: aarch64 architectures blksize_t is > > int, on x86-64 it's long-int. Cast the values to long. Fixes warnings > > as below. > > > > seek_sanity_test.c:110:45: warning: format '%ld' expects argument of type > > 'long int', but argument 3 has type 'blksize_t' {aka 'int'} > > > > attr_replace_test.c:70:22: warning: format '%ld' expects argument of type > > 'long int', but argument 3 has type '__blksize_t' {aka 'int'} > > Why not just use %zu instead? From printf(3): z A following integer conversion corresponds to a size_t or ssize_t argument, or a following n conversion corre‐ sponds to a pointer to a size_t argument. blksize_t is not a ssize_t. --D > Thanks, > Qu > > > > > Signed-off-by: Anand Jain <anand.jain@oracle.com> > > --- > > src/attr_replace_test.c | 2 +- > > src/seek_sanity_test.c | 2 +- > > 2 files changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/src/attr_replace_test.c b/src/attr_replace_test.c > > index 1218e7264c8f..5d560a633361 100644 > > --- a/src/attr_replace_test.c > > +++ b/src/attr_replace_test.c > > @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) > > if (ret < 0) die(); > > size = sbuf.st_blksize * 3 / 4; > > if (!size) > > - fail("Invalid st_blksize(%ld)\n", sbuf.st_blksize); > > + fail("Invalid st_blksize(%ld)\n", (long)sbuf.st_blksize); > > size = MIN(size, maxsize); > > value = malloc(size); > > if (!value) > > diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c > > index a61ed3da9a8f..c5930357911f 100644 > > --- a/src/seek_sanity_test.c > > +++ b/src/seek_sanity_test.c > > @@ -107,7 +107,7 @@ static int get_io_sizes(int fd) > > offset += pos ? 0 : 1; > > alloc_size = offset; > > done: > > - fprintf(stdout, "Allocation size: %ld\n", alloc_size); > > + fprintf(stdout, "Allocation size: %ld\n", (long)alloc_size); > > return 0; > > > > fail: > > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] fstests: fix blksize_t printf format warnings across architectures 2024-11-20 22:21 ` Darrick J. Wong @ 2024-11-20 23:10 ` Qu Wenruo 0 siblings, 0 replies; 6+ messages in thread From: Qu Wenruo @ 2024-11-20 23:10 UTC (permalink / raw) To: Darrick J. Wong, Qu Wenruo; +Cc: Anand Jain, fstests, linux-btrfs, linux-xfs 在 2024/11/21 08:51, Darrick J. Wong 写道: > On Thu, Nov 21, 2024 at 08:36:58AM +1030, Qu Wenruo wrote: >> >> >> 在 2024/11/20 22:10, Anand Jain 写道: >>> Fix format string warnings when printing blksize_t values that vary >>> across architectures. The warning occurs because blksize_t is defined >>> differently between architectures: aarch64 architectures blksize_t is >>> int, on x86-64 it's long-int. Cast the values to long. Fixes warnings >>> as below. >>> >>> seek_sanity_test.c:110:45: warning: format '%ld' expects argument of type >>> 'long int', but argument 3 has type 'blksize_t' {aka 'int'} >>> >>> attr_replace_test.c:70:22: warning: format '%ld' expects argument of type >>> 'long int', but argument 3 has type '__blksize_t' {aka 'int'} >> >> Why not just use %zu instead? > > From printf(3): > > z A following integer conversion corresponds to a size_t > or ssize_t argument, or a following n conversion corre‐ > sponds to a pointer to a size_t argument. > > blksize_t is not a ssize_t. You're right, it's indeed different and it's more complex than I thought. blksize_t is __SYSCALL_SLONG_TYPE, which has extra handling on x86_64 with its x32 mode handling. Only for x86_64 x32 mode it is __SQUAD_TYPE (depending on wordsize again) otherwise it's __SLONGWORD_TYPE (fixed to long int). Meanwhile ssize_t is __SWORD_TYPE, which is only dependent on word size. For 32bit word size it's __int64_t, and for 64bit it's long int. So blksize_t is more weird than ssize_t. Then force converting to long (int) is fine. > > --D > >> Thanks, >> Qu >> >>> >>> Signed-off-by: Anand Jain <anand.jain@oracle.com> >>> --- >>> src/attr_replace_test.c | 2 +- >>> src/seek_sanity_test.c | 2 +- >>> 2 files changed, 2 insertions(+), 2 deletions(-) >>> >>> diff --git a/src/attr_replace_test.c b/src/attr_replace_test.c >>> index 1218e7264c8f..5d560a633361 100644 >>> --- a/src/attr_replace_test.c >>> +++ b/src/attr_replace_test.c >>> @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) >>> if (ret < 0) die(); >>> size = sbuf.st_blksize * 3 / 4; >>> if (!size) >>> - fail("Invalid st_blksize(%ld)\n", sbuf.st_blksize); >>> + fail("Invalid st_blksize(%ld)\n", (long)sbuf.st_blksize); Although for this case, I'd prefer to use "long int" just for the sake of consistency. Otherwise looks good to me. Reviewed-by: Qu Wenruo <wqu@suse.com> Thanks, Qu >>> size = MIN(size, maxsize); >>> value = malloc(size); >>> if (!value) >>> diff --git a/src/seek_sanity_test.c b/src/seek_sanity_test.c >>> index a61ed3da9a8f..c5930357911f 100644 >>> --- a/src/seek_sanity_test.c >>> +++ b/src/seek_sanity_test.c >>> @@ -107,7 +107,7 @@ static int get_io_sizes(int fd) >>> offset += pos ? 0 : 1; >>> alloc_size = offset; >>> done: >>> - fprintf(stdout, "Allocation size: %ld\n", alloc_size); >>> + fprintf(stdout, "Allocation size: %ld\n", (long)alloc_size); >>> return 0; >>> >>> fail: >> >> > ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-11-21 2:04 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-11-20 11:40 [PATCH] fstests: fix blksize_t printf format warnings across architectures Anand Jain 2024-11-20 16:28 ` Darrick J. Wong 2024-11-21 2:04 ` Anand Jain 2024-11-20 22:06 ` Qu Wenruo 2024-11-20 22:21 ` Darrick J. Wong 2024-11-20 23:10 ` Qu Wenruo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox