On Fri, Dec 16, 2022 at 04:06:21PM +0100, Andreas Gruenbacher wrote: > +static void iomap_folio_done(struct iomap_iter *iter, loff_t pos, size_t ret, > + struct folio *folio) > +{ > + const struct iomap_page_ops *page_ops = iter->iomap.page_ops; > + > + if (folio) > + folio_unlock(folio); > + if (page_ops && page_ops->page_done) > + page_ops->page_done(iter->inode, pos, ret, &folio->page); > + if (folio) > + folio_put(folio); > +} How is the folio derefence going to work if folio is NULL? That being said, I really wonder if the current API is the right way to go. Can't we just have a ->get_folio method with the same signature as __filemap_get_folio, and then do the __filemap_get_folio from the file system and avoid the page/folio == NULL clean path entirely? Then on the done side move the unlock and put into the done method as well. > if (!folio) { > status = (iter->flags & IOMAP_NOWAIT) ? -EAGAIN : -ENOMEM; > - goto out_no_page; > + iomap_folio_done(iter, pos, 0, NULL); > + return status; > } > > /* > @@ -656,13 +670,9 @@ static int iomap_write_begin(struct iomap_iter *iter, loff_t pos, > return 0; > > out_unlock: > - folio_unlock(folio); > - folio_put(folio); > + iomap_folio_done(iter, pos, 0, folio); > iomap_write_failed(iter->inode, pos, len); > > -out_no_page: > - if (page_ops && page_ops->page_done) > - page_ops->page_done(iter->inode, pos, 0, NULL); > return status; But for the current version I don't really understand why the error unwinding changes here.