Skip to content

Commit

Permalink
fsverity: don't use bio_first_page_all() in fsverity_verify_bio()
Browse files Browse the repository at this point in the history
[ Upstream commit d1f0c5e ]

bio_first_page_all(bio)->mapping->host is not compatible with large
folios, since the first page of the bio is not necessarily the head page
of the folio, and therefore it might not have the mapping pointer set.

Therefore, move the dereference of ->mapping->host into
verify_data_blocks(), which works with a folio.

(Like the commit that this Fixes, this hasn't actually been tested with
large folios yet, since the filesystems that use fs/verity/ don't
support that yet.  But based on code review, I think this is needed.)

Fixes: 5d0f0e5 ("fsverity: support verifying data from large folios")
Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Matthew Wilcox (Oracle) <[email protected]>
Signed-off-by: Eric Biggers <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
  • Loading branch information
ebiggers authored and gregkh committed Jul 19, 2023
1 parent 636d815 commit 3cfecc7
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions fs/verity/verify.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,9 +256,10 @@ verify_data_block(struct inode *inode, struct fsverity_info *vi,
}

static bool
verify_data_blocks(struct inode *inode, struct folio *data_folio,
size_t len, size_t offset, unsigned long max_ra_pages)
verify_data_blocks(struct folio *data_folio, size_t len, size_t offset,
unsigned long max_ra_pages)
{
struct inode *inode = data_folio->mapping->host;
struct fsverity_info *vi = inode->i_verity_info;
const unsigned int block_size = vi->tree_params.block_size;
u64 pos = (u64)data_folio->index << PAGE_SHIFT;
Expand Down Expand Up @@ -298,7 +299,7 @@ verify_data_blocks(struct inode *inode, struct folio *data_folio,
*/
bool fsverity_verify_blocks(struct folio *folio, size_t len, size_t offset)
{
return verify_data_blocks(folio->mapping->host, folio, len, offset, 0);
return verify_data_blocks(folio, len, offset, 0);
}
EXPORT_SYMBOL_GPL(fsverity_verify_blocks);

Expand All @@ -319,7 +320,6 @@ EXPORT_SYMBOL_GPL(fsverity_verify_blocks);
*/
void fsverity_verify_bio(struct bio *bio)
{
struct inode *inode = bio_first_page_all(bio)->mapping->host;
struct folio_iter fi;
unsigned long max_ra_pages = 0;

Expand All @@ -337,7 +337,7 @@ void fsverity_verify_bio(struct bio *bio)
}

bio_for_each_folio_all(fi, bio) {
if (!verify_data_blocks(inode, fi.folio, fi.length, fi.offset,
if (!verify_data_blocks(fi.folio, fi.length, fi.offset,
max_ra_pages)) {
bio->bi_status = BLK_STS_IOERR;
break;
Expand Down

0 comments on commit 3cfecc7

Please sign in to comment.