// SPDX-License-Identifier: GPL-2.0 /* * Copyright 2019 Google LLC */ #include #include #include /** * generic_read_merkle_tree_page - generic ->read_merkle_tree_page helper * @inode: inode containing the Merkle tree * @index: 0-based index of the Merkle tree page in the inode * * The caller needs to adjust @index from the Merkle-tree relative index passed * to ->read_merkle_tree_page to the actual index where the Merkle tree is * stored in the page cache for @inode. */ struct page *generic_read_merkle_tree_page(struct inode *inode, pgoff_t index) { struct folio *folio; folio = read_mapping_folio(inode->i_mapping, index, NULL); if (IS_ERR(folio)) return ERR_CAST(folio); return folio_file_page(folio, index); } EXPORT_SYMBOL_GPL(generic_read_merkle_tree_page); /** * generic_readahead_merkle_tree() - generic ->readahead_merkle_tree helper * @inode: inode containing the Merkle tree * @index: 0-based index of the first Merkle tree page to read ahead in the * inode * @nr_pages: the number of Merkle tree pages that should be read ahead * * The caller needs to adjust @index from the Merkle-tree relative index passed * to ->read_merkle_tree_page to the actual index where the Merkle tree is * stored in the page cache for @inode. */ void generic_readahead_merkle_tree(struct inode *inode, pgoff_t index, unsigned long nr_pages) { struct folio *folio; lockdep_assert_held(&inode->i_mapping->invalidate_lock); folio = __filemap_get_folio(inode->i_mapping, index, FGP_ACCESSED, 0); if (folio == ERR_PTR(-ENOENT) || (!IS_ERR(folio) && !folio_test_uptodate(folio))) { DEFINE_READAHEAD(ractl, NULL, NULL, inode->i_mapping, index); page_cache_ra_unbounded(&ractl, nr_pages, 0); } if (!IS_ERR(folio)) folio_put(folio); } EXPORT_SYMBOL_GPL(generic_readahead_merkle_tree);