Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

erofs: clean up encoded map flags

- Remove EROFS_MAP_ENCODED since it was always set together with
EROFS_MAP_MAPPED for compressed extents and checked redundantly;

- Replace the EROFS_MAP_FULL_MAPPED flag with the opposite
EROFS_MAP_PARTIAL_MAPPED flag so that extents are implicitly
fully mapped initially to simplify the logic;

- Make fragment extents independent of EROFS_MAP_MAPPED since
they are not directly allocated on disk; thus fragment extents
are no longer twisted with mapped extents.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>

+33 -35
+11 -12
fs/erofs/internal.h
··· 360 360 readahead_gfp_mask(as) & ~__GFP_RECLAIM); 361 361 } 362 362 363 - /* Has a disk mapping */ 364 - #define EROFS_MAP_MAPPED 0x0001 363 + /* Allocated on disk at @m_pa (e.g. NOT a fragment extent) */ 364 + #define EROFS_MAP_MAPPED 0x0001 365 365 /* Located in metadata (could be copied from bd_inode) */ 366 - #define EROFS_MAP_META 0x0002 367 - /* The extent is encoded */ 368 - #define EROFS_MAP_ENCODED 0x0004 369 - /* The length of extent is full */ 370 - #define EROFS_MAP_FULL_MAPPED 0x0008 366 + #define EROFS_MAP_META 0x0002 367 + /* @m_llen may be truncated by the runtime compared to the on-disk record */ 368 + #define EROFS_MAP_PARTIAL_MAPPED 0x0004 369 + /* The on-disk @m_llen may cover only part of the encoded data */ 370 + #define EROFS_MAP_PARTIAL_REF 0x0008 371 371 /* Located in the special packed inode */ 372 - #define __EROFS_MAP_FRAGMENT 0x0010 373 - /* The extent refers to partial decompressed data */ 374 - #define EROFS_MAP_PARTIAL_REF 0x0020 375 - 376 - #define EROFS_MAP_FRAGMENT (EROFS_MAP_MAPPED | __EROFS_MAP_FRAGMENT) 372 + #define EROFS_MAP_FRAGMENT 0x0010 373 + /* The encoded on-disk data will be fully handled (decompressed) */ 374 + #define EROFS_MAP_FULL(f) (!((f) & (EROFS_MAP_PARTIAL_MAPPED | \ 375 + EROFS_MAP_PARTIAL_REF))) 377 376 378 377 struct erofs_map_blocks { 379 378 struct erofs_buf buf;
+9 -10
fs/erofs/zdata.c
··· 520 520 if (cachestrategy <= EROFS_ZIP_CACHE_DISABLED) 521 521 return false; 522 522 523 - if (!(fe->map.m_flags & EROFS_MAP_FULL_MAPPED)) 523 + if (fe->map.m_flags & EROFS_MAP_PARTIAL_MAPPED) 524 524 return true; 525 525 526 526 if (cachestrategy >= EROFS_ZIP_CACHE_READAROUND && ··· 1033 1033 /* bump split parts first to avoid several separate cases */ 1034 1034 ++split; 1035 1035 1036 - if (!(map->m_flags & EROFS_MAP_MAPPED)) { 1037 - folio_zero_segment(folio, cur, end); 1038 - tight = false; 1039 - } else if (map->m_flags & __EROFS_MAP_FRAGMENT) { 1036 + if (map->m_flags & EROFS_MAP_FRAGMENT) { 1040 1037 erofs_off_t fpos = offset + cur - map->m_la; 1041 1038 1042 1039 err = z_erofs_read_fragment(inode->i_sb, folio, cur, ··· 1041 1044 EROFS_I(inode)->z_fragmentoff + fpos); 1042 1045 if (err) 1043 1046 break; 1047 + tight = false; 1048 + } else if (!(map->m_flags & EROFS_MAP_MAPPED)) { 1049 + folio_zero_segment(folio, cur, end); 1044 1050 tight = false; 1045 1051 } else { 1046 1052 if (!f->pcl) { ··· 1080 1080 f->pcl->length = offset + end - map->m_la; 1081 1081 f->pcl->pageofs_out = map->m_la & ~PAGE_MASK; 1082 1082 } 1083 - if ((map->m_flags & EROFS_MAP_FULL_MAPPED) && 1084 - !(map->m_flags & EROFS_MAP_PARTIAL_REF) && 1083 + if (EROFS_MAP_FULL(map->m_flags) && 1085 1084 f->pcl->length == map->m_llen) 1086 1085 f->pcl->partial = false; 1087 1086 } 1088 1087 /* shorten the remaining extent to update progress */ 1089 1088 map->m_llen = offset + cur - map->m_la; 1090 - map->m_flags &= ~EROFS_MAP_FULL_MAPPED; 1089 + map->m_flags |= EROFS_MAP_PARTIAL_MAPPED; 1091 1090 if (cur <= pgs) { 1092 1091 split = cur < pgs; 1093 1092 tight = (bs == PAGE_SIZE); ··· 1840 1841 map->m_la = end; 1841 1842 err = z_erofs_map_blocks_iter(inode, map, 1842 1843 EROFS_GET_BLOCKS_READMORE); 1843 - if (err || !(map->m_flags & EROFS_MAP_ENCODED)) 1844 + if (err || !(map->m_flags & EROFS_MAP_MAPPED)) 1844 1845 return; 1845 1846 1846 1847 /* expand ra for the trailing edge if readahead */ ··· 1852 1853 end = round_up(end, PAGE_SIZE); 1853 1854 } else { 1854 1855 end = round_up(map->m_la, PAGE_SIZE); 1855 - if (!(map->m_flags & EROFS_MAP_ENCODED) || !map->m_llen) 1856 + if (!(map->m_flags & EROFS_MAP_MAPPED) || !map->m_llen) 1856 1857 return; 1857 1858 } 1858 1859
+10 -9
fs/erofs/zmap.c
··· 419 419 420 420 if ((flags & EROFS_GET_BLOCKS_FINDTAIL) && ztailpacking) 421 421 vi->z_fragmentoff = m.nextpackoff; 422 - map->m_flags = EROFS_MAP_MAPPED | EROFS_MAP_ENCODED; 422 + map->m_flags = EROFS_MAP_MAPPED | EROFS_MAP_PARTIAL_MAPPED; 423 423 end = (m.lcn + 1ULL) << lclusterbits; 424 424 425 425 if (m.type != Z_EROFS_LCLUSTER_TYPE_NONHEAD && endoff >= m.clusterofs) { ··· 435 435 } else { 436 436 if (m.type != Z_EROFS_LCLUSTER_TYPE_NONHEAD) { 437 437 end = (m.lcn << lclusterbits) | m.clusterofs; 438 - map->m_flags |= EROFS_MAP_FULL_MAPPED; 438 + map->m_flags &= ~EROFS_MAP_PARTIAL_MAPPED; 439 439 m.delta[0] = 1; 440 440 } 441 441 /* get the corresponding first chunk */ ··· 496 496 map->m_llen >= i_blocksize(inode))) { 497 497 err = z_erofs_get_extent_decompressedlen(&m); 498 498 if (!err) 499 - map->m_flags |= EROFS_MAP_FULL_MAPPED; 499 + map->m_flags &= ~EROFS_MAP_PARTIAL_MAPPED; 500 500 } 501 501 502 502 unmap_out: ··· 594 594 if (recsz > offsetof(struct z_erofs_extent, pstart_lo)) 595 595 vi->z_fragmentoff |= map->m_pa << 32; 596 596 } else if (map->m_plen & Z_EROFS_EXTENT_PLEN_MASK) { 597 - map->m_flags |= EROFS_MAP_MAPPED | 598 - EROFS_MAP_FULL_MAPPED | EROFS_MAP_ENCODED; 597 + map->m_flags |= EROFS_MAP_MAPPED; 599 598 fmt = map->m_plen >> Z_EROFS_EXTENT_PLEN_FMT_BIT; 600 599 if (map->m_plen & Z_EROFS_EXTENT_PLEN_PARTIAL) 601 600 map->m_flags |= EROFS_MAP_PARTIAL_REF; ··· 713 714 struct erofs_sb_info *sbi = EROFS_I_SB(inode); 714 715 u64 pend; 715 716 716 - if (!(map->m_flags & EROFS_MAP_ENCODED)) 717 + if (!(map->m_flags & EROFS_MAP_MAPPED)) 717 718 return 0; 718 719 if (unlikely(map->m_algorithmformat >= Z_EROFS_COMPRESSION_RUNTIME_MAX)) { 719 720 erofs_err(inode->i_sb, "unknown algorithm %d @ pos %llu for nid %llu, please upgrade kernel", ··· 780 781 iomap->bdev = inode->i_sb->s_bdev; 781 782 iomap->offset = map.m_la; 782 783 iomap->length = map.m_llen; 783 - if (map.m_flags & EROFS_MAP_MAPPED) { 784 + if (map.m_flags & EROFS_MAP_FRAGMENT) { 784 785 iomap->type = IOMAP_MAPPED; 785 - iomap->addr = map.m_flags & __EROFS_MAP_FRAGMENT ? 786 - IOMAP_NULL_ADDR : map.m_pa; 786 + iomap->addr = IOMAP_NULL_ADDR; 787 + } else if (map.m_flags & EROFS_MAP_MAPPED) { 788 + iomap->type = IOMAP_MAPPED; 789 + iomap->addr = map.m_pa; 787 790 } else { 788 791 iomap->type = IOMAP_HOLE; 789 792 iomap->addr = IOMAP_NULL_ADDR;
+3 -4
include/trace/events/erofs.h
··· 26 26 #define show_mflags(flags) __print_flags(flags, "", \ 27 27 { EROFS_MAP_MAPPED, "M" }, \ 28 28 { EROFS_MAP_META, "I" }, \ 29 - { EROFS_MAP_ENCODED, "E" }, \ 30 - { EROFS_MAP_FULL_MAPPED, "F" }, \ 31 - { EROFS_MAP_FRAGMENT, "R" }, \ 32 - { EROFS_MAP_PARTIAL_REF, "P" }) 29 + { EROFS_MAP_PARTIAL_MAPPED, "T" }, \ 30 + { EROFS_MAP_PARTIAL_REF, "P" }, \ 31 + { EROFS_MAP_FRAGMENT, "R" }) 33 32 34 33 TRACE_EVENT(erofs_lookup, 35 34