* mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
@ 2022-06-11 10:45 Sudip Mukherjee
2022-06-11 10:55 ` Sudip Mukherjee
2022-06-11 12:12 ` Al Viro
0 siblings, 2 replies; 10+ messages in thread
From: Sudip Mukherjee @ 2022-06-11 10:45 UTC (permalink / raw)
To: David Howells, Al Viro
Cc: Dominique Martinet, Mike Marshall, Gao Xiang, linux-afs,
v9fs-developer, devel, linux-erofs, linux-cachefs, linux-fsdevel,
linux-kernel, Linus Torvalds
Hi All,
The latest mainline kernel branch fails to build for "arm allmodconfig",
"xtensa allmodconfig" and "csky allmodconfig" with the error:
In file included from ./include/linux/kernel.h:26,
from ./include/linux/crypto.h:16,
from ./include/crypto/hash.h:11,
from lib/iov_iter.c:2:
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)))
| ^~
./include/linux/minmax.h:26:18: note: in expansion of macro '__typecheck'
26 | (__typecheck(x, y) && __no_side_effects(x, y))
| ^~~~~~~~~~~
./include/linux/minmax.h:36:31: note: in expansion of macro '__safe_cmp'
36 | __builtin_choose_expr(__safe_cmp(x, y), \
| ^~~~~~~~~~
./include/linux/minmax.h:45:25: note: in expansion of macro '__careful_cmp'
45 | #define min(x, y) __careful_cmp(x, y, <)
| ^~~~~~~~~~~~~
lib/iov_iter.c:1464:16: note: in expansion of macro 'min'
1464 | return min(nr * PAGE_SIZE - offset, maxsize);
| ^~~
lib/iov_iter.c: In function 'iter_xarray_get_pages_alloc':
./include/linux/minmax.h:20:35: error: comparison of distinct pointer types lacks a cast [-Werror]
20 | (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
| ^~
./include/linux/minmax.h:26:18: note: in expansion of macro '__typecheck'
26 | (__typecheck(x, y) && __no_side_effects(x, y))
| ^~~~~~~~~~~
./include/linux/minmax.h:36:31: note: in expansion of macro '__safe_cmp'
36 | __builtin_choose_expr(__safe_cmp(x, y), \
| ^~~~~~~~~~
./include/linux/minmax.h:45:25: note: in expansion of macro '__careful_cmp'
45 | #define min(x, y) __careful_cmp(x, y, <)
| ^~~~~~~~~~~~~
lib/iov_iter.c:1628:16: note: in expansion of macro 'min'
1628 | return min(nr * PAGE_SIZE - offset, maxsize);
git bisect pointed to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
And, reverting it on top of mainline branch has fixed the build failure.
--
Regards
Sudip
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
2022-06-11 10:45 mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()") Sudip Mukherjee
@ 2022-06-11 10:55 ` Sudip Mukherjee
2022-06-11 12:12 ` Al Viro
1 sibling, 0 replies; 10+ messages in thread
From: Sudip Mukherjee @ 2022-06-11 10:55 UTC (permalink / raw)
To: David Howells, Al Viro
Cc: Dominique Martinet, Mike Marshall, Gao Xiang, linux-afs,
v9fs-developer, devel, linux-erofs, linux-cachefs, linux-fsdevel,
linux-kernel, Linus Torvalds
On Sat, Jun 11, 2022 at 11:45 AM Sudip Mukherjee
<sudipm.mukherjee@gmail.com> wrote:
>
> Hi All,
>
> The latest mainline kernel branch fails to build for "arm allmodconfig",
> "xtensa allmodconfig" and "csky allmodconfig" with the error:
missed adding "mips allmodconfig".
--
Regards
Sudip
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
2022-06-11 10:45 mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()") Sudip Mukherjee
2022-06-11 10:55 ` Sudip Mukherjee
@ 2022-06-11 12:12 ` Al Viro
2022-06-11 12:37 ` Al Viro
1 sibling, 1 reply; 10+ messages in thread
From: Al Viro @ 2022-06-11 12:12 UTC (permalink / raw)
To: Sudip Mukherjee
Cc: David Howells, Dominique Martinet, Mike Marshall, Gao Xiang,
linux-afs, v9fs-developer, devel, linux-erofs, linux-cachefs,
linux-fsdevel, linux-kernel, Linus Torvalds
On Sat, Jun 11, 2022 at 11:45:03AM +0100, Sudip Mukherjee wrote:
> Hi All,
>
> The latest mainline kernel branch fails to build for "arm allmodconfig",
> "xtensa allmodconfig" and "csky allmodconfig" with the error:
>
> In file included from ./include/linux/kernel.h:26,
> from ./include/linux/crypto.h:16,
> from ./include/crypto/hash.h:11,
> from lib/iov_iter.c:2:
> 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)))
> | ^~
> ./include/linux/minmax.h:26:18: note: in expansion of macro '__typecheck'
> 26 | (__typecheck(x, y) && __no_side_effects(x, y))
> | ^~~~~~~~~~~
> ./include/linux/minmax.h:36:31: note: in expansion of macro '__safe_cmp'
> 36 | __builtin_choose_expr(__safe_cmp(x, y), \
> | ^~~~~~~~~~
> ./include/linux/minmax.h:45:25: note: in expansion of macro '__careful_cmp'
> 45 | #define min(x, y) __careful_cmp(x, y, <)
> | ^~~~~~~~~~~~~
> lib/iov_iter.c:1464:16: note: in expansion of macro 'min'
> 1464 | return min(nr * PAGE_SIZE - offset, maxsize);
> | ^~~
> lib/iov_iter.c: In function 'iter_xarray_get_pages_alloc':
> ./include/linux/minmax.h:20:35: error: comparison of distinct pointer types lacks a cast [-Werror]
> 20 | (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
> | ^~
> ./include/linux/minmax.h:26:18: note: in expansion of macro '__typecheck'
> 26 | (__typecheck(x, y) && __no_side_effects(x, y))
> | ^~~~~~~~~~~
> ./include/linux/minmax.h:36:31: note: in expansion of macro '__safe_cmp'
> 36 | __builtin_choose_expr(__safe_cmp(x, y), \
> | ^~~~~~~~~~
> ./include/linux/minmax.h:45:25: note: in expansion of macro '__careful_cmp'
> 45 | #define min(x, y) __careful_cmp(x, y, <)
> | ^~~~~~~~~~~~~
> lib/iov_iter.c:1628:16: note: in expansion of macro 'min'
> 1628 | return min(nr * PAGE_SIZE - offset, maxsize);
>
>
> git bisect pointed to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
At a guess, should be
return min((size_t)nr * PAGE_SIZE - offset, maxsize);
in both places. I'm more than half-asleep right now; could you verify that it
(as the last lines of both iter_xarray_get_pages() and iter_xarray_get_pages_alloc())
builds correctly?
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
2022-06-11 12:12 ` Al Viro
@ 2022-06-11 12:37 ` Al Viro
2022-06-11 12:56 ` Al Viro
2022-06-13 9:19 ` David Howells
0 siblings, 2 replies; 10+ messages in thread
From: Al Viro @ 2022-06-11 12:37 UTC (permalink / raw)
To: Sudip Mukherjee
Cc: David Howells, Dominique Martinet, Mike Marshall, Gao Xiang,
linux-afs, v9fs-developer, devel, linux-erofs, linux-cachefs,
linux-fsdevel, linux-kernel, Linus Torvalds
On Sat, Jun 11, 2022 at 12:12:47PM +0000, Al Viro wrote:
> At a guess, should be
> return min((size_t)nr * PAGE_SIZE - offset, maxsize);
>
> in both places. I'm more than half-asleep right now; could you verify that it
> (as the last lines of both iter_xarray_get_pages() and iter_xarray_get_pages_alloc())
> builds correctly?
No, I'm misreading it - it's unsigned * unsigned long - unsigned vs. size_t.
On arm it ends up with unsigned long vs. unsigned int; functionally it *is*
OK (both have the same range there), but it triggers the tests. Try
return min_t(size_t, nr * PAGE_SIZE - offset, maxsize);
there (both places).
Al, going back to sleep - 4 hours is not enough...
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
2022-06-11 12:37 ` Al Viro
@ 2022-06-11 12:56 ` Al Viro
2022-06-11 14:00 ` Guenter Roeck
2022-06-11 23:16 ` Sudip Mukherjee
2022-06-13 9:19 ` David Howells
1 sibling, 2 replies; 10+ messages in thread
From: Al Viro @ 2022-06-11 12:56 UTC (permalink / raw)
To: Sudip Mukherjee
Cc: David Howells, Dominique Martinet, Mike Marshall, Gao Xiang,
linux-afs, v9fs-developer, devel, linux-erofs, linux-cachefs,
linux-fsdevel, linux-kernel, Linus Torvalds
On Sat, Jun 11, 2022 at 12:37:44PM +0000, Al Viro wrote:
> On Sat, Jun 11, 2022 at 12:12:47PM +0000, Al Viro wrote:
>
>
> > At a guess, should be
> > return min((size_t)nr * PAGE_SIZE - offset, maxsize);
> >
> > in both places. I'm more than half-asleep right now; could you verify that it
> > (as the last lines of both iter_xarray_get_pages() and iter_xarray_get_pages_alloc())
> > builds correctly?
>
> No, I'm misreading it - it's unsigned * unsigned long - unsigned vs. size_t.
> On arm it ends up with unsigned long vs. unsigned int; functionally it *is*
> OK (both have the same range there), but it triggers the tests. Try
>
> return min_t(size_t, nr * PAGE_SIZE - offset, maxsize);
>
> there (both places).
The reason we can't overflow on multiplication there, BTW, is that we have
nr <= count, and count has come from weirdly open-coded
DIV_ROUND_UP(size + offset, PAGE_SIZE)
IMO we'd better make it explicit, so how about the following:
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index dda6d5f481c1..150dbd314d25 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -1445,15 +1445,7 @@ static ssize_t iter_xarray_get_pages(struct iov_iter *i,
offset = pos & ~PAGE_MASK;
*_start_offset = offset;
- count = 1;
- if (size > PAGE_SIZE - offset) {
- size -= PAGE_SIZE - offset;
- count += size >> PAGE_SHIFT;
- size &= ~PAGE_MASK;
- if (size)
- count++;
- }
-
+ count = DIV_ROUND_UP(size + offset, PAGE_SIZE);
if (count > maxpages)
count = maxpages;
@@ -1461,7 +1453,7 @@ static ssize_t iter_xarray_get_pages(struct iov_iter *i,
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 */
@@ -1607,15 +1599,7 @@ static ssize_t iter_xarray_get_pages_alloc(struct iov_iter *i,
offset = pos & ~PAGE_MASK;
*_start_offset = offset;
- count = 1;
- if (size > PAGE_SIZE - offset) {
- size -= PAGE_SIZE - offset;
- count += size >> PAGE_SHIFT;
- size &= ~PAGE_MASK;
- if (size)
- count++;
- }
-
+ count = DIV_ROUND_UP(size + offset, PAGE_SIZE);
p = get_pages_array(count);
if (!p)
return -ENOMEM;
@@ -1625,7 +1609,7 @@ static ssize_t iter_xarray_get_pages_alloc(struct iov_iter *i,
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,
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
2022-06-11 12:56 ` Al Viro
@ 2022-06-11 14:00 ` Guenter Roeck
2022-06-11 15:01 ` Al Viro
2022-06-11 23:16 ` Sudip Mukherjee
1 sibling, 1 reply; 10+ messages in thread
From: Guenter Roeck @ 2022-06-11 14:00 UTC (permalink / raw)
To: Al Viro
Cc: Sudip Mukherjee, David Howells, Dominique Martinet,
Mike Marshall, Gao Xiang, linux-afs, v9fs-developer, devel,
linux-erofs, linux-cachefs, linux-fsdevel, linux-kernel,
Linus Torvalds
On Sat, Jun 11, 2022 at 12:56:27PM +0000, Al Viro wrote:
> On Sat, Jun 11, 2022 at 12:37:44PM +0000, Al Viro wrote:
> > On Sat, Jun 11, 2022 at 12:12:47PM +0000, Al Viro wrote:
> >
> >
> > > At a guess, should be
> > > return min((size_t)nr * PAGE_SIZE - offset, maxsize);
> > >
> > > in both places. I'm more than half-asleep right now; could you verify that it
> > > (as the last lines of both iter_xarray_get_pages() and iter_xarray_get_pages_alloc())
> > > builds correctly?
> >
> > No, I'm misreading it - it's unsigned * unsigned long - unsigned vs. size_t.
> > On arm it ends up with unsigned long vs. unsigned int; functionally it *is*
> > OK (both have the same range there), but it triggers the tests. Try
> >
> > return min_t(size_t, nr * PAGE_SIZE - offset, maxsize);
> >
> > there (both places).
>
> The reason we can't overflow on multiplication there, BTW, is that we have
> nr <= count, and count has come from weirdly open-coded
> DIV_ROUND_UP(size + offset, PAGE_SIZE)
That is often done to avoid possible overflows. Is size + offset
guaranteed to be smaller than ULONG_MAX ?
Guenter
> IMO we'd better make it explicit, so how about the following:
>
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
> ---
> diff --git a/lib/iov_iter.c b/lib/iov_iter.c
> index dda6d5f481c1..150dbd314d25 100644
> --- a/lib/iov_iter.c
> +++ b/lib/iov_iter.c
> @@ -1445,15 +1445,7 @@ static ssize_t iter_xarray_get_pages(struct iov_iter *i,
> offset = pos & ~PAGE_MASK;
> *_start_offset = offset;
>
> - count = 1;
> - if (size > PAGE_SIZE - offset) {
> - size -= PAGE_SIZE - offset;
> - count += size >> PAGE_SHIFT;
> - size &= ~PAGE_MASK;
> - if (size)
> - count++;
> - }
> -
> + count = DIV_ROUND_UP(size + offset, PAGE_SIZE);
> if (count > maxpages)
> count = maxpages;
>
> @@ -1461,7 +1453,7 @@ static ssize_t iter_xarray_get_pages(struct iov_iter *i,
> 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 */
> @@ -1607,15 +1599,7 @@ static ssize_t iter_xarray_get_pages_alloc(struct iov_iter *i,
> offset = pos & ~PAGE_MASK;
> *_start_offset = offset;
>
> - count = 1;
> - if (size > PAGE_SIZE - offset) {
> - size -= PAGE_SIZE - offset;
> - count += size >> PAGE_SHIFT;
> - size &= ~PAGE_MASK;
> - if (size)
> - count++;
> - }
> -
> + count = DIV_ROUND_UP(size + offset, PAGE_SIZE);
> p = get_pages_array(count);
> if (!p)
> return -ENOMEM;
> @@ -1625,7 +1609,7 @@ static ssize_t iter_xarray_get_pages_alloc(struct iov_iter *i,
> 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,
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
2022-06-11 14:00 ` Guenter Roeck
@ 2022-06-11 15:01 ` Al Viro
2022-06-11 15:39 ` Al Viro
0 siblings, 1 reply; 10+ messages in thread
From: Al Viro @ 2022-06-11 15:01 UTC (permalink / raw)
To: Guenter Roeck
Cc: Sudip Mukherjee, David Howells, Dominique Martinet,
Mike Marshall, Gao Xiang, linux-afs, v9fs-developer, devel,
linux-erofs, linux-cachefs, linux-fsdevel, linux-kernel,
Linus Torvalds
On Sat, Jun 11, 2022 at 07:00:52AM -0700, Guenter Roeck wrote:
> On Sat, Jun 11, 2022 at 12:56:27PM +0000, Al Viro wrote:
> > On Sat, Jun 11, 2022 at 12:37:44PM +0000, Al Viro wrote:
> > > On Sat, Jun 11, 2022 at 12:12:47PM +0000, Al Viro wrote:
> > >
> > >
> > > > At a guess, should be
> > > > return min((size_t)nr * PAGE_SIZE - offset, maxsize);
> > > >
> > > > in both places. I'm more than half-asleep right now; could you verify that it
> > > > (as the last lines of both iter_xarray_get_pages() and iter_xarray_get_pages_alloc())
> > > > builds correctly?
> > >
> > > No, I'm misreading it - it's unsigned * unsigned long - unsigned vs. size_t.
> > > On arm it ends up with unsigned long vs. unsigned int; functionally it *is*
> > > OK (both have the same range there), but it triggers the tests. Try
> > >
> > > return min_t(size_t, nr * PAGE_SIZE - offset, maxsize);
> > >
> > > there (both places).
> >
> > The reason we can't overflow on multiplication there, BTW, is that we have
> > nr <= count, and count has come from weirdly open-coded
> > DIV_ROUND_UP(size + offset, PAGE_SIZE)
>
> That is often done to avoid possible overflows. Is size + offset
> guaranteed to be smaller than ULONG_MAX ?
You'd need iter->count and maxsize argument to be within PAGE_SIZE of
ULONG_MAX. How would you populate that xarray, anyway?
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
2022-06-11 15:01 ` Al Viro
@ 2022-06-11 15:39 ` Al Viro
0 siblings, 0 replies; 10+ messages in thread
From: Al Viro @ 2022-06-11 15:39 UTC (permalink / raw)
To: Guenter Roeck
Cc: Sudip Mukherjee, David Howells, Dominique Martinet,
Mike Marshall, Gao Xiang, linux-afs, v9fs-developer, devel,
linux-erofs, linux-cachefs, linux-fsdevel, linux-kernel,
Linus Torvalds
On Sat, Jun 11, 2022 at 03:01:16PM +0000, Al Viro wrote:
> On Sat, Jun 11, 2022 at 07:00:52AM -0700, Guenter Roeck wrote:
> > On Sat, Jun 11, 2022 at 12:56:27PM +0000, Al Viro wrote:
> > > On Sat, Jun 11, 2022 at 12:37:44PM +0000, Al Viro wrote:
> > > > On Sat, Jun 11, 2022 at 12:12:47PM +0000, Al Viro wrote:
> > > >
> > > >
> > > > > At a guess, should be
> > > > > return min((size_t)nr * PAGE_SIZE - offset, maxsize);
> > > > >
> > > > > in both places. I'm more than half-asleep right now; could you verify that it
> > > > > (as the last lines of both iter_xarray_get_pages() and iter_xarray_get_pages_alloc())
> > > > > builds correctly?
> > > >
> > > > No, I'm misreading it - it's unsigned * unsigned long - unsigned vs. size_t.
> > > > On arm it ends up with unsigned long vs. unsigned int; functionally it *is*
> > > > OK (both have the same range there), but it triggers the tests. Try
> > > >
> > > > return min_t(size_t, nr * PAGE_SIZE - offset, maxsize);
> > > >
> > > > there (both places).
> > >
> > > The reason we can't overflow on multiplication there, BTW, is that we have
> > > nr <= count, and count has come from weirdly open-coded
> > > DIV_ROUND_UP(size + offset, PAGE_SIZE)
> >
> > That is often done to avoid possible overflows. Is size + offset
> > guaranteed to be smaller than ULONG_MAX ?
>
> You'd need iter->count and maxsize argument to be within PAGE_SIZE of
> ULONG_MAX. How would you populate that xarray, anyway?
FWIW, it probably would be a good idea to truncate maxsize to LONG_MAX
in iov_iter_get_pages()/iov_iter_get_pages_alloc(), just to avoid that kind
of crap in the future. Check that maxpages is not zero on the top level,
while we are at it...
Any caller of iov_iter_get_pages{,_alloc}() must be ready to handle
getting less than what they'd asked for - if nothing else, get_user_pages_fast()
might refuse to give you more than this many pages, etc. All in-tree callers
do, AFAICS. And if anyone comes with "pin me more than LONG_MAX bytes of RAM
in one call, I can't accept anything less than that", well... ISO9000-compliant
response per Dilbert would be called for.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
2022-06-11 12:56 ` Al Viro
2022-06-11 14:00 ` Guenter Roeck
@ 2022-06-11 23:16 ` Sudip Mukherjee
1 sibling, 0 replies; 10+ messages in thread
From: Sudip Mukherjee @ 2022-06-11 23:16 UTC (permalink / raw)
To: Al Viro
Cc: David Howells, Dominique Martinet, Mike Marshall, Gao Xiang,
linux-afs, v9fs-developer, devel, linux-erofs, linux-cachefs,
linux-fsdevel, linux-kernel, Linus Torvalds
On Sat, Jun 11, 2022 at 1:56 PM Al Viro <viro@zeniv.linux.org.uk> wrote:
>
> On Sat, Jun 11, 2022 at 12:37:44PM +0000, Al Viro wrote:
> > On Sat, Jun 11, 2022 at 12:12:47PM +0000, Al Viro wrote:
> >
> >
> > > At a guess, should be
> > > return min((size_t)nr * PAGE_SIZE - offset, maxsize);
> > >
> > > in both places. I'm more than half-asleep right now; could you verify that it
> > > (as the last lines of both iter_xarray_get_pages() and iter_xarray_get_pages_alloc())
> > > builds correctly?
> >
> > No, I'm misreading it - it's unsigned * unsigned long - unsigned vs. size_t.
> > On arm it ends up with unsigned long vs. unsigned int; functionally it *is*
> > OK (both have the same range there), but it triggers the tests. Try
> >
> > return min_t(size_t, nr * PAGE_SIZE - offset, maxsize);
> >
> > there (both places).
>
> The reason we can't overflow on multiplication there, BTW, is that we have
> nr <= count, and count has come from weirdly open-coded
> DIV_ROUND_UP(size + offset, PAGE_SIZE)
> IMO we'd better make it explicit, so how about the following:
Thanks. Fixed the build for me.
--
Regards
Sudip
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()")
2022-06-11 12:37 ` Al Viro
2022-06-11 12:56 ` Al Viro
@ 2022-06-13 9:19 ` David Howells
1 sibling, 0 replies; 10+ messages in thread
From: David Howells @ 2022-06-13 9:19 UTC (permalink / raw)
To: Al Viro
Cc: dhowells, Sudip Mukherjee, Dominique Martinet, Mike Marshall,
Gao Xiang, linux-afs, v9fs-developer, devel, linux-erofs,
linux-cachefs, linux-fsdevel, linux-kernel, Linus Torvalds
Al Viro <viro@zeniv.linux.org.uk> wrote:
> The reason we can't overflow on multiplication there, BTW, is that we have
> nr <= count, and count has come from weirdly open-coded
> DIV_ROUND_UP(size + offset, PAGE_SIZE)
> IMO we'd better make it explicit, so how about the following:
>
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
It seems reasonable.
Reviewed-by: David Howells <dhowells@redhat.com>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2022-06-13 9:19 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-11 10:45 mainline build failure due to 6c77676645ad ("iov_iter: Fix iter_xarray_get_pages{,_alloc}()") Sudip Mukherjee
2022-06-11 10:55 ` Sudip Mukherjee
2022-06-11 12:12 ` Al Viro
2022-06-11 12:37 ` Al Viro
2022-06-11 12:56 ` Al Viro
2022-06-11 14:00 ` Guenter Roeck
2022-06-11 15:01 ` Al Viro
2022-06-11 15:39 ` Al Viro
2022-06-11 23:16 ` Sudip Mukherjee
2022-06-13 9:19 ` David Howells
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).