Lines Matching +full:0 +full:m
23 static int z_erofs_load_full_lcluster(struct z_erofs_maprecorder *m, in z_erofs_load_full_lcluster() argument
26 struct inode *const inode = m->inode; in z_erofs_load_full_lcluster()
34 di = erofs_read_metabuf(&m->map->buf, inode->i_sb, pos, EROFS_KMAP); in z_erofs_load_full_lcluster()
37 m->lcn = lcn; in z_erofs_load_full_lcluster()
38 m->nextpackoff = pos + sizeof(struct z_erofs_lcluster_index); in z_erofs_load_full_lcluster()
41 m->type = advise & Z_EROFS_LI_LCLUSTER_TYPE_MASK; in z_erofs_load_full_lcluster()
42 if (m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) { in z_erofs_load_full_lcluster()
43 m->clusterofs = 1 << vi->z_logical_clusterbits; in z_erofs_load_full_lcluster()
44 m->delta[0] = le16_to_cpu(di->di_u.delta[0]); in z_erofs_load_full_lcluster()
45 if (m->delta[0] & Z_EROFS_LI_D0_CBLKCNT) { in z_erofs_load_full_lcluster()
51 m->compressedblks = m->delta[0] & ~Z_EROFS_LI_D0_CBLKCNT; in z_erofs_load_full_lcluster()
52 m->delta[0] = 1; in z_erofs_load_full_lcluster()
54 m->delta[1] = le16_to_cpu(di->di_u.delta[1]); in z_erofs_load_full_lcluster()
56 m->partialref = !!(advise & Z_EROFS_LI_PARTIAL_REF); in z_erofs_load_full_lcluster()
57 m->clusterofs = le16_to_cpu(di->di_clusterofs); in z_erofs_load_full_lcluster()
58 if (m->clusterofs >= 1 << vi->z_logical_clusterbits) { in z_erofs_load_full_lcluster()
62 m->pblk = le32_to_cpu(di->di_u.blkaddr); in z_erofs_load_full_lcluster()
64 return 0; in z_erofs_load_full_lcluster()
81 unsigned int lo, d1 = 0; in get_compacted_la_distance()
100 static int z_erofs_load_compact_lcluster(struct z_erofs_maprecorder *m, in z_erofs_load_compact_lcluster() argument
103 struct inode *const inode = m->inode; in z_erofs_load_compact_lcluster()
119 m->lcn = lcn; in z_erofs_load_compact_lcluster()
122 compacted_2b = 0; in z_erofs_load_compact_lcluster()
149 in = erofs_read_metabuf(&m->map->buf, m->inode->i_sb, pos, EROFS_KMAP); in z_erofs_load_compact_lcluster()
154 m->nextpackoff = round_down(pos, vcnt << amortizedshift) + in z_erofs_load_compact_lcluster()
163 m->type = type; in z_erofs_load_compact_lcluster()
165 m->clusterofs = 1 << lclusterbits; in z_erofs_load_compact_lcluster()
169 m->delta[1] = get_compacted_la_distance(lobits, in z_erofs_load_compact_lcluster()
176 m->compressedblks = lo & ~Z_EROFS_LI_D0_CBLKCNT; in z_erofs_load_compact_lcluster()
177 m->delta[0] = 1; in z_erofs_load_compact_lcluster()
178 return 0; in z_erofs_load_compact_lcluster()
180 m->delta[0] = lo; in z_erofs_load_compact_lcluster()
181 return 0; in z_erofs_load_compact_lcluster()
185 * of which lo saves delta[1] rather than delta[0]. in z_erofs_load_compact_lcluster()
186 * Hence, get delta[0] by the previous lcluster indirectly. in z_erofs_load_compact_lcluster()
191 lo = 0; in z_erofs_load_compact_lcluster()
194 m->delta[0] = lo + 1; in z_erofs_load_compact_lcluster()
195 return 0; in z_erofs_load_compact_lcluster()
197 m->clusterofs = lo; in z_erofs_load_compact_lcluster()
198 m->delta[0] = 0; in z_erofs_load_compact_lcluster()
202 while (i > 0) { in z_erofs_load_compact_lcluster()
209 if (i >= 0) in z_erofs_load_compact_lcluster()
213 nblk = 0; in z_erofs_load_compact_lcluster()
214 while (i > 0) { in z_erofs_load_compact_lcluster()
236 m->pblk = le32_to_cpu(*(__le32 *)in) + nblk; in z_erofs_load_compact_lcluster()
237 return 0; in z_erofs_load_compact_lcluster()
240 static int z_erofs_load_lcluster_from_disk(struct z_erofs_maprecorder *m, in z_erofs_load_lcluster_from_disk() argument
243 switch (EROFS_I(m->inode)->datalayout) { in z_erofs_load_lcluster_from_disk()
245 return z_erofs_load_full_lcluster(m, lcn); in z_erofs_load_lcluster_from_disk()
247 return z_erofs_load_compact_lcluster(m, lcn, lookahead); in z_erofs_load_lcluster_from_disk()
253 static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m, in z_erofs_extent_lookback() argument
256 struct super_block *sb = m->inode->i_sb; in z_erofs_extent_lookback()
257 struct erofs_inode *const vi = EROFS_I(m->inode); in z_erofs_extent_lookback()
260 while (m->lcn >= lookback_distance) { in z_erofs_extent_lookback()
261 unsigned long lcn = m->lcn - lookback_distance; in z_erofs_extent_lookback()
264 err = z_erofs_load_lcluster_from_disk(m, lcn, false); in z_erofs_extent_lookback()
268 switch (m->type) { in z_erofs_extent_lookback()
270 lookback_distance = m->delta[0]; in z_erofs_extent_lookback()
277 m->headtype = m->type; in z_erofs_extent_lookback()
278 m->map->m_la = (lcn << lclusterbits) | m->clusterofs; in z_erofs_extent_lookback()
279 return 0; in z_erofs_extent_lookback()
282 m->type, lcn, vi->nid); in z_erofs_extent_lookback()
289 lookback_distance, m->lcn, vi->nid); in z_erofs_extent_lookback()
294 static int z_erofs_get_extent_compressedlen(struct z_erofs_maprecorder *m, in z_erofs_get_extent_compressedlen() argument
297 struct inode *inode = m->inode; in z_erofs_get_extent_compressedlen()
302 unsigned long lcn = m->lcn + 1; in z_erofs_get_extent_compressedlen()
305 DBG_BUGON(m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD); in z_erofs_get_extent_compressedlen()
306 DBG_BUGON(m->type != m->headtype); in z_erofs_get_extent_compressedlen()
308 if ((m->headtype == Z_EROFS_LCLUSTER_TYPE_HEAD1 && !bigpcl1) || in z_erofs_get_extent_compressedlen()
309 ((m->headtype == Z_EROFS_LCLUSTER_TYPE_PLAIN || in z_erofs_get_extent_compressedlen()
310 m->headtype == Z_EROFS_LCLUSTER_TYPE_HEAD2) && !bigpcl2) || in z_erofs_get_extent_compressedlen()
312 m->compressedblks = 1; in z_erofs_get_extent_compressedlen()
314 if (m->compressedblks) in z_erofs_get_extent_compressedlen()
317 err = z_erofs_load_lcluster_from_disk(m, lcn, false); in z_erofs_get_extent_compressedlen()
330 m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD); in z_erofs_get_extent_compressedlen()
332 switch (m->type) { in z_erofs_get_extent_compressedlen()
340 m->compressedblks = 1; in z_erofs_get_extent_compressedlen()
343 if (m->delta[0] != 1) in z_erofs_get_extent_compressedlen()
345 if (m->compressedblks) in z_erofs_get_extent_compressedlen()
355 m->map->m_plen = erofs_pos(sb, m->compressedblks); in z_erofs_get_extent_compressedlen()
356 return 0; in z_erofs_get_extent_compressedlen()
363 static int z_erofs_get_extent_decompressedlen(struct z_erofs_maprecorder *m) in z_erofs_get_extent_decompressedlen() argument
365 struct inode *inode = m->inode; in z_erofs_get_extent_decompressedlen()
367 struct erofs_map_blocks *map = m->map; in z_erofs_get_extent_decompressedlen()
369 u64 lcn = m->lcn, headlcn = map->m_la >> lclusterbits; in z_erofs_get_extent_decompressedlen()
376 return 0; in z_erofs_get_extent_decompressedlen()
379 err = z_erofs_load_lcluster_from_disk(m, lcn, true); in z_erofs_get_extent_decompressedlen()
383 if (m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD) { in z_erofs_get_extent_decompressedlen()
385 if (unlikely(!m->delta[1])) { in z_erofs_get_extent_decompressedlen()
386 m->delta[1] = 1; in z_erofs_get_extent_decompressedlen()
389 } else if (m->type == Z_EROFS_LCLUSTER_TYPE_PLAIN || in z_erofs_get_extent_decompressedlen()
390 m->type == Z_EROFS_LCLUSTER_TYPE_HEAD1 || in z_erofs_get_extent_decompressedlen()
391 m->type == Z_EROFS_LCLUSTER_TYPE_HEAD2) { in z_erofs_get_extent_decompressedlen()
394 m->delta[1] = 1; in z_erofs_get_extent_decompressedlen()
397 m->type, lcn, vi->nid); in z_erofs_get_extent_decompressedlen()
401 lcn += m->delta[1]; in z_erofs_get_extent_decompressedlen()
403 map->m_llen = (lcn << lclusterbits) + m->clusterofs - map->m_la; in z_erofs_get_extent_decompressedlen()
404 return 0; in z_erofs_get_extent_decompressedlen()
413 struct z_erofs_maprecorder m = { in z_erofs_do_map_blocks() local
417 int err = 0; in z_erofs_do_map_blocks()
427 err = z_erofs_load_lcluster_from_disk(&m, initial_lcn, false); in z_erofs_do_map_blocks()
432 vi->z_idataoff = m.nextpackoff; in z_erofs_do_map_blocks()
435 end = (m.lcn + 1ULL) << lclusterbits; in z_erofs_do_map_blocks()
437 switch (m.type) { in z_erofs_do_map_blocks()
441 if (endoff >= m.clusterofs) { in z_erofs_do_map_blocks()
442 m.headtype = m.type; in z_erofs_do_map_blocks()
443 map->m_la = (m.lcn << lclusterbits) | m.clusterofs; in z_erofs_do_map_blocks()
453 /* m.lcn should be >= 1 if endoff < m.clusterofs */ in z_erofs_do_map_blocks()
454 if (!m.lcn) { in z_erofs_do_map_blocks()
456 "invalid logical cluster 0 at nid %llu", in z_erofs_do_map_blocks()
461 end = (m.lcn << lclusterbits) | m.clusterofs; in z_erofs_do_map_blocks()
463 m.delta[0] = 1; in z_erofs_do_map_blocks()
467 err = z_erofs_extent_lookback(&m, m.delta[0]); in z_erofs_do_map_blocks()
474 m.type, ofs, vi->nid); in z_erofs_do_map_blocks()
478 if (m.partialref) in z_erofs_do_map_blocks()
483 vi->z_tailextent_headlcn = m.lcn; in z_erofs_do_map_blocks()
486 vi->z_fragmentoff |= (u64)m.pblk << 32; in z_erofs_do_map_blocks()
488 if (ztailpacking && m.lcn == vi->z_tailextent_headlcn) { in z_erofs_do_map_blocks()
492 } else if (fragment && m.lcn == vi->z_tailextent_headlcn) { in z_erofs_do_map_blocks()
495 map->m_pa = erofs_pos(inode->i_sb, m.pblk); in z_erofs_do_map_blocks()
496 err = z_erofs_get_extent_compressedlen(&m, initial_lcn); in z_erofs_do_map_blocks()
501 if (m.headtype == Z_EROFS_LCLUSTER_TYPE_PLAIN) { in z_erofs_do_map_blocks()
511 afmt = m.headtype == Z_EROFS_LCLUSTER_TYPE_HEAD2 ? in z_erofs_do_map_blocks()
512 vi->z_algorithmtype[1] : vi->z_algorithmtype[0]; in z_erofs_do_map_blocks()
528 err = z_erofs_get_extent_decompressedlen(&m); in z_erofs_do_map_blocks()
534 erofs_unmap_metabuf(&m.map->buf); in z_erofs_do_map_blocks()
553 return 0; in z_erofs_fill_inode_lazy()
559 err = 0; in z_erofs_fill_inode_lazy()
577 vi->z_tailextent_headlcn = 0; in z_erofs_fill_inode_lazy()
581 vi->z_algorithmtype[0] = h->h_algorithmtype & 15; in z_erofs_fill_inode_lazy()
584 headnr = 0; in z_erofs_fill_inode_lazy()
585 if (vi->z_algorithmtype[0] >= Z_EROFS_COMPRESSION_MAX || in z_erofs_fill_inode_lazy()
627 if (err < 0) in z_erofs_fill_inode_lazy()
641 if (err < 0) in z_erofs_fill_inode_lazy()
659 int err = 0; in z_erofs_map_blocks_iter()
665 map->m_flags = 0; in z_erofs_map_blocks_iter()
671 map->m_la = 0; in z_erofs_map_blocks_iter()
684 map->m_llen = 0; in z_erofs_map_blocks_iter()
699 if (ret < 0) in z_erofs_iomap_begin_report()
724 iomap->flags = 0; in z_erofs_iomap_begin_report()
725 return 0; in z_erofs_iomap_begin_report()