xref: /linux/fs/verity/pagecache.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1821ddd25SChristoph Hellwig // SPDX-License-Identifier: GPL-2.0
2821ddd25SChristoph Hellwig /*
3821ddd25SChristoph Hellwig  * Copyright 2019 Google LLC
4821ddd25SChristoph Hellwig  */
5821ddd25SChristoph Hellwig 
6*f1a6cf44SChristoph Hellwig #include <linux/export.h>
7821ddd25SChristoph Hellwig #include <linux/fsverity.h>
8821ddd25SChristoph Hellwig #include <linux/pagemap.h>
9821ddd25SChristoph Hellwig 
10821ddd25SChristoph Hellwig /**
11821ddd25SChristoph Hellwig  * generic_read_merkle_tree_page - generic ->read_merkle_tree_page helper
12821ddd25SChristoph Hellwig  * @inode:	inode containing the Merkle tree
13821ddd25SChristoph Hellwig  * @index:	0-based index of the Merkle tree page in the inode
14821ddd25SChristoph Hellwig  *
15821ddd25SChristoph Hellwig  * The caller needs to adjust @index from the Merkle-tree relative index passed
16821ddd25SChristoph Hellwig  * to ->read_merkle_tree_page to the actual index where the Merkle tree is
17821ddd25SChristoph Hellwig  * stored in the page cache for @inode.
18821ddd25SChristoph Hellwig  */
19*f1a6cf44SChristoph Hellwig struct page *generic_read_merkle_tree_page(struct inode *inode, pgoff_t index)
20821ddd25SChristoph Hellwig {
21821ddd25SChristoph Hellwig 	struct folio *folio;
22821ddd25SChristoph Hellwig 
23*f1a6cf44SChristoph Hellwig 	folio = read_mapping_folio(inode->i_mapping, index, NULL);
24*f1a6cf44SChristoph Hellwig 	if (IS_ERR(folio))
25*f1a6cf44SChristoph Hellwig 		return ERR_CAST(folio);
26*f1a6cf44SChristoph Hellwig 	return folio_file_page(folio, index);
27*f1a6cf44SChristoph Hellwig }
28*f1a6cf44SChristoph Hellwig EXPORT_SYMBOL_GPL(generic_read_merkle_tree_page);
29*f1a6cf44SChristoph Hellwig 
30*f1a6cf44SChristoph Hellwig /**
31*f1a6cf44SChristoph Hellwig  * generic_readahead_merkle_tree() - generic ->readahead_merkle_tree helper
32*f1a6cf44SChristoph Hellwig  * @inode:	inode containing the Merkle tree
33*f1a6cf44SChristoph Hellwig  * @index:	0-based index of the first Merkle tree page to read ahead in the
34*f1a6cf44SChristoph Hellwig  *		inode
35*f1a6cf44SChristoph Hellwig  * @nr_pages:	the number of Merkle tree pages that should be read ahead
36*f1a6cf44SChristoph Hellwig  *
37*f1a6cf44SChristoph Hellwig  * The caller needs to adjust @index from the Merkle-tree relative index passed
38*f1a6cf44SChristoph Hellwig  * to ->read_merkle_tree_page to the actual index where the Merkle tree is
39*f1a6cf44SChristoph Hellwig  * stored in the page cache for @inode.
40*f1a6cf44SChristoph Hellwig  */
41*f1a6cf44SChristoph Hellwig void generic_readahead_merkle_tree(struct inode *inode, pgoff_t index,
42*f1a6cf44SChristoph Hellwig 				   unsigned long nr_pages)
43*f1a6cf44SChristoph Hellwig {
44*f1a6cf44SChristoph Hellwig 	struct folio *folio;
45*f1a6cf44SChristoph Hellwig 
46*f1a6cf44SChristoph Hellwig 	lockdep_assert_held(&inode->i_mapping->invalidate_lock);
47*f1a6cf44SChristoph Hellwig 
48821ddd25SChristoph Hellwig 	folio = __filemap_get_folio(inode->i_mapping, index, FGP_ACCESSED, 0);
4923eec9fdSChristoph Hellwig 	if (folio == ERR_PTR(-ENOENT) ||
5023eec9fdSChristoph Hellwig 	    (!IS_ERR(folio) && !folio_test_uptodate(folio))) {
51821ddd25SChristoph Hellwig 		DEFINE_READAHEAD(ractl, NULL, NULL, inode->i_mapping, index);
52821ddd25SChristoph Hellwig 
53*f1a6cf44SChristoph Hellwig 		page_cache_ra_unbounded(&ractl, nr_pages, 0);
54*f1a6cf44SChristoph Hellwig 	}
55*f1a6cf44SChristoph Hellwig 	if (!IS_ERR(folio))
56821ddd25SChristoph Hellwig 		folio_put(folio);
57b244c89aSChristoph Hellwig }
58*f1a6cf44SChristoph Hellwig EXPORT_SYMBOL_GPL(generic_readahead_merkle_tree);
59