On 6/6/22 12:18 PM, Matthew Wilcox wrote: > On Mon, Jun 06, 2022 at 09:39:03AM -0700, Stefan Roesch wrote: >> >> >> On 6/2/22 5:38 AM, Matthew Wilcox wrote: >>> On Wed, Jun 01, 2022 at 02:01:32PM -0700, Stefan Roesch wrote: >>>> Change the signature of iomap_write_iter() to return an error code. In >>>> case we cannot allocate a page in iomap_write_begin(), we will not retry >>>> the memory alloction in iomap_write_begin(). >>> >>> loff_t can already represent an error code. And it's already used like >>> that. >>> >>>> @@ -829,7 +830,8 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i) >>>> length -= status; >>>> } while (iov_iter_count(i) && length); >>>> >>>> - return written ? written : status; >>>> + *processed = written ? written : error; >>>> + return error; >>> >>> I think the change you really want is: >>> >>> if (status == -EAGAIN) >>> return -EAGAIN; >>> if (written) >>> return written; >>> return status; >>> >> >> I think the change needs to be: >> >> - return written ? written : status; >> + if (status == -EAGAIN) { >> + iov_iter_revert(i, written); >> + return -EAGAIN; >> + } >> + if (written) >> + return written; >> + return status; > > Ah yes, I think you're right. > > Does it work to leave everything the way it is, call back into the > iomap_write_iter() after having done a short write, get the -EAGAIN at > that point and pass the already-advanced iterator to the worker thread? > I haven't looked into the details of how that works, so maybe you just > can't do that. With the above change, short writes are handled correctly.