From: Christoph Hellwig <hch@infradead.org> To: Andreas Gruenbacher <agruenba@redhat.com> Cc: Christoph Hellwig <hch@infradead.org>, "Darrick J . Wong" <djwong@kernel.org>, Alexander Viro <viro@zeniv.linux.org.uk>, Matthew Wilcox <willy@infradead.org>, linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, cluster-devel@redhat.com Subject: Re: [RFC v3 1/7] fs: Add folio_may_straddle_isize helper Date: Fri, 23 Dec 2022 06:56:11 -0800 [thread overview] Message-ID: <Y6XBi/YJ4QV3NK5q@infradead.org> (raw) In-Reply-To: <20221216150626.670312-2-agruenba@redhat.com> On Fri, Dec 16, 2022 at 04:06:20PM +0100, Andreas Gruenbacher wrote: > Add a folio_may_straddle_isize() helper as a replacement for > pagecache_isize_extended() when we have a locked folio. I find the naming very confusing. Any good reason to not follow the naming of pagecache_isize_extended an call it folio_isize_extended? > Use the new helper in generic_write_end(), iomap_write_end(), > ext4_write_end(), and ext4_journalled_write_end(). Please split this into a patch per caller in addition to the one adding the helper, and write commit logs explaining the rationale for the helper. The obious ones I'm trying to guess are that the new helper avoid a page cache radix tree lookup and a lock page/folio cycle, but I'd rather hear that from the horses mouth in the commit log. > --- a/fs/buffer.c > +++ b/fs/buffer.c > @@ -2164,16 +2164,15 @@ int generic_write_end(struct file *file, struct address_space *mapping, > * But it's important to update i_size while still holding page lock: > * page writeout could otherwise come in and zero beyond i_size. > */ > - if (pos + copied > inode->i_size) { > + if (pos + copied > old_size) { This is and unrelated and undocument (but useful) change. Please split it out as well. > + * This function must be called while we still hold i_rwsem - this not only > + * makes sure i_size is stable but also that userspace cannot observe the new > + * i_size value before we are prepared to handle mmap writes there. Please add a lockdep_assert_held_write to enforce that. > +void folio_may_straddle_isize(struct inode *inode, struct folio *folio, > + loff_t old_size, loff_t start) > +{ > + unsigned int blocksize = i_blocksize(inode); > + > + if (round_up(old_size, blocksize) >= round_down(start, blocksize)) > + return; > + > + /* > + * See clear_page_dirty_for_io() for details why folio_set_dirty() > + * is needed. > + */ > + if (folio_mkclean(folio)) > + folio_set_dirty(folio); Should pagecache_isize_extended be rewritten to use this helper, i.e. turn this into a factoring out of a helper? > +EXPORT_SYMBOL(folio_may_straddle_isize); Please make this an EXPORT_SYMBOL_GPL just like folio_mkclean.
WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@infradead.org> To: cluster-devel.redhat.com Subject: [Cluster-devel] [RFC v3 1/7] fs: Add folio_may_straddle_isize helper Date: Fri, 23 Dec 2022 06:56:11 -0800 [thread overview] Message-ID: <Y6XBi/YJ4QV3NK5q@infradead.org> (raw) In-Reply-To: <20221216150626.670312-2-agruenba@redhat.com> On Fri, Dec 16, 2022 at 04:06:20PM +0100, Andreas Gruenbacher wrote: > Add a folio_may_straddle_isize() helper as a replacement for > pagecache_isize_extended() when we have a locked folio. I find the naming very confusing. Any good reason to not follow the naming of pagecache_isize_extended an call it folio_isize_extended? > Use the new helper in generic_write_end(), iomap_write_end(), > ext4_write_end(), and ext4_journalled_write_end(). Please split this into a patch per caller in addition to the one adding the helper, and write commit logs explaining the rationale for the helper. The obious ones I'm trying to guess are that the new helper avoid a page cache radix tree lookup and a lock page/folio cycle, but I'd rather hear that from the horses mouth in the commit log. > --- a/fs/buffer.c > +++ b/fs/buffer.c > @@ -2164,16 +2164,15 @@ int generic_write_end(struct file *file, struct address_space *mapping, > * But it's important to update i_size while still holding page lock: > * page writeout could otherwise come in and zero beyond i_size. > */ > - if (pos + copied > inode->i_size) { > + if (pos + copied > old_size) { This is and unrelated and undocument (but useful) change. Please split it out as well. > + * This function must be called while we still hold i_rwsem - this not only > + * makes sure i_size is stable but also that userspace cannot observe the new > + * i_size value before we are prepared to handle mmap writes there. Please add a lockdep_assert_held_write to enforce that. > +void folio_may_straddle_isize(struct inode *inode, struct folio *folio, > + loff_t old_size, loff_t start) > +{ > + unsigned int blocksize = i_blocksize(inode); > + > + if (round_up(old_size, blocksize) >= round_down(start, blocksize)) > + return; > + > + /* > + * See clear_page_dirty_for_io() for details why folio_set_dirty() > + * is needed. > + */ > + if (folio_mkclean(folio)) > + folio_set_dirty(folio); Should pagecache_isize_extended be rewritten to use this helper, i.e. turn this into a factoring out of a helper? > +EXPORT_SYMBOL(folio_may_straddle_isize); Please make this an EXPORT_SYMBOL_GPL just like folio_mkclean.
next prev parent reply other threads:[~2022-12-23 14:56 UTC|newest] Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-12-16 15:06 [RFC v3 0/7] Turn iomap_page_ops into iomap_folio_ops Andreas Gruenbacher 2022-12-16 15:06 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-16 15:06 ` [RFC v3 1/7] fs: Add folio_may_straddle_isize helper Andreas Gruenbacher 2022-12-16 15:06 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-23 14:56 ` Christoph Hellwig [this message] 2022-12-23 14:56 ` Christoph Hellwig 2022-12-23 22:04 ` Andreas Grünbacher 2022-12-23 22:04 ` [Cluster-devel] " Andreas Grünbacher 2022-12-24 7:21 ` Christoph Hellwig 2022-12-16 15:06 ` [RFC v3 2/7] iomap: Add iomap_folio_done helper Andreas Gruenbacher 2022-12-16 15:06 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-23 15:02 ` Christoph Hellwig 2022-12-23 15:02 ` [Cluster-devel] " Christoph Hellwig 2022-12-23 20:54 ` Andreas Grünbacher 2022-12-23 20:54 ` [Cluster-devel] " Andreas Grünbacher 2022-12-24 7:22 ` Christoph Hellwig 2022-12-24 7:22 ` [Cluster-devel] " Christoph Hellwig 2022-12-16 15:06 ` [RFC v3 3/7] iomap/gfs2: Unlock and put folio in page_done handler Andreas Gruenbacher 2022-12-16 15:06 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-23 15:03 ` Christoph Hellwig 2022-12-23 15:03 ` [Cluster-devel] " Christoph Hellwig 2022-12-16 15:06 ` [RFC v3 4/7] iomap: Add iomap_folio_prepare helper Andreas Gruenbacher 2022-12-16 15:06 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-23 15:04 ` Christoph Hellwig 2022-12-23 15:04 ` [Cluster-devel] " Christoph Hellwig 2022-12-23 21:05 ` Andreas Grünbacher 2022-12-23 21:05 ` [Cluster-devel] " Andreas Grünbacher 2022-12-24 7:23 ` Christoph Hellwig 2022-12-24 7:23 ` [Cluster-devel] " Christoph Hellwig 2022-12-25 9:12 ` Matthew Wilcox 2022-12-25 9:12 ` [Cluster-devel] " Matthew Wilcox 2022-12-28 15:55 ` Christoph Hellwig 2022-12-28 15:55 ` [Cluster-devel] " Christoph Hellwig 2022-12-16 15:06 ` [RFC v3 5/7] iomap: Get page in page_prepare handler Andreas Gruenbacher 2022-12-16 15:06 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-16 16:30 ` Matthew Wilcox 2022-12-16 16:30 ` [Cluster-devel] " Matthew Wilcox 2022-12-16 17:15 ` Andreas Gruenbacher 2022-12-16 17:15 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-23 15:07 ` Christoph Hellwig 2022-12-23 15:07 ` [Cluster-devel] " Christoph Hellwig 2022-12-16 15:06 ` [RFC v3 6/7] iomap/xfs: Eliminate the iomap_valid handler Andreas Gruenbacher 2022-12-16 15:06 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-23 15:10 ` Christoph Hellwig 2022-12-23 15:10 ` [Cluster-devel] " Christoph Hellwig 2022-12-16 15:06 ` [RFC v3 7/7] iomap: Rename page_ops to folio_ops Andreas Gruenbacher 2022-12-16 15:06 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-18 22:10 ` [RFC v4 0/7] Turn iomap_page_ops into iomap_folio_ops Andreas Gruenbacher 2022-12-18 22:10 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-18 22:10 ` [RFC v4 1/7] fs: Add folio_may_straddle_isize helper Andreas Gruenbacher 2022-12-18 22:10 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-18 22:10 ` [RFC v4 2/7] iomap: Add iomap_folio_done helper Andreas Gruenbacher 2022-12-18 22:10 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-18 22:10 ` [RFC v4 3/7] iomap/gfs2: Unlock and put folio in page_done handler Andreas Gruenbacher 2022-12-18 22:10 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-18 22:10 ` [RFC v4 4/7] iomap: Add iomap_folio_prepare helper Andreas Gruenbacher 2022-12-18 22:10 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-18 22:10 ` [RFC v4 5/7] iomap/gfs2: Get page in page_prepare handler Andreas Gruenbacher 2022-12-18 22:10 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-18 22:10 ` [RFC v4 6/7] iomap/xfs: Eliminate the iomap_valid handler Andreas Gruenbacher 2022-12-18 22:10 ` [Cluster-devel] " Andreas Gruenbacher 2022-12-18 22:10 ` [RFC v4 7/7] iomap: Rename page_ops to folio_ops Andreas Gruenbacher 2022-12-18 22:10 ` [Cluster-devel] " Andreas Gruenbacher
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=Y6XBi/YJ4QV3NK5q@infradead.org \ --to=hch@infradead.org \ --cc=agruenba@redhat.com \ --cc=cluster-devel@redhat.com \ --cc=djwong@kernel.org \ --cc=linux-ext4@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-xfs@vger.kernel.org \ --cc=viro@zeniv.linux.org.uk \ --cc=willy@infradead.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.