Hi David,

On Thu, Nov 11, 2021 at 05:30:31AM +0000, David Anderson via Linux-erofs wrote:
> When using the --block-list-file option, add block mapping lines for
> chunked files. The extent printing code has been slightly refactored to
> accommodate multiple extent ranges.
> 
> Signed-off-by: David Anderson <[email protected]>

Thanks for the patch. Currently. I don't have Android environment at hand.

Hi Yue and Jianan,
Could you help check this patch in your environments as well and add
"Tested-by:" tags on this? Many thanks!

Thanks,
Gao Xiang

> ---
>  include/erofs/block_list.h |  7 +++++++
>  lib/blobchunk.c            | 27 ++++++++++++++++++++++++-
>  lib/block_list.c           | 41 +++++++++++++++++++++++++++++---------
>  3 files changed, 65 insertions(+), 10 deletions(-)
> 
> diff --git a/include/erofs/block_list.h b/include/erofs/block_list.h
> index dcc0e50..40df228 100644
> --- a/include/erofs/block_list.h
> +++ b/include/erofs/block_list.h
> @@ -15,11 +15,18 @@ void erofs_droid_blocklist_write(struct erofs_inode 
> *inode,
>                                erofs_blk_t blk_start, erofs_blk_t nblocks);
>  void erofs_droid_blocklist_write_tail_end(struct erofs_inode *inode,
>                                         erofs_blk_t blkaddr);
> +void erofs_droid_blocklist_write_extent(struct erofs_inode *inode,
> +                                     erofs_blk_t blk_start, erofs_blk_t 
> nblocks,
> +                                     bool first_extent, bool last_extent);
>  #else
>  static inline void erofs_droid_blocklist_write(struct erofs_inode *inode,
>                                erofs_blk_t blk_start, erofs_blk_t nblocks) {}
>  static inline void
>  erofs_droid_blocklist_write_tail_end(struct erofs_inode *inode,
>                                         erofs_blk_t blkaddr) {}
> +static inline void
> +erofs_droid_blocklist_write_extent(struct erofs_inode *inode,
> +                                erofs_blk_t blk_start, erofs_blk_t nblocks,
> +                                bool first_extent, bool last_extent) {}
>  #endif
>  #endif
> diff --git a/lib/blobchunk.c b/lib/blobchunk.c
> index 661c5d0..a2e62be 100644
> --- a/lib/blobchunk.c
> +++ b/lib/blobchunk.c
> @@ -7,6 +7,7 @@
>  #define _GNU_SOURCE
>  #include "erofs/hashmap.h"
>  #include "erofs/blobchunk.h"
> +#include "erofs/block_list.h"
>  #include "erofs/cache.h"
>  #include "erofs/io.h"
>  #include <unistd.h>
> @@ -101,7 +102,10 @@ int erofs_blob_write_chunk_indexes(struct erofs_inode 
> *inode,
>                                  erofs_off_t off)
>  {
>       struct erofs_inode_chunk_index idx = {0};
> -     unsigned int dst, src, unit;
> +     erofs_blk_t extent_start = EROFS_NULL_ADDR;
> +     erofs_blk_t extent_end = EROFS_NULL_ADDR;
> +     unsigned int dst, src, unit, num_extents;
> +     bool first_extent = true;
>  
>       if (inode->u.chunkformat & EROFS_CHUNK_FORMAT_INDEXES)
>               unit = sizeof(struct erofs_inode_chunk_index);
> @@ -115,6 +119,20 @@ int erofs_blob_write_chunk_indexes(struct erofs_inode 
> *inode,
>               chunk = *(void **)(inode->chunkindexes + src);
>  
>               idx.blkaddr = chunk->blkaddr + remapped_base;
> +             if (extent_start != EROFS_NULL_ADDR &&
> +                 idx.blkaddr == extent_end + 1) {
> +                     extent_end = idx.blkaddr;
> +             } else {
> +                     if (extent_start != EROFS_NULL_ADDR) {
> +                             erofs_droid_blocklist_write_extent(inode,
> +                                     extent_start,
> +                                     (extent_end - extent_start) + 1,
> +                                     first_extent, false);
> +                             first_extent = false;
> +                     }
> +                     extent_start = idx.blkaddr;
> +                     extent_end = idx.blkaddr;
> +             }
>               if (unit == EROFS_BLOCK_MAP_ENTRY_SIZE)
>                       memcpy(inode->chunkindexes + dst, &idx.blkaddr, unit);
>               else
> @@ -122,6 +140,13 @@ int erofs_blob_write_chunk_indexes(struct erofs_inode 
> *inode,
>       }
>       off = roundup(off, unit);
>  
> +     if (extent_start == EROFS_NULL_ADDR)
> +             num_extents = 0;
> +     else
> +             num_extents = (extent_end - extent_start) + 1;
> +     erofs_droid_blocklist_write_extent(inode, extent_start, num_extents,
> +             first_extent, true);
> +
>       return dev_write(inode->chunkindexes, off, inode->extent_isize);
>  }
>  
> diff --git a/lib/block_list.c b/lib/block_list.c
> index 096dc9b..87609a9 100644
> --- a/lib/block_list.c
> +++ b/lib/block_list.c
> @@ -32,25 +32,48 @@ void erofs_droid_blocklist_fclose(void)
>  }
>  
>  static void blocklist_write(const char *path, erofs_blk_t blk_start,
> -                         erofs_blk_t nblocks, bool has_tail)
> +                         erofs_blk_t nblocks, bool first_extent,
> +                         bool last_extent)
>  {
>       const char *fspath = erofs_fspath(path);
>  
> -     fprintf(block_list_fp, "/%s", cfg.mount_point);
> +     if (first_extent) {
> +             fprintf(block_list_fp, "/%s", cfg.mount_point);
>  
> -     if (fspath[0] != '/')
> -             fprintf(block_list_fp, "/");
> +             if (fspath[0] != '/')
> +                     fprintf(block_list_fp, "/");
> +
> +             fprintf(block_list_fp, "%s", fspath);
> +     }
>  
>       if (nblocks == 1)
> -             fprintf(block_list_fp, "%s %u", fspath, blk_start);
> +             fprintf(block_list_fp, " %u", blk_start);
>       else
> -             fprintf(block_list_fp, "%s %u-%u", fspath, blk_start,
> +             fprintf(block_list_fp, " %u-%u", blk_start,
>                       blk_start + nblocks - 1);
>  
> -     if (!has_tail)
> +     if (last_extent)
>               fprintf(block_list_fp, "\n");
>  }
>  
> +void erofs_droid_blocklist_write_extent(struct erofs_inode *inode,
> +                                     erofs_blk_t blk_start,
> +                                     erofs_blk_t nblocks, bool first_extent,
> +                                     bool last_extent)
> +{
> +     if (!block_list_fp || !cfg.mount_point)
> +             return;
> +
> +     if (!nblocks) {
> +             if (last_extent)
> +                     fprintf(block_list_fp, "\n");
> +             return;
> +     }
> +
> +     blocklist_write(inode->i_srcpath, blk_start, nblocks, first_extent,
> +                     last_extent);
> +}
> +
>  void erofs_droid_blocklist_write(struct erofs_inode *inode,
>                                erofs_blk_t blk_start, erofs_blk_t nblocks)
>  {
> @@ -58,7 +81,7 @@ void erofs_droid_blocklist_write(struct erofs_inode *inode,
>               return;
>  
>       blocklist_write(inode->i_srcpath, blk_start, nblocks,
> -                     !!inode->idata_size);
> +                     true, !inode->idata_size);
>  }
>  
>  void erofs_droid_blocklist_write_tail_end(struct erofs_inode *inode,
> @@ -80,6 +103,6 @@ void erofs_droid_blocklist_write_tail_end(struct 
> erofs_inode *inode,
>               return;
>       }
>       if (blkaddr != NULL_ADDR)
> -             blocklist_write(inode->i_srcpath, blkaddr, 1, false);
> +             blocklist_write(inode->i_srcpath, blkaddr, 1, true, true);
>  }
>  #endif
> -- 
> 2.34.0.rc0.344.g81b53c2807-goog

Reply via email to