Dan, why is this erroneous commit still in your tree?
iomap_write_end() cannot return an errno; if an error occurs, it
returns zero. The code in iomap_zero_iter() should be:
bytes = iomap_write_end(iter, pos, bytes, bytes, page);
if (WARN_ON_ONCE(bytes == 0))
return -EIO;
On Wed, Dec 08, 2021 at 10:12:03AM +0100, Christoph Hellwig wrote:
> bytes also hold the return value from iomap_write_end, which can contain
> a negative error value. As bytes is always less than the page size even
> the signed type can hold the entire possible range.
>
> Fixes: c6f40468657d ("fsdax: decouple zeroing from the iomap buffered I/O
> code")
> Reported-by: Dan Carpenter <[email protected]>
> Signed-off-by: Christoph Hellwig <[email protected]>
> ---
> fs/iomap/buffered-io.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
> index b1511255b4df8..ac040d607f4fe 100644
> --- a/fs/iomap/buffered-io.c
> +++ b/fs/iomap/buffered-io.c
> @@ -883,7 +883,7 @@ static loff_t iomap_zero_iter(struct iomap_iter *iter,
> bool *did_zero)
>
> do {
> unsigned offset = offset_in_page(pos);
> - size_t bytes = min_t(u64, PAGE_SIZE - offset, length);
> + ssize_t bytes = min_t(u64, PAGE_SIZE - offset, length);
> struct page *page;
> int status;
>
> --
> 2.30.2
>