[PATCH v2 4/5] erofs-utils: dump: add support for showing file extents.

Gao Xiang hsiangkao at linux.alibaba.com
Thu Oct 28 22:27:05 AEDT 2021


On Thu, Oct 28, 2021 at 06:57:47PM +0800, Guo Xuenan wrote:
> Add option -e to show file extents info, this option needs
> specify nid as well. (eg. dump.erofs --nid # -e erofs.img)
> 
> Signed-off-by: Guo Xuenan <guoxuenan at huawei.com>
> Signed-off-by: Wang Qi <mpiglet at outlook.com>
> ---
>  dump/main.c              | 77 ++++++++++++++++++++++++++++++++++------
>  include/erofs/internal.h |  2 ++
>  lib/data.c               |  4 +--
>  3 files changed, 71 insertions(+), 12 deletions(-)
> 
> diff --git a/dump/main.c b/dump/main.c
> index d1aa017..58ecf93 100644
> --- a/dump/main.c
> +++ b/dump/main.c
> @@ -18,6 +18,7 @@
>  struct erofsdump_cfg {
>  	unsigned int totalshow;
>  	bool show_inode;
> +	bool show_extent;
>  	bool show_superblock;
>  	bool show_statistics;
>  	erofs_nid_t nid;
> @@ -94,6 +95,7 @@ static void usage(void)
>  	fputs("usage: [options] IMAGE\n\n"
>  	      "Dump erofs layout from IMAGE, and [options] are:\n"
>  	      " -V      print the version number of dump.erofs and exit.\n"
> +	      " -e      show extent info (require --nid #)\n"

	      " -e      show extent info (require --nid set)\n"

>  	      " -s      show information about superblock\n"
>  	      " -S      show statistic information of the image\n"
>  	      " --nid=# show the target inode info of nid #\n"
> @@ -110,9 +112,13 @@ static int erofsdump_parse_options_cfg(int argc, char **argv)
>  {
>  	int opt;
>  
> -	while ((opt = getopt_long(argc, argv, "SV:s",
> +	while ((opt = getopt_long(argc, argv, "SVes",
>  				  long_options, NULL)) != -1) {
>  		switch (opt) {
> +		case 'e':
> +			dumpcfg.show_extent = true;
> +			++dumpcfg.totalshow;
> +			break;
>  		case 's':
>  			dumpcfg.show_superblock = true;
>  			++dumpcfg.totalshow;
> @@ -407,7 +413,28 @@ static int erofs_get_pathname(erofs_nid_t nid, erofs_nid_t parent_nid,
>  	return -1;
>  }
>  
> -static void erofsdump_show_fileinfo(void)
> +static int erofsdump_map_blocks_helper(struct erofs_inode *inode,
> +		struct erofs_map_blocks *map, int flags)
> +{
> +	int err = 0;
> +

Let's add a generic entry in lib/zmap.c:

int erofs_map_blocks(struct inode *inode,
		     struct erofs_map_blocks *map, int flags)
{
	if (erofs_inode_is_data_compressed(EROFS_I(inode)->datalayout))
		return z_erofs_map_blocks_iter(inode, map, flags);
	return erofs_map_blocks_flatmode(inode, map, flags);
}

> +	switch (inode->datalayout) {
> +	case EROFS_INODE_FLAT_PLAIN:
> +	case EROFS_INODE_FLAT_INLINE:
> +	case EROFS_INODE_CHUNK_BASED:
> +		err = erofs_map_blocks(inode, map, flags);
> +		break;
> +	case EROFS_INODE_FLAT_COMPRESSION_LEGACY:
> +	case EROFS_INODE_FLAT_COMPRESSION:
> +		err = z_erofs_map_blocks_iter(inode, map, flags);
> +		break;
> +	default:

		err = -EOPNOTSUPP;

> +		break;
> +	}
> +	return err;
> +}
> +
> +static void erofsdump_show_fileinfo(bool show_extent)
>  {
>  	int err;
>  	erofs_off_t size;
> @@ -418,6 +445,11 @@ static void erofsdump_show_fileinfo(void)
>  	char path[PATH_MAX + 1] = {0};
>  	char access_mode_str[] = "rwxrwxrwx";
>  	char timebuf[128] = {0};
> +	unsigned int extent_count = 0;
> +	struct erofs_map_blocks map = {
> +		.index = UINT_MAX,
> +		.m_la = 0,
> +	};
>  
>  	err = erofs_read_inode_from_disk(&inode);
>  	if (err) {
> @@ -437,6 +469,14 @@ static void erofsdump_show_fileinfo(void)
>  		return;
>  	}
>  
> +	t = inode.i_ctime;
> +	strftime(timebuf, sizeof(timebuf),
> +			"%Y-%m-%d %H:%M:%S", localtime(&t));
> +	access_mode = inode.i_mode & 0777;
> +	for (int i = 8; i >= 0; i--) {
> +		if (((access_mode >> i) & 1) == 0)
> +			access_mode_str[8 - i] = '-';
> +	}

Why we need to move this part?

Thanks,
Gao Xiang



More information about the Linux-erofs mailing list