mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 09:49:58 -04:00
mm/filemap: Add folio_mkwrite_check_truncate()
This is the folio equivalent of page_mkwrite_check_truncate(). Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: David Howells <dhowells@redhat.com>
This commit is contained in:
@@ -1120,6 +1120,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)
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user