diff options
author | Matthew Wilcox (Oracle) <willy@infradead.org> | 2020-02-01 01:43:24 -0500 |
---|---|---|
committer | Matthew Wilcox (Oracle) <willy@infradead.org> | 2020-10-26 08:21:14 -0400 |
commit | e50e0d8a8aa8d299649bd400a9f10dfd5795b27b (patch) | |
tree | d921ac1f3c56c656a8fc9d1ad5f630f392268553 /include/linux | |
parent | 8308a1a6a77841fdf0fa950f082974af17fc1b9d (diff) |
fs: Make page_mkwrite_check_truncate thp-aware
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.
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/pagemap.h | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 8938c64f418b..dc3390e6ee3e 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -988,22 +988,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) + return thp_size(page); /* page is wholly past EOF */ if (page->index > index || !offset) return -EFAULT; |