On 12:53 25/02, Christoph Hellwig wrote: > On Fri, Feb 21, 2020 at 10:21:04AM +0530, Ritesh Harjani wrote: > > > if (dio->error) { > > > iov_iter_revert(dio->submit.iter, copied); > > > - copied = ret = 0; > > > + ret = 0; > > > goto out; > > > } > > > > But if I am seeing this correctly, even after there was a dio->error > > if you return copied > 0, then the loop in iomap_dio_rw will continue > > for next iteration as well. Until the second time it won't copy > > anything since dio->error is set and from there I guess it may return > > 0 which will break the loop. > Reading the code again, there are a few clarifications. If iomap_end() handles (written < length) as an error, iomap_apply() will return an error immediately. It will not execute the loop a second time. On the other hand, if there is no ->iomap_end() defined by the filesystem such as in the case of XFS, we will need to check for dio->error in the do {} while loop of iomap_dio_rw(). > In addition to that copied is also iov_iter_reexpand call. We don't > really need the re-expand in case of errors, and in fact we also > have the iov_iter_revert call before jumping out, so this will > need a little bit more of an audit and properly documented in the > commit log. We are still handling this as an error, so why are we concerned about expanding? There is no success/written returned in iomap_dio_rw() call in case of an error. Attached is an updated patch. -- Goldwyn