[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