Lines Matching defs:be

37  * L: Field should be protected by the pcluster lock;
39 * A: Field should be accessed / updated in atomic for parallelized code.
70 /* I: can be used to free the pcluster by RCU. */
86 /* A: compressed bvecs (can be cached or inplaced pages) */
151 /* have to access nextpage in advance, otherwise it will be unmapped */
482 * may be dispatched to the bypass queue later due to uptodated managed
483 * folios. All file-backed folios related to this pcluster cannot be
484 * reused for in-place I/O (or bvpage) since the pcluster may be decoded
490 * File-backed folios (except for the head page) related to it can be
541 /* Optimistic allocation, as in-place I/O can be used as a fallback */
563 * Allocate a managed folio for cached I/O, or it may be
585 * the managed cache, as the pcluster can be moved to the bypass queue.
645 * It will be called only on inode eviction. In case that there are still some
647 * An extra lock could be introduced instead but it seems unnecessary.
688 /* callers must be with pcluster lock held */
711 /* otherwise, check if it can be used as a bvpage */
813 /* must be Z_EROFS_PCLUSTER_TAIL or pointed to previous pcluster */
849 /* .. so it can be attached to our submission chain */
887 * Note that all cached folios should be detached before deleted from
888 * the XArray. Otherwise some folios could be still attached to the
1059 * asynchronously thus it cannot be used for inplace I/O
1060 * or bvpage (should be processed in the strict order.)
1114 /* indicate if temporary copies should be preserved for later use */
1123 static void z_erofs_do_decompressed_bvec(struct z_erofs_backend *be,
1126 int poff = bvec->offset + be->pcl->pageofs_out;
1131 bvec->offset + bvec->end == be->pcl->length)) {
1132 DBG_BUGON((poff >> PAGE_SHIFT) >= be->nr_pages);
1133 page = be->decompressed_pages + (poff >> PAGE_SHIFT);
1139 be->keepxcpy = true;
1145 list_add(&item->list, &be->decompressed_secondary_bvecs);
1148 static void z_erofs_fill_other_copies(struct z_erofs_backend *be, int err)
1150 unsigned int off0 = be->pcl->pageofs_out;
1153 list_for_each_safe(p, n, &be->decompressed_secondary_bvecs) {
1160 end = min_t(unsigned int, be->pcl->length - bvi->bvec.offset,
1167 DBG_BUGON(pgnr >= be->nr_pages);
1172 if (!be->decompressed_pages[pgnr]) {
1177 src = kmap_local_page(be->decompressed_pages[pgnr]);
1189 static void z_erofs_parse_out_bvecs(struct z_erofs_backend *be)
1191 struct z_erofs_pcluster *pcl = be->pcl;
1203 z_erofs_put_shortlivedpage(be->pagepool, old_bvpage);
1206 z_erofs_do_decompressed_bvec(be, &bvec);
1211 z_erofs_put_shortlivedpage(be->pagepool, old_bvpage);
1214 static int z_erofs_parse_in_bvecs(struct z_erofs_backend *be, bool *overlapped)
1216 struct z_erofs_pcluster *pcl = be->pcl;
1225 /* compressed data ought to be valid when decompressing */
1231 be->compressed_pages[i] = page;
1234 erofs_folio_is_managed(EROFS_SB(be->sb), page_folio(page))) {
1243 z_erofs_do_decompressed_bvec(be, bvec);
1249 static int z_erofs_decompress_pcluster(struct z_erofs_backend *be, bool eio)
1251 struct erofs_sb_info *const sbi = EROFS_SB(be->sb);
1252 struct z_erofs_pcluster *pcl = be->pcl;
1263 be->nr_pages = PAGE_ALIGN(pcl->length + pcl->pageofs_out) >> PAGE_SHIFT;
1265 /* allocate (de)compressed page arrays if cannot be kept on stack */
1266 be->decompressed_pages = NULL;
1267 be->compressed_pages = NULL;
1268 be->onstack_used = 0;
1269 if (be->nr_pages <= Z_EROFS_ONSTACK_PAGES) {
1270 be->decompressed_pages = be->onstack_pages;
1271 be->onstack_used = be->nr_pages;
1272 memset(be->decompressed_pages, 0,
1273 sizeof(struct page *) * be->nr_pages);
1276 if (pclusterpages + be->onstack_used <= Z_EROFS_ONSTACK_PAGES)
1277 be->compressed_pages = be->onstack_pages + be->onstack_used;
1279 if (!be->decompressed_pages)
1280 be->decompressed_pages =
1281 kvzalloc_objs(struct page *, be->nr_pages,
1283 if (!be->compressed_pages)
1284 be->compressed_pages =
1288 z_erofs_parse_out_bvecs(be);
1289 err2 = z_erofs_parse_in_bvecs(be, &overlapped);
1294 .sb = be->sb,
1295 .in = be->compressed_pages,
1296 .out = be->decompressed_pages,
1298 .outpages = be->nr_pages,
1306 .fillgaps = be->keepxcpy,
1309 }, be->pagepool);
1312 erofs_err(be->sb, "failed to decompress (%s) %pe @ pa %llu size %u => %u",
1317 erofs_err(be->sb, "failed to decompress (%s) %s @ pa %llu size %u => %u",
1331 page = be->compressed_pages[i];
1338 (void)z_erofs_put_shortlivedpage(be->pagepool, page);
1342 if (be->compressed_pages < be->onstack_pages ||
1343 be->compressed_pages >= be->onstack_pages + Z_EROFS_ONSTACK_PAGES)
1344 kvfree(be->compressed_pages);
1347 z_erofs_fill_other_copies(be, err);
1348 for (i = 0; i < be->nr_pages; ++i) {
1349 page = be->decompressed_pages[i];
1359 erofs_pagepool_add(be->pagepool, page);
1362 for (j = 0; j < jtop && be->decompressed_pages[j] != page; ++j)
1365 be->decompressed_pages[jtop++] = page;
1368 erofs_pagepool_add(be->pagepool,
1369 be->decompressed_pages[--jtop]);
1370 if (be->decompressed_pages != be->onstack_pages)
1371 kvfree(be->decompressed_pages);
1379 /* pcluster lock MUST be taken before the following line */
1393 struct z_erofs_backend be = {
1397 LIST_HEAD_INIT(be.decompressed_secondary_bvecs),
1403 for (; be.pcl != Z_EROFS_PCLUSTER_TAIL; be.pcl = next) {
1404 DBG_BUGON(!be.pcl);
1405 next = READ_ONCE(be.pcl->next);
1406 err = z_erofs_decompress_pcluster(&be, io->eio) ?: err;
1494 /* Except for inplace folios, the entire folio can be used for I/Os */
1524 * therefore it is impossible for `mapping` to be NULL.
1553 DBG_BUGON(1); /* referenced managed folios can't be truncated */