• Gao Xiang's avatar
    erofs: support parsing big pcluster compact indexes · b86269f4
    Gao Xiang authored
    Different from non-compact indexes, several lclusters are packed
    as the compact form at once and an unique base blkaddr is stored for
    each pack, so each lcluster index would take less space on avarage
    (e.g. 2 bytes for COMPACT_2B.) btw, that is also why BIG_PCLUSTER
    switch should be consistent for compact head0/1.
    
    Prior to big pcluster, the size of all pclusters was 1 lcluster.
    Therefore, when a new HEAD lcluster was scanned, blkaddr would be
    bumped by 1 lcluster. However, that way doesn't work anymore for
    big pcluster since we actually don't know the compressed size of
    pclusters in advance (before reading CBLKCNT lcluster).
    
    So, instead, let blkaddr of each pack be the first pcluster blkaddr
    with a valid CBLKCNT, in detail,
    
     1) if CBLKCNT starts at the pack, this first valid pcluster is
        itself, e.g.
      _____________________________________________________________
     |_CBLKCNT0_|_NONHEAD_| .. |_HEAD_|_CBLKCNT1_| ... |_HEAD_| ...
     ^ = blkaddr base          ^ += CBLKCNT0           ^ += CBLKCNT1
    
     2) if CBLKCNT doesn't start at the pack, the first valid pcluster
        is the next pcluster, e.g.
      _________________________________________________________
     | NONHEAD_| .. |_HEAD_|_CBLKCNT0_| ... |_HEAD_|_HEAD_| ...
                    ^ = blkaddr base        ^ += CBLKCNT0
                                                   ^ += 1
    
    When a CBLKCNT is found, blkaddr will be increased by CBLKCNT
    lclusters, or a new HEAD is found immediately, bump blkaddr by 1
    instead (see the picture above.)
    
    Also noted if CBLKCNT is the end of the pack, instead of storing
    delta1 (distance of the next HEAD lcluster) as normal NONHEADs,
    it still uses the compressed block count (delta0) since delta1
    can be calculated indirectly but the block count can't.
    
    Adjust decoding logic to fit big pcluster compact indexes as well.
    
    Link: https://lore.kernel.org/r/20210407043927.10623-9-xiang@kernel.org
    
    Acked-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarGao Xiang <hsiangkao@redhat.com>
    b86269f4
zmap.c 14.8 KB