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