break;
}
if (btrfs_folio_test_uptodate(fs_info, folio, cur, blocksize)) {
- end_folio_read(folio, true, cur, blocksize);
+ end_folio_read(vi, folio, true, cur, blocksize);
continue;
}
- em = get_extent_map(BTRFS_I(inode), folio, cur, end - cur + 1, em_cached);
+ /*
+ * Search extent map for the whole locked range.
+ * This will allow btrfs_get_extent() to return a larger hole
+ * when possible.
+ * This can reduce duplicated btrfs_get_extent() calls for large
+ * holes.
+ */
+ em = get_extent_map(BTRFS_I(inode), folio, cur, locked_end - cur + 1, em_cached);
if (IS_ERR(em)) {
- end_folio_read(folio, false, cur, end + 1 - cur);
+ end_folio_read(vi, folio, false, cur, end + 1 - cur);
return PTR_ERR(em);
}
extent_offset = cur - em->start;