From: David Laight On 32bit systems 'pos' is s64 and everything else is 32bit so the first argument to min() is signed - generating a warning. On 64bit systems 'len' is 64bit unsigned forcing everything to unsigned. Fix by reworking the exprssion to completely avoid 64bit maths on 32bit. Use DIV_ROUND_UP() instead of open-coding something equivalent. Note that the 32bit 'len' cannot overflow because the syscall interface limits read/write (etc) to (INT_MAX - PAGE_SIZE) bytes (even on 64bit). Fixes: 0f5bb0cfb0b4 ("fs: use min() or umin() instead of min_t()") Signed-off-by: David Laight --- fs/fuse/file.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 2595b6b4922b..ff823b0545ed 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -1323,8 +1323,8 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, static inline unsigned int fuse_wr_pages(loff_t pos, size_t len, unsigned int max_pages) { - return min(((pos + len - 1) >> PAGE_SHIFT) - (pos >> PAGE_SHIFT) + 1, - max_pages); + len += pos % PAGE_SIZE; + return min(DIV_ROUND_UP(len, PAGE_SIZE), max_pages); } static ssize_t fuse_perform_write(struct kiocb *iocb, struct iov_iter *ii) -- 2.39.5