* [PATCH] erofs-utils: mkfs: add block list support for chunked files
@ 2021-11-11 5:30 David Anderson via Linux-erofs
2021-11-11 6:17 ` Gao Xiang
0 siblings, 1 reply; 5+ messages in thread
From: David Anderson via Linux-erofs @ 2021-11-11 5:30 UTC (permalink / raw)
To: linux-erofs
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 <dvander@google.com>
---
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
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] erofs-utils: mkfs: add block list support for chunked files
2021-11-11 5:30 [PATCH] erofs-utils: mkfs: add block list support for chunked files David Anderson via Linux-erofs
@ 2021-11-11 6:17 ` Gao Xiang
2021-11-11 9:20 ` Yue Hu
2021-11-12 6:10 ` Huang Jianan via Linux-erofs
0 siblings, 2 replies; 5+ messages in thread
From: Gao Xiang @ 2021-11-11 6:17 UTC (permalink / raw)
To: David Anderson, Huang Jianan, Yue Hu; +Cc: linux-erofs
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 <dvander@google.com>
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] erofs-utils: mkfs: add block list support for chunked files
2021-11-11 6:17 ` Gao Xiang
@ 2021-11-11 9:20 ` Yue Hu
2021-11-12 6:10 ` Huang Jianan via Linux-erofs
1 sibling, 0 replies; 5+ messages in thread
From: Yue Hu @ 2021-11-11 9:20 UTC (permalink / raw)
To: Gao Xiang; +Cc: linux-erofs
Hi Xiang,
On Thu, 11 Nov 2021 14:17:06 +0800
Gao Xiang <hsiangkao@linux.alibaba.com> wrote:
> 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 <dvander@google.com>
>
> 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!
This patch has no impact for block mapping without --chunksize in build.
Tested-by: Yue Hu <huyue2@yulong.com>
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] erofs-utils: mkfs: add block list support for chunked files
2021-11-11 6:17 ` Gao Xiang
2021-11-11 9:20 ` Yue Hu
@ 2021-11-12 6:10 ` Huang Jianan via Linux-erofs
2021-11-12 6:32 ` Gao Xiang
1 sibling, 1 reply; 5+ messages in thread
From: Huang Jianan via Linux-erofs @ 2021-11-12 6:10 UTC (permalink / raw)
To: Gao Xiang, David Anderson, Yue Hu; +Cc: linux-erofs
在 2021/11/11 14:17, Gao Xiang 写道:
> 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 <dvander@google.com>
> 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!
No impact on our build.
Tested-by: Huang Jianan <huangjianan@oppo.com>
Thanks,
Jianan
> 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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] erofs-utils: mkfs: add block list support for chunked files
2021-11-12 6:10 ` Huang Jianan via Linux-erofs
@ 2021-11-12 6:32 ` Gao Xiang
0 siblings, 0 replies; 5+ messages in thread
From: Gao Xiang @ 2021-11-12 6:32 UTC (permalink / raw)
To: Huang Jianan, Yue Hu; +Cc: linux-erofs
On Fri, Nov 12, 2021 at 02:10:19PM +0800, Huang Jianan via Linux-erofs wrote:
> 在 2021/11/11 14:17, Gao Xiang 写道:
> > 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 <dvander@google.com>
> > 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!
> No impact on our build.
> Tested-by: Huang Jianan <huangjianan@oppo.com>
Thanks all for the confirmation! I'll apply this this evening.
Thanks,
Gao Xiang
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-11-12 6:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-11 5:30 [PATCH] erofs-utils: mkfs: add block list support for chunked files David Anderson via Linux-erofs
2021-11-11 6:17 ` Gao Xiang
2021-11-11 9:20 ` Yue Hu
2021-11-12 6:10 ` Huang Jianan via Linux-erofs
2021-11-12 6:32 ` Gao Xiang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.