All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.