lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 23 Dec 2022 07:02:24 -0800 From: Christoph Hellwig <hch@...radead.org> To: Andreas Gruenbacher <agruenba@...hat.com> Cc: Christoph Hellwig <hch@...radead.org>, "Darrick J . Wong" <djwong@...nel.org>, Alexander Viro <viro@...iv.linux.org.uk>, Matthew Wilcox <willy@...radead.org>, linux-xfs@...r.kernel.org, linux-fsdevel@...r.kernel.org, linux-ext4@...r.kernel.org, cluster-devel@...hat.com Subject: Re: [RFC v3 2/7] iomap: Add iomap_folio_done helper 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.
Powered by blists - more mailing lists