On 7/15/21 5:36 AM, Matthew Wilcox (Oracle) wrote: > This is the folio equivalent of page_mkwrite_check_truncate(). > > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> > --- > include/linux/pagemap.h | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > > diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h > index 412db88b8d0c..18c06c3e42c3 100644 > --- a/include/linux/pagemap.h > +++ b/include/linux/pagemap.h > @@ -1121,6 +1121,34 @@ static inline unsigned long dir_pages(struct inode *inode) > PAGE_SHIFT; > } > > +/** > + * folio_mkwrite_check_truncate - check if folio was truncated > + * @folio: the folio to check > + * @inode: the inode to check the folio against > + * > + * Return: the number of bytes in the folio up to EOF, > + * or -EFAULT if the folio was truncated. > + */ > +static inline ssize_t folio_mkwrite_check_truncate(struct folio *folio, > + struct inode *inode) > +{ > + loff_t size = i_size_read(inode); > + pgoff_t index = size >> PAGE_SHIFT; > + size_t offset = offset_in_folio(folio, size); > + > + if (!folio->mapping) The check in the page_ version is if (page->mapping != inode->i_mapping) Why is the one above sufficient? > + return -EFAULT; > + > + /* folio is wholly inside EOF */ > + if (folio_next_index(folio) - 1 < index) > + return folio_size(folio); > + /* folio is wholly past EOF */ > + if (folio->index > index || !offset) > + return -EFAULT; > + /* folio is partially inside EOF */ > + return offset; > +} > + > /** > * page_mkwrite_check_truncate - check if page was truncated > * @page: the page to check >