Re: [PATCH 02/14] fs: Make page_mkwrite_check_truncate thp-aware

Darrick J. Wong
2020-10-14T16:17:14Z

On Wed, Oct 14, 2020 at 04:03:45AM +0100, Matthew Wilcox (Oracle) wrote:
> If the page is compound, check the last index in the page and return
> the appropriate size. Change the return type to ssize_t in case we ever
> support pages larger than 2GB.

"But what about 16G pages?" :P

> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> ---
> include/linux/pagemap.h | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
> index 7dc6bf713d27..5083a0efafa8 100644
> --- a/include/linux/pagemap.h
> +++ b/include/linux/pagemap.h
> @@ -983,22 +983,22 @@ static inline unsigned long dir_pages(struct inode *inode)
> * @page: the page to check
> * @inode: the inode to check the page against
> *
> - * Returns the number of bytes in the page up to EOF,
> + * Return: The number of bytes in the page up to EOF,
> * or -EFAULT if the page was truncated.
> */
> -static inline int page_mkwrite_check_truncate(struct page *page,
> +static inline ssize_t page_mkwrite_check_truncate(struct page *page,
> struct inode *inode)
> {
> loff_t size = i_size_read(inode);
> pgoff_t index = size >> PAGE_SHIFT;
> - int offset = offset_in_page(size);
> + unsigned long offset = offset_in_thp(page, size);
>
> if (page->mapping != inode->i_mapping)
> return -EFAULT;
>
> /* page is wholly inside EOF */
> - if (page->index < index)
> - return PAGE_SIZE;
> + if (page->index + thp_nr_pages(page) - 1 < index)

Just curious, is this expression common enough to create a helper for
that too?

#define thp_last_index(page) ((page)->index + thp_nr_pages(page) - 1) ?

(Maybe make that a static inline, I used a macro for brevity)

Otherwise looks fine to me...

--D

> + return thp_size(page);
> /* page is wholly past EOF */
> if (page->index > index || !offset)
> return -EFAULT;
> --
> 2.28.0
>