# git rev-parse -q --verify 1c27f1fc1549f0e470429f5497a76ad28a37f21a^{commit} 1c27f1fc1549f0e470429f5497a76ad28a37f21a already have revision, skipping fetch # git checkout -q -f -B kisskb 1c27f1fc1549f0e470429f5497a76ad28a37f21a # git clean -qxdf # < git log -1 # commit 1c27f1fc1549f0e470429f5497a76ad28a37f21a # Author: Linus Torvalds # Date: Sat Jun 11 10:30:20 2022 -0700 # # iov_iter: fix build issue due to possible type mis-match # # Commit 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()") # introduced a problem on some 32-bit architectures (at least arm, xtensa, # csky,sparc and mips), that have a 'size_t' that is 'unsigned int'. # # The reason is that we now do # # min(nr * PAGE_SIZE - offset, maxsize); # # where 'nr' and 'offset' and both 'unsigned int', and PAGE_SIZE is # 'unsigned long'. As a result, the normal C type rules means that the # first argument to 'min()' ends up being 'unsigned long'. # # In contrast, 'maxsize' is of type 'size_t'. # # Now, 'size_t' and 'unsigned long' are always the same physical type in # the kernel, so you'd think this doesn't matter, and from an actual # arithmetic standpoint it doesn't. # # But on 32-bit architectures 'size_t' is commonly 'unsigned int', even if # it could also be 'unsigned long'. In that situation, both are unsigned # 32-bit types, but they are not the *same* type. # # And as a result 'min()' will complain about the distinct types (ignore # the "pointer types" part of the error message: that's an artifact of the # way we have made 'min()' check types for being the same): # # lib/iov_iter.c: In function 'iter_xarray_get_pages': # include/linux/minmax.h:20:35: error: comparison of distinct pointer types lacks a cast [-Werror] # 20 | (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1))) # | ^~ # lib/iov_iter.c:1464:16: note: in expansion of macro 'min' # 1464 | return min(nr * PAGE_SIZE - offset, maxsize); # | ^~~ # # This was not visible on 64-bit architectures (where we always define # 'size_t' to be 'unsigned long'). # # Force these cases to use 'min_t(size_t, x, y)' to make the type explicit # and avoid the issue. # # [ Nit-picky note: technically 'size_t' doesn't have to match 'unsigned # long' arithmetically. We've certainly historically seen environments # with 16-bit address spaces and 32-bit 'unsigned long'. # # Similarly, even in 64-bit modern environments, 'size_t' could be its # own type distinct from 'unsigned long', even if it were arithmetically # identical. # # So the above type commentary is only really descriptive of the kernel # environment, not some kind of universal truth for the kinds of wild # and crazy situations that are allowed by the C standard ] # # Reported-by: Sudip Mukherjee # Link: https://lore.kernel.org/all/YqRyL2sIqQNDfky2@debian/ # Cc: Jeff Layton # Cc: David Howells # Cc: Al Viro # Signed-off-by: Linus Torvalds # < /opt/cross/kisskb/korg/gcc-11.1.0-nolibc/powerpc64-linux/bin/powerpc64-linux-gcc --version # < /opt/cross/kisskb/korg/gcc-11.1.0-nolibc/powerpc64-linux/bin/powerpc64-linux-ld --version # < git log --format=%s --max-count=1 1c27f1fc1549f0e470429f5497a76ad28a37f21a # < make -s -j 32 ARCH=powerpc O=/kisskb/build/linus_skiroot_defconfig_powerpc-gcc11 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-11.1.0-nolibc/powerpc64-linux/bin/powerpc64-linux- skiroot_defconfig # < make -s -j 32 ARCH=powerpc O=/kisskb/build/linus_skiroot_defconfig_powerpc-gcc11 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-11.1.0-nolibc/powerpc64-linux/bin/powerpc64-linux- help # make -s -j 32 ARCH=powerpc O=/kisskb/build/linus_skiroot_defconfig_powerpc-gcc11 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-11.1.0-nolibc/powerpc64-linux/bin/powerpc64-linux- olddefconfig # make -s -j 32 ARCH=powerpc O=/kisskb/build/linus_skiroot_defconfig_powerpc-gcc11 CROSS_COMPILE=/opt/cross/kisskb/korg/gcc-11.1.0-nolibc/powerpc64-linux/bin/powerpc64-linux- In file included from /kisskb/src/include/linux/byteorder/little_endian.h:5, from /kisskb/src/arch/powerpc/include/uapi/asm/byteorder.h:12, from /kisskb/src/include/asm-generic/bitops/le.h:6, from /kisskb/src/arch/powerpc/include/asm/bitops.h:336, from /kisskb/src/include/linux/bitops.h:33, from /kisskb/src/include/linux/kernel.h:22, from /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c:46: /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c: In function '_base_make_ioc_operational': /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c:5397:40: warning: array subscript 'Mpi2SasIOUnitPage1_t {aka struct _MPI2_CONFIG_PAGE_SASIOUNIT_1}[0]' is partly outside array bounds of 'unsigned char[20]' [-Warray-bounds] 5397 | (le16_to_cpu(sas_iounit_pg1->SASWideMaxQueueDepth)) ? /kisskb/src/include/uapi/linux/byteorder/little_endian.h:37:51: note: in definition of macro '__le16_to_cpu' 37 | #define __le16_to_cpu(x) ((__force __u16)(__le16)(x)) | ^ /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c:5397:14: note: in expansion of macro 'le16_to_cpu' 5397 | (le16_to_cpu(sas_iounit_pg1->SASWideMaxQueueDepth)) ? | ^~~~~~~~~~~ /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c:5383:26: note: referencing an object of size 20 allocated by 'kzalloc' 5383 | sas_iounit_pg1 = kzalloc(sz, GFP_KERNEL); | ^~~~~~~~~~~~~~~~~~~~~~~ In file included from /kisskb/src/include/linux/byteorder/little_endian.h:5, from /kisskb/src/arch/powerpc/include/uapi/asm/byteorder.h:12, from /kisskb/src/include/asm-generic/bitops/le.h:6, from /kisskb/src/arch/powerpc/include/asm/bitops.h:336, from /kisskb/src/include/linux/bitops.h:33, from /kisskb/src/include/linux/kernel.h:22, from /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c:46: /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c:5401:40: warning: array subscript 'Mpi2SasIOUnitPage1_t {aka struct _MPI2_CONFIG_PAGE_SASIOUNIT_1}[0]' is partly outside array bounds of 'unsigned char[20]' [-Warray-bounds] 5401 | (le16_to_cpu(sas_iounit_pg1->SASNarrowMaxQueueDepth)) ? /kisskb/src/include/uapi/linux/byteorder/little_endian.h:37:51: note: in definition of macro '__le16_to_cpu' 37 | #define __le16_to_cpu(x) ((__force __u16)(__le16)(x)) | ^ /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c:5401:14: note: in expansion of macro 'le16_to_cpu' 5401 | (le16_to_cpu(sas_iounit_pg1->SASNarrowMaxQueueDepth)) ? | ^~~~~~~~~~~ /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c:5383:26: note: referencing an object of size 20 allocated by 'kzalloc' 5383 | sas_iounit_pg1 = kzalloc(sz, GFP_KERNEL); | ^~~~~~~~~~~~~~~~~~~~~~~ /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c:5404:43: warning: array subscript 'Mpi2SasIOUnitPage1_t {aka struct _MPI2_CONFIG_PAGE_SASIOUNIT_1}[0]' is partly outside array bounds of 'unsigned char[20]' [-Warray-bounds] 5404 | ioc->max_sata_qd = (sas_iounit_pg1->SATAMaxQDepth) ? | ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~ /kisskb/src/drivers/scsi/mpt3sas/mpt3sas_base.c:5383:26: note: referencing an object of size 20 allocated by 'kzalloc' 5383 | sas_iounit_pg1 = kzalloc(sz, GFP_KERNEL); | ^~~~~~~~~~~~~~~~~~~~~~~ Completed OK # rm -rf /kisskb/build/linus_skiroot_defconfig_powerpc-gcc11 # Build took: 0:01:29.243034