--- /dev/null
+From 1c27f1fc1549f0e470429f5497a76ad28a37f21a Mon Sep 17 00:00:00 2001
+From: Linus Torvalds <torvalds@linux-foundation.org>
+Date: Sat, 11 Jun 2022 10:30:20 -0700
+Subject: iov_iter: fix build issue due to possible type mis-match
+
+From: Linus Torvalds <torvalds@linux-foundation.org>
+
+commit 1c27f1fc1549f0e470429f5497a76ad28a37f21a upstream.
+
+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 <sudipm.mukherjee@gmail.com>
+Link: https://lore.kernel.org/all/YqRyL2sIqQNDfky2@debian/
+Cc: Jeff Layton <jlayton@kernel.org>
+Cc: David Howells <dhowells@redhat.com>
+Cc: Al Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ lib/iov_iter.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/lib/iov_iter.c
++++ b/lib/iov_iter.c
+@@ -1461,7 +1461,7 @@ static ssize_t iter_xarray_get_pages(str
+ if (nr == 0)
+ return 0;
+
+- return min(nr * PAGE_SIZE - offset, maxsize);
++ return min_t(size_t, nr * PAGE_SIZE - offset, maxsize);
+ }
+
+ /* must be done on non-empty ITER_IOVEC one */
+@@ -1625,7 +1625,7 @@ static ssize_t iter_xarray_get_pages_all
+ if (nr == 0)
+ return 0;
+
+- return min(nr * PAGE_SIZE - offset, maxsize);
++ return min_t(size_t, nr * PAGE_SIZE - offset, maxsize);
+ }
+
+ ssize_t iov_iter_get_pages_alloc(struct iov_iter *i,