Subject: Re: linux-next: build warnings after merge of the btrfs tree

From: David Sterba <[email-masked]>
Date: Tue, 12 Sep 2023 13:20:11 +0200

On Tue, Sep 12, 2023 at 10:46:46AM +1000, Stephen Rothwell wrote:
> Hi all,
> 
> After merging the btrfs tree, today's linux-next build (powerpc
> ppc64_defconfig) produced these warnings:
> 
> In file included from include/linux/swab.h:5,
>                  from include/uapi/linux/byteorder/big_endian.h:14,
>                  from include/linux/byteorder/big_endian.h:5,
>                  from arch/powerpc/include/uapi/asm/byteorder.h:14,
>                  from include/asm-generic/bitops/le.h:6,
>                  from arch/powerpc/include/asm/bitops.h:336,
>                  from include/linux/bitops.h:68,
>                  from fs/btrfs/extent_io.c:3:
> In function 'btrfs_disk_key_to_cpu',
>     inlined from 'btrfs_item_key_to_cpu' at fs/btrfs/accessors.h:648:2,
>     inlined from 'fiemap_find_last_extent_offset' at fs/btrfs/extent_io.c:2804:2,
>     inlined from 'extent_fiemap' at fs/btrfs/extent_io.c:2879:8:
> include/uapi/linux/swab.h:128:28: warning: 'disk_key.objectid' may be used uninitialized [-Wmaybe-uninitialized]
>   128 | #define __swab64(x) (__u64)__builtin_bswap64((__u64)(x))
>       |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/uapi/linux/byteorder/big_endian.h:33:26: note: in expansion of macro '__swab64'
>    33 | #define __le64_to_cpu(x) __swab64((__force __u64)(__le64)(x))
>       |                          ^~~~~~~~
> include/linux/byteorder/generic.h:87:21: note: in expansion of macro '__le64_to_cpu'
>    87 | #define le64_to_cpu __le64_to_cpu
>       |                     ^~~~~~~~~~~~~
> fs/btrfs/accessors.h:622:25: note: in expansion of macro 'le64_to_cpu'
>   622 |         cpu->objectid = le64_to_cpu(disk->objectid);
>       |                         ^~~~~~~~~~~
> In file included from fs/btrfs/extent_io.c:34:
> fs/btrfs/accessors.h: In function 'extent_fiemap':
> fs/btrfs/accessors.h:645:31: note: 'disk_key.objectid' was declared here
>   645 |         struct btrfs_disk_key disk_key;
>       |                               ^~~~~~~~
> In function 'fiemap_find_last_extent_offset',
>     inlined from 'extent_fiemap' at fs/btrfs/extent_io.c:2879:8:
> fs/btrfs/extent_io.c:2805:33: warning: 'disk_key.type' may be used uninitialized [-Wmaybe-uninitialized]
>  2805 |         if (key.objectid != ino || key.type != BTRFS_EXTENT_DATA_KEY) {
> fs/btrfs/accessors.h: In function 'extent_fiemap':
> fs/btrfs/accessors.h:645:31: note: 'disk_key.type' was declared here
>   645 |         struct btrfs_disk_key disk_key;
>       |                               ^~~~~~~~
> 
> I don't really have any idea what caused this (it *may* have been my
> change from gcc v12 to v13?).

I tried 12 and 13, no warnings on x86_64, however the report is on
powerpc. If this is on a big endian host it could be a valid warning, we
have an optmization where the on-disk format endianity matches CPU
(little endian) then the structures btrfs_disk_key and btrfs_key are
equivalent and no coversion is needed.

There were some changes that might be related and newly added to
for-next so we don't have any other reference point, I'll take a look.